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

时间:2011-06-11 14:49:39

标签: c# xml xpath

我正在解析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; 

3 个答案:

答案 0 :(得分:2)

表格的任何答案

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

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

错误

这是一个FAQ :XPath //伪运算符的优先级低于[]运算符 - 这就是上述表达式选择任何{{1}的原因}(或分别为query)元素,它是其父项的最后一个子项 - 这些元素可以是所有descriptionquery元素。

<强>解决方案

使用

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;