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

问题描述

|| 我正在为query_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; 
    

解决方法

        形式的任何答案:
//queries/query[position() = last()]/query_id/text()
要么
//queries/query/description[last()]/text()
是错的。 这是一个常见问题解答:XPath
//
伪运算符的优先级比
[]
运算符的低-这就是为什么上面的表达式选择任何
query
(或分别为
description
)元素作为其父级的最后一个子元素的原因-这些可以全部为
query
description
元素。 解: 采用:
(//queries/query)[last()]/query_id/text()
另请注意:使用
//
伪运算符通常会导致效率显着下降,因为这会导致遍历以当前节点为根的整个(子)树(O(N ^ 2)操作)。 黄金法则:只要XML文档的结构是静态的(预先)已知且稳定的,就不要使用
//
。而是使用具有一系列特定位置步骤的XPath表达式。 例如,如果可以使用以下方式选择要选择的所有元素:
 /x/y/queries/query
然后使用上面的XPath表达式-不是
//queries/query
    ,        使用这个XPath
 //queries/query/description[last()]/text()
    ,        要检索上一个查询的
query_id
,请将您的XPath更改为
/queries/query[position() = last()]/query_id/text()
或者,使用LINQ to 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;