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]
ことを確認するためにも使用していますが、すべてに属性があることがわかっている場合は必要ありません。ITEM
ID
ID