问题描述
||
我正在为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;