5

このようなノードを持つ xml ドキュメントが<ITEM id="1" name="bleh"... /> あります。ドキュメントに存在する各 ITEM ノードのすべての ID の属性値を取得したいと考えています。

それで、どうすればそれを行うことができますか?

編集:私はこの方法を試しましたが、うまくいきませんでした:

XmlDocument Doc = new XmlDocument();
        Doc.Load("example.xml");
        XmlNodeList nodeList = Doc.SelectNodes("/ITEM");
        foreach (XmlNode node in nodeList)
        {
            string id = node.Attributes["id"].Value;
            Console.WriteLine(id);
        }
4

1 に答える 1

17

XML には名前空間が含まれているため、SelectSingleNode()の呼び出しでXmlNamespaceManagerを使用する必要があります。

var doc = new XmlDocument();
doc.Load("example.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("anyname", "http://tempuri.org/zitem.xsd");
foreach (XmlNode node in doc.SelectNodes("//anyname:ITEM", ns))
{
    Console.WriteLine(node.Attributes["id"].Value);
}

結果が出ないのはそのためです。

私のコードとあなたのコードの違いは//、ドキュメントのルートから開始するのではなく、そのように使用していることです。2 つのスラッシュは、XML ドキュメントの任意の場所を調べるよう//に評価者に示します。XPath

これが私example.xmlのサンプルです:

<root>
  <items>
    <ITEM id="1" name="bleh=" />
    <ITEM id="2" name="bleh=" />
    <ITEM id="3" name="bleh=" />
    <ITEM id="4" name="bleh=" />
    <ITEM id="5" name="bleh=" />
    <ITEM id="6" name="bleh=" />
    <ITEM id="7" name="bleh=" />
    <ITEM id="8" name="bleh=" />
  </items>
</root>

そして、これが私がそれを読んでいる方法です:

var doc = new XmlDocument();
doc.Load("example.xml");
foreach (XmlNode node in doc.SelectNodes("//ITEM[@id]"))
{
    Console.WriteLine(node.Attributes["id"].Value);
}

単一のスラッシュを使用すると、上記XPathは次のようになります。

/root/items/ITEM

要素に属性がある[@id]ことを確認するためにも使用していますが、すべてに属性があることがわかっている場合は必要ありません。ITEMIDID

于 2013-09-16T00:01:47.630 に答える