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