读取xml节点属性

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);
        }
1个回答

18

由于你的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);
}

这就是为什么你没有得到结果。

与你的代码不同的是,我使用 // ,因此不是从文档根开始,双斜杠// 表示 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 属性,则不必这样做。


你的方法是可行的,但问题在于你是从代码中加载 XML 结构而不是从文件中加载。 - Derezzed
@Derezzed 这并不重要,你也可以从文件中加载它,只要文件格式正确且为有效的 XML,它应该能正常工作。由于我不知道你的文件是什么样子的,所以我自己制作了一个示例来展示给你。 - Prix
抱歉没有提供文件结构,文件是这样的, http://pastebin.com/raw.php?i=TjHYW5TP - Derezzed
@Derezzed 哈哈,那是因为你有一个命名空间,请查看顶部代码的更新。 - Prix
@Derezzed 好的,我需要看到你的XML更完整的示例才能够重现这个问题。请记住上面的示例代码只是打印ID属性。 - Prix
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接