C# XPath last()无法正常工作

C# XPath last()无法正常工作,c#,xpath,C#,Xpath,我有以下xml <root> <data> <person>tewst</person> <data> <phone>djk</phone> <email>dsd</email> </data> </data> </root> 问题是节点为空 解决方案: XMLD

我有以下xml

 <root>
    <data>
      <person>tewst</person>
      <data>
        <phone>djk</phone>
        <email>dsd</email>
      </data>
    </data>
  </root>
问题是节点为空

解决方案:

XMLDocument doc = new XMLDocument("xml file here");
var node = doc.SelectSingleNode("(//data)[last()]");

有几种不同的方法可以做到这一点

(1) 如果您知道XML的结构始终与上面的“根”元素类似,正好是一个“数据”子元素,并且正好是“数据”父元素下的一个“数据”子元素,那么您可以直接使用XPath表达式访问第二个“数据”元素:

XmlNode node = doc.SelectSingleNode("/root/data/data");
(2) 如果“根”元素下有多个“数据”元素,则可以执行以下操作:

XmlNodeList nodeList = doc.SelectNodes("//data/data");
此XPath表达式将返回文档中每个顶级“数据”元素下的第一个“数据”元素。例如,如果您有这样一个XML文档:

<root>
    <data>
      <person>tewst</person>
      <data>
        <phone>djk</phone>
        <email>dsd</email>
      </data>
    </data>
    <data>
      <person>two</person>
       <data>
        <phone>bbb</phone>
        <email>ddd</email>
       </data>
    </data>
</root>
。。。将产生:

<phone>djk</phone><email>dsd</email>
<phone>bbb</phone><email>ddd</email>
djkdsd
bbbddd
希望这有帮助。

//数据[last()]
选择作为其父节点的最后一个子节点的
数据
节点,因此在您的示例中选择了2个节点:

1)
根节点的最后一个
数据
子节点

<data>
    <person>tewst</person>
    <data>
        <phone>djk</phone>
        <email>dsd</email>
    </data>
</data>
<data>
    <phone>djk</phone>
    <email>dsd</email>
</data>
要选择整个文档中的最后一个
数据
,请使用:

(//data)[last()]
  • //数据
    将为所有子
    数据
    元素生成节点集,无论是否嵌套
  • [last()]
    将选择节点集的最后一个节点
  • //数据
    周围使用括号
    ()
    ,它确保将其解释为
    //数据
    然后
    [last()]
    ,而不是
    /
    然后
    数据[last()]

问题可能是第二个节点
data
是第一个节点的子节点。您应该更改节点名称,或者更改访问它的方法,逐节点读取。我无法更改xml的结构,因为这是设计的,并且由第三方Web服务使用。然后,我建议您使用第二种解决方案,使用
node.subjects(XName.Get(“node\u name”))等方法逐节点访问结构
您可以尝试在
//数据
周围加括号,即
(//数据)[last()]
谢谢!!(//数据)[last()]这确实有效!
<data>
    <phone>djk</phone>
    <email>dsd</email>
</data>
(//data)[last()]