2011-06-11 39 views
2

我正在解析query_id的URI。我想獲取最後一個查詢的ID。這實際上是URI中最後一個添加的節點。從XML文件的最後一個子項中選擇值

我正在使用以下代碼,但它無法返回最後一個節點,而是從第一個節點返回信息。幫幫我 !!!

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

我不知道如何把這裏的代碼但這是我正在使用的... XmlDocument doc = new XmlDocument(); doc.Load(「http://helpdesk.hujelabs.com/user。php/1/query「); XmlNode node = doc.DocumentElement; XmlNode id = node.LastChild.SelectSingleNode(」// queries/query/description/text()「); string TID = id.InnerText; – 2011-06-11 14:51:09

+0

請參閱http://stackoverflow.com/editing-help。 – svick 2011-06-11 14:56:24

+0

好問題,+1。請參閱我的答案,瞭解目前唯一正確的解決方案,解釋此常見問題並提供完整,簡單易用的解決方案 – 2011-06-11 16:46:37

回答

2

形式的任何答案:

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

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

是錯誤

這是一個常見問題:中的XPath //僞操作具有較低的優先級則[]運營商 - 這就是爲什麼上面的表達式選擇任何query(或分別description)元素是其父的最後一個子 - - 這些可以是全部querydescription元素。

解決方案

使用

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

還要注意:使用該//僞運營商通常會導致效率的signifficant損失,因爲這會導致整個(子樹)在當前節點生根並完全遍歷(O(N^2)操作)。

黃金法則:每當XML文檔的結構靜態(事先)已知且穩定時,絕對不要使用//。而是使用具有一系列特定位置步驟的XPath表達式。

例如,如果你要選擇的元素,可以選擇使用:

/x/y/queries/query 

然後用上面的XPath表達式 - 不//queries/query

+0

@Dimitre,您對,我已經修復了我的答案中的XPath – svick 2011-06-11 16:43:22

+0

@svick:你不知道XML文檔的結構,它的頂層元素可能不是'queries'。 – 2011-06-11 16:48:20

+0

@Dimitre,acutally,I do知道它,問題中的URL工作。 – svick 2011-06-11 16:55:43

1

使用這個XPath

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

要獲取最後一個查詢的query_id,你的XPath改變

/queries/query[position() = last()]/query_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;