3

xpathの一部としてxmlルートを含めると、結果が得られないのはなぜですか。

XElementで単純なxpathを使用してい"/rdf:RDF/channel"ます(以下を参照)

すべての名前空間をに追加していますが、結果XmlNamespaceManagerが得られません。はすでにルートにあるため、で始まるパスが必要です。xpathNavigator/channel

コード:

        const string rdfFile = @"C:\index.rdf";
        var text = File.ReadAllText(rdfFile);
        XmlReader reader = XmlReader.Create(new StringReader(text));
        XElement doc = XElement.Load(reader);
        XmlNameTable nameTable = reader.NameTable;
        XmlNameTable table = nameTable ?? new NameTable();
        var manager = new XmlNamespaceManager(table);

        manager.AddNamespace(RDFNamespaceName, RDFNamespace);
        manager.AddNamespace(RDFNamespaceName2, RDFNamespace2);
        manager.AddNamespace(RDFNamespaceName3, RDFNamespace3);
        manager.AddNamespace(RDFNamespaceName4, RDFNamespace4);
        manager.AddNamespace(RDFNamespaceName5, RDFNamespace5);
        manager.AddNamespace(RDFNamespaceName6, RDFNamespace6);
        manager.AddNamespace(RDFNamespaceName7, RDFNamespace7);

    var res = doc.XPathSelectElements(RDFXpath, manager);

    private const string RDFXpath = "/rdf:RDF/channel";


    private const string RDFNamespaceName = "rdf";

    private const string RDFNamespace = @"http://www.w3.org/1999/02/22-rdf-syntax-ns#";

    private const string RDFNamespaceName2 = "";

    private const string RDFNamespace2 = @"http://purl.org/rss/1.0/";

    private const string RDFNamespaceName3 = "cc";

    private const string RDFNamespace3 = @"http://web.resource.org/cc/";

    private const string RDFNamespaceName4 = "content";

    private const string RDFNamespace4 = @"http://purl.org/rss/1.0/modules/content/";

    private const string RDFNamespaceName5 = "admin";

    private const string RDFNamespace5 = @"http://webns.net/mvcb/";

    private const string RDFNamespaceName6 = "sy";

    private const string RDFNamespace6 = @"http://purl.org/rss/1.0/modules/syndication/";

    private const string RDFNamespaceName7 = "dc";

    private const string RDFNamespace7 = @"http://purl.org/dc/elements/1.1/";

xmlの一部:

  <?xml version="1.0" encoding="utf-8" ?> 
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/" xmlns="http://purl.org/rss/1.0/">
- <channel rdf:about="http://blogs.charlotte.com/panthers/">
  <title>Inside the Panthers</title> 

...
4

2 に答える 2

1

あなたの「チャンネル」ノードのフルネームは'http://purl.org/rss/1.0/':channelです。そのため、(空でない) プレフィックスを持つ両方の名前空間を XPathManager に追加し、XPath でプレフィックスを使用する必要があります (XML のプレフィックスは完全に無視します - それらは XPath とは関係ありません)。

private const string RDFXpath = "/rdf:RDF/prefix2:channel";
private const string RDFNamespaceName2 = "prefix2";
var res = doc.XPathSelectElements(RDFXpath, manager);

名前空間マネージャーでプレフィックスとして "" (空の文字列) を指定しても、select には何の役にも立ちません。XPath の空のプレフィックスは、常にデフォルト (空の) 名前空間を指します。xmlns="new_default_uri"これは、現在および子ノードに影響を与えるを使用してデフォルトのプレフィックスをオーバーライドできる XML とは異なります。これについては、XmlNamespaceManager.AddNamespaceの注で説明されています。

于 2012-11-05T17:55:25.027 に答える
0

問題は(Alexeiが見つけた問題に加えて)ルートに関するXElementとXDocumentの違いによるもののようです。使用するxpathは、XDocumentを使用する場合は機能しますが、XElementを使用する場合は機能しません。以下を参照してください。

http://msdn.microsoft.com/en-us/library/bb675196.aspx

于 2012-11-05T20:47:00.140 に答える