我有以下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。
有什么问题?
谢谢, 安德鲁
答案 0 :(得分:6)
您的初始查询会选择离开根目录的所有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);
}