3

我有以下 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。

怎么了?

谢谢,安德鲁

4

1 回答 1

6

您的初始查询Operations会像您期望的那样选择根节点之外的所有节点。但是,循环中的内部查询会有所不同。

通过使用 a 开始查询//,您正在相对于文档的根进行查询。因此,您实际上是在选择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);
}
于 2013-08-23T01:52:18.120 回答