XML SelectNodes然后SelectSingleNodes-只检索第一个

本文关键字:检索 第一个 SelectSingleNodes- SelectNodes 然后 XML | 更新日期: 2023-09-27 18:28:47

我有以下XML

<root>
<Operations>
    <OperationId>1</OperationId>
    <OtherFields>...</OtherFields>
</Operations>
<Operations>
    <OperationId>2</OperationId>
    <OtherFields>...</OtherFields>
</Operations>
<Operations>
    <OperationId>3</OperationId>
    <OtherFields>...</OtherFields>
</Operations>
</root>

使用C#和System.XML命名空间,我使用以下代码获得所有操作:

XmlNodeList operations= doc.SelectNodes("/root/Operations");

现在,我需要遍历每个操作并引用字段(OperationId、OtherFields)。

我试试这个:

foreach (XmlNode node in xnodes)
{
    Console.WriteLine("Operation ID: {0}", node.SelectNodes("//OperationId")[0].InnerText);
}

然而,这只是重复第一个OperationId-1。

怎么了?

谢谢,Andrew

XML SelectNodes然后SelectSingleNodes-只检索第一个

您的初始查询会像您所期望的那样从根中选择所有Operations节点。然而,循环中的内部查询会执行一些不同的操作。

通过使用//开始查询,您就可以相对于文档的根进行查询。因此,您实际上选择了文档中的所有OperationId节点,而不仅仅是当前节点的子节点。然后为每次迭代的结果中的第一个节点建立索引,这就是为什么您看到第一个id重复的原因。

由于node指的是当前的Operations节点,要选择相应的OperationId,您的查询应该只是:

OperationId

我应该指出的是,由于您只尝试选择查询的第一个元素,因此最好使用SelectSingleNode()而不是SelectNodes。如果选择了任何节点,则会返回第一个节点。

node.SelectSingleNode("OperationId").InnerText

但是,由于您只是试图选择一个直接的子元素,所以我不会在那里使用XPath查询,这是不必要的。只需使用索引器直接访问子元素。

var query = doc.SelectNodes("/root/Operations");
foreach (XmlNode node in query)
{
    Console.WriteLine("Operation ID: {0}", node["OperationId"].InnerText);
}