C# 从XML文件的最后一个子项中选择值

C# 从XML文件的最后一个子项中选择值,c#,xml,xpath,C#,Xml,Xpath,我正在分析查询\u id的URI。我想获取最后一个查询的id。这实际上是URI中最后添加的节点 我正在使用下面的代码,但它无法返回最后一个节点,而是从第一个节点返回信息。救命啊 XmlDocument doc = new XmlDocument(); doc.Load("helpdesk.hujelabs.com/user.php/1/query"); XmlNode node = doc.DocumentElement; XmlNode id = node.LastChild.SelectSi

我正在分析查询\u id的URI。我想获取最后一个查询的id。这实际上是URI中最后添加的节点

我正在使用下面的代码,但它无法返回最后一个节点,而是从第一个节点返回信息。救命啊

XmlDocument doc = new XmlDocument();
doc.Load("helpdesk.hujelabs.com/user.php/1/query");
XmlNode node = doc.DocumentElement;
XmlNode id = node.LastChild.SelectSingleNode("//queries/query/description/text()");
string TID = id.InnerText; 
使用这个XPath

 //queries/query/description[last()]/text()

要检索上一个查询的
查询id
,请将XPath更改为

/querys/query[position()=last()]/query\u id/text()
或者,使用LINQ到XML:

var doc = XDocument.Load("http://helpdesk.hujelabs.com/user.php/1/query");
var elem = doc.Root.Elements("query").Last().Element("query_id");
var TID = (int)elem;

任何形式的回答

//queries/query[position() = last()]/query_id/text()
(//queries/query)[last()]/query_id/text()

//queries/query/description[last()]/text()
是错误的

这是一个常见问题解答:XPath
/
伪运算符的优先级低于
[]
运算符——这就是上面的表达式选择任何
查询
(或分别选择
说明
)的原因作为其父元素的最后一个子元素的元素—这些可以是所有
query
description
元素

解决方案

//queries/query[position() = last()]/query_id/text()
(//queries/query)[last()]/query_id/text()
使用

//queries/query[position() = last()]/query_id/text()
(//queries/query)[last()]/query_id/text()
另请注意:使用
/
伪运算符通常会导致显著的效率损失,因为这会导致根在当前节点上的整个(子)树被完全遍历(O(N^2)操作)

黄金法则:只要XML文档的结构是静态(预先)已知且稳定的,就不要使用
/
。而是使用具有一系列特定位置步骤的XPath表达式

例如,如果要选择的所有图元都可以使用以下选项进行选择:

 /x/y/queries/query

然后使用上面的XPath表达式--not
//querys/query

我不知道如何将代码放在这里,但这就是我正在使用的。。。XmlDocument doc=新的XmlDocument();doc.Load(“);XmlNode node=doc.DocumentElement;XmlNode id=node.LastChild.SelectSingleNode(//querys/query/description/text()”);string TID=id.InnerText;请参阅。好问题,+1。请参阅我的答案,以了解目前唯一正确的解决方案,解释此常见问题并提供完整、简单且容易的解决方案solution@svick:您不知道XML文档的结构,它的顶部元素可能没有命名为
querys
@Dimitre,确切地说,我知道,URL In这个问题行得通。@svick:我不知道问题中有任何URL。谢谢大家,它行得通!!