Предположим, у меня есть следующий XML:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
Я хотел бы сделать xpath, который возвращает все узлы книги, у которых есть узел заголовка с языковым атрибутом «it».
Моя попытка выглядела примерно так:
//book[title[@lang='it']]
Но это не сработало. Я ожидаю вернуть узлы:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
Есть подсказки?
Ответы:
Пытаться
Это гласит:
book
элементыtitle
lang
"it"
Вы можете найти это полезным - это статья Рональда Бурре «XPath в пяти абзацах» .
Но, честно говоря,
//book[title[@lang='it']]
и вышесказанное должно быть эквивалентным, если только ваш движок XPath не имеет "проблем". Таким образом, это может быть что-то в коде или образце XML, который вы нам не показываете - например, ваш образец представляет собой фрагмент XML. Может быть, у корневого элемента есть пространство имен, и вы не учитываете это в своем запросе? И вы только сказали нам, что это не сработало, но вы не сказали нам, какие результаты вы получили.источник
title
оно не является прямым потомкомbook
, а где-то глубже и мы не знаем где именно?//book[/title/@lang = 'it']
не работает?Годы спустя, но полезным вариантом будет использование XPath Axes ( https://www.w3schools.com/xml/xpath_axes.asp ). В частности, вы хотите использовать оси потомков .
Я считаю, что этот пример поможет:
Это позволяет вам выбрать все
book
элементы, содержащие дочернийtitle
элемент (независимо от того, насколько глубоко он вложен), содержащий значение атрибута языка, равное 'it'.Я не могу точно сказать, актуален ли этот ответ для 2009 года, поскольку я не уверен на 100%, что оси XPath существовали в то время. Что я могу подтвердить, так это то, что они существуют сегодня, и я считаю, что они чрезвычайно полезны в навигации XPath, и я уверен, что вы тоже.
источник
фактически эквивалентен
Я пробовал использовать vtd-xml, оба выражения дают один и тот же результат ... какой механизм обработки xpath вы использовали? Я предполагаю, что это проблема соответствия Ниже приведен код
источник
Я думаю, ваше собственное предложение правильное, однако xml не совсем верен. Если вы производите
//book[title[@lang='it']]
на<root>[Your"XML"Here]</root>
то бесплатных онлайн - тестеров XPATH , таких как один здесь будет найти ожидаемый результат.источник
Попробуйте использовать это выражение xPath:
Это должно дать вам все узлы книги на языке "it"
источник