XPath String, которая захватывает элемент с определенным значением id

Я пытаюсь создать запрос/строку 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>

Ответ 1

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);

Ответ 2

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

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

Ответ 3

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

//*[@id = 38]

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

//group[@id = 38]

Ответ 4

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

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

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

Итак, вы должны использовать //group[@id = '38'], чтобы получить все дочерние элементы node с именем "group" и атрибутом "id" со значением 38