开发者

Selecting Value from Last Child of an XML file

I am parsing an URI for query_id. I want to get the last query's id. That is actually the last added node in the URI.

I am using the following code but it is failing to return the last node but is returning info from the first node. HELP !!!

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开发者_JS百科/text()");
string TID = id.InnerText; 


Any answer of the form:

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

or

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

is wrong.

It is a FAQ: The XPath // pseudo-operator has lower precedence then the [] operator -- this is why the above expressions select any query (or respectively description) element that is the last child of its parent -- these can be all query or description elements.

Solution:

Use:

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

Also note: The use of the // pseudo-operator usually results in signifficant loss of efficiency, because this causes the whole (sub) tree rooted at the current node to be completely traversed (O(N^2) operation).

A golden rule: Whenever the structure of the XML document is statically (in advance) known and stable, never use //. Instead use an XPath expression that has a series of specific location steps.

For example, if all the elements you want to select can be selected using:

 /x/y/queries/query

then use the above XPath expression -- not //queries/query


use this XPath

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


To retrieve last query's query_id, change your XPath to

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

Or alternatively, use 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;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜