Строка XPath, которая захватывает элемент с определенным значением id - PullRequest
10 голосов
/ 27 февраля 2012

Я пытаюсь создать запрос / строку XPath, которая извлекает определенный элемент из документа XML. Я пытаюсь получить элемент с id = 38, но мой код по какой-то причине всегда ничего не возвращает.

Если вы посмотрите на мой код и организацию моего XML-файла, вы можете сказать мне, какой XPath мне нужен, чтобы получить элемент с id = 38?

Мой код:

XmlDocument xdoc = new XmlDocument();
xdoc.Load(getProductURL());
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')");

// node always is null for some reason?

Способ организации XML выглядит примерно так:

<courseg>
    <group isempty="False" isbranch="true" id="1" name="abc">
        <group isempty="False" isbranch="true" id="38" name="def"></group>
    </group>
</courseg>

Ответы [ 4 ]

19 голосов
/ 27 февраля 2012

Требуемая XPath:

//*[@id='38']

Вот пример с XDocument:

        XDocument xdoc = XDocument.Parse(@"
<courseg>
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc"">
        <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group>
    </group>
</courseg>");
        XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']");
        Console.WriteLine(node);
5 голосов
/ 27 февраля 2012

Идентификатор функции ('P38') выберет элемент со значением идентификатора P38.Но это не просто означает «атрибут с именем« id »».Это означает, что атрибут, объявленный в DTD или схеме, имеет тип ID.Вы не показали DTD или схему, и я подозреваю, что у вас ее нет.Если вы это сделали, и если он объявил атрибут id как идентификатор типа, то ваш документ был бы недействительным, поскольку значение идентификатора не может быть полностью числовым (по старым причинам SGML оно должно принимать форму имени).

На практике функцию id (), вероятно, лучше избегать, если у вас нет строгих требований к производительности.Он слишком хрупкий - он работает только тогда, когда вы проверяете исходный документ по схеме или DTD.В XSLT используйте вместо него key ().В качестве альтернативы, многие процессоры теперь распознают имя атрибута xml: id как самообъявляющееся значение идентификатора без ссылки на схему или DTD: используйте это, если ваш процессор поддерживает это.

4 голосов
/ 27 февраля 2012

Используйте этот запрос XPath:

//*[@id = 38]

Выбирает каждый узел с атрибутом id, равным 38. Если вам нужно быть более конкретным, то есть выберите group с атрибутом id, равным 38, используйте этот:

//group[@id = 38]
0 голосов
/ 27 февраля 2012

Когда вы упоминаете

xdoc.DocumentElement.SelectSingleNode("id('38')"

, вы запрашиваете xmldocument для поиска дочернего узла внутри корневого узла с именем 'id'.Но в идеале «id» - это атрибут, а не xmlnode.

Таким образом, вы должны использовать //group[@id = '38'], чтобы получить весь дочерний узел с именем «group» и атрибутом «id» со значением 38

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...