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;
精彩评论