0

次の XML があります。

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 PORT_MT020001.xsd" type="Observation" classCode="OBS" moodCode="EVN">
    <book>
        <title lang="en">Harry Potter</title>
        <price>29.99</price>
    </book>

    <book>
        <title lang="en">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>

XMLDocument.SelectNodes()上記のxmlで次のように使用しようとすると:

XmlNodeList xmlNodelist = doc.SelectNodes("//book");
Console.WriteLine(xmlNodelist.Count);

次の結果が得られます。

0

xmlns次のように、ルート ノードの属性値を空に変更すると、次のようになります。

<bookstore xmlns="" ...........>

次に、次の適切な結果が返されます。

2

なぜこうなった?ルート ノードのxmlns属性値は、私にとって非常に重要です。この問題の解決策はありますか?

4

1 に答える 1

0

本に 0 が表示される理由Countは、本が特定の名前空間に属しているためです。名前空間を持つタグの外側にある場合、クエリの結果は 2 になります。

名前空間の一部であるタグに対してクエリを機能させるには (名前空間を持つ親タグは、すべての子がその名前空間を継承することを意味します)、次のようなコードを使用できます。

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("x", doc.DocumentElement.NamespaceURI);

    XmlNodeList xmlNodelist = doc.DocumentElement.SelectNodes("//x:book", nsmgr);
    Console.WriteLine(xmlNodelist.Count); // Prints 2

これが行うことはNamespaceManager、ドキュメントのデフォルトの namespaceUri を作成xし、検索でタグを関連付けるために (または任意の文字/単語を使用できます) 使用することです。ノードを検索するときは、この文字と名前空間マネージャーを使用して、必要な結果を取得してください。

于 2020-01-21T05:15:46.677 に答える