Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML SelectNodes然后SelectSingleNodes-仅检索第一个_C#_Xml - Fatal编程技术网

C# XML SelectNodes然后SelectSingleNodes-仅检索第一个

C# XML SelectNodes然后SelectSingleNodes-仅检索第一个,c#,xml,C#,Xml,我有以下XML <root> <Operations> <OperationId>1</OperationId> <OtherFields>...</OtherFields> </Operations> <Operations> <OperationId>2</OperationId> <OtherFields>...</Oth

我有以下XML

<root>
<Operations>
    <OperationId>1</OperationId>
    <OtherFields>...</OtherFields>
</Operations>
<Operations>
    <OperationId>2</OperationId>
    <OtherFields>...</OtherFields>
</Operations>
<Operations>
    <OperationId>3</OperationId>
    <OtherFields>...</OtherFields>
</Operations>
</root>
现在,我需要循环执行每个操作并引用字段(OperationId、OtherFields)

我试试这个:

foreach (XmlNode node in xnodes)
{
    Console.WriteLine("Operation ID: {0}", node.SelectNodes("//OperationId")[0].InnerText);
}
但是,这只是重复第一个操作ID-1

怎么了

谢谢,
Andrew

您的初始查询将按照预期从根目录中选择所有
操作
节点。然而,循环中的内部查询做了一些不同的事情

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

由于
节点
指的是当前的
操作
节点,要选择相应的
操作ID
,您的查询应该是:

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);
}

Jeff是正确的“//OperationId”)[0]告诉它选择节点0,第一个。谢谢你,提供了信息并添加了信息,我需要这些信息,之后我就浪费了将近3个小时。谢谢
var query = doc.SelectNodes("/root/Operations");
foreach (XmlNode node in query)
{
    Console.WriteLine("Operation ID: {0}", node["OperationId"].InnerText);
}