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