您应该在调用SelectSingleNode()时使用XmlNamespaceManager ,因为您的 XML 确实包含一个命名空间:
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);
}
这就是为什么你没有结果。
我的代码与您的不同之处在于,我使用的是//so,而不是从文档的根目录开始,双正斜杠//指示XPath评估者查看 XML 文档中的任何位置。
这是我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属性,则这不是必需的。