Выбор значения из последнего потомка файла XML - PullRequest
2 голосов
/ 11 июня 2011

Я анализирую URI для query_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 ]

2 голосов
/ 11 июня 2011

Любой ответ в форме :

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

или

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

неверно .

Это часто задаваемые вопросы : псевдо-оператор XPath // имеет более низкий приоритет, чем оператор [] - поэтому в приведенных выше выражениях выбирается любой query (или соответственно *)1020 *) элемент, который является последним дочерним элементом его родителя - это могут быть все элементы query или description.

Solution :

Используйте :

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

Также обратите внимание: Использование псевдооператора // обычно приводит к значительной потере эффективности, потому что это вызывает все (под) деревокорень в текущем узле, чтобы быть полностью пройденным (операция O (N ^ 2)).

Золотое правило : всякий раз, когда структура XML-документа (заранее) известна и стабильна, никогда не используйте //.Вместо этого используйте выражение XPath, которое имеет ряд определенных шагов местоположения.

Например, если все элементы, которые вы хотите выбрать, можно выбрать с помощью:

 /x/y/queries/query

, затем используйтеВышеупомянутое выражение XPath - не //queries/query

1 голос
/ 11 июня 2011

Чтобы получить последний запрос 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;
1 голос
/ 11 июня 2011

используйте этот XPath

 //queries/query/description[last()]/text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...