我正在解析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;
答案 0 :(得分:2)
表格的任何答案:
//queries/query[position() = last()]/query_id/text()
或强>
//queries/query/description[last()]/text()
错误。
这是一个FAQ :XPath //
伪运算符的优先级低于[]
运算符 - 这就是上述表达式选择任何{{1}的原因}(或分别为query
)元素,它是其父项的最后一个子项 - 这些元素可以是所有description
或query
元素。
<强>解决方案强>:
使用强>:
description
另请注意:使用(//queries/query)[last()]/query_id/text()
伪运算符通常会导致效率的显着下降,因为这会导致以当前节点为根的整个(子)树完全失效遍历(O(N ^ 2)运算)。
黄金法则:每当XML文档的结构静态(提前)已知并且稳定时,就不要使用//
。而是使用具有一系列特定位置步骤的XPath表达式。
例如,如果可以使用以下选项选择要选择的所有元素:
//
然后使用上面的XPath表达式 - 而不是 /x/y/queries/query
答案 1 :(得分:1)
使用此XPath
//queries/query/description[last()]/text()
答案 2 :(得分:1)
要检索上一个查询的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;