Как использовать XPath для фильтрации элементов по TextContent? получить родителя по оси? - PullRequest
3 голосов
/ 11 июня 2010

Я нашел похожий вопрос по SO , однако, кажется, что это не совсем то, чего я хочу достичь:

Скажем, это пример XML-файла:

<root>
    <item>
        <id isInStock="true">10001</id>
        <category>Loose Balloon</category>
    </item>
    <item>
        <id isInStock="true">10001</id>
        <category>Bouquet Balloon</category>
    </item>
    <item>
        <id isInStock="true">10001</id>
        <category>Loose Balloon</category>
    </item>
</root>

Если я хочу получить «отфильтрованное» подмножество элементов item из этого XML, как я могу использовать выражение XPath для прямого обращения к этому?

XPathExpression expr = xpath.compile("/root/item/category/text()");

Теперь я знаю, что это будет оцениваться какоднако коллекция всего TextContent из категорий означает, что мне нужно использовать коллекцию для хранения значений, затем выполнить итерацию, а затем вернуться, чтобы снова получить другую связанную информацию, такую ​​как идентификатор элемента.

Другойвопрос в том, как я могу правильно сослаться на родительский узел?

Скажем, это выражение xpath даст мне коллекцию всех узлов id, верно?Но то, что я хочу, это набор узлов элементов:

XPathExpression expr = xpath.compile("/root/item/id[@isInStock='true']");

Я знаю, что должен использовать ось «родителя» для ссылки на это, но я просто не могу сделать это правильно ...

Есть ли лучший способ сделать это?Изучение учебных пособий по w3cschools ...

Извините, я новичок в XPath на Java, и большое спасибо заранее.

Ответы [ 3 ]

6 голосов
/ 11 июня 2010

Если я хочу получить «отфильтрованное» подмножество элементы элемента из этого XML, как можно ли использовать выражение XPath для адрес прямо?

Пример выражения XPath:

/*/item[id/@isInStock='true']/category/text()

Это выражение XPath выбирает всех дочерних элементов текстового узла всех элементов <category> всех элементов <item>, атрибут isInStock которого id child имеет значение 'true' и (элементы id) которые являются потомками верхнего элемента XML-документа.

Другой вопрос: как я мог правильно обращаться к родительскому узлу?

Используйте

parent::node()

или просто

..

2 голосов
/ 05 августа 2013

Java.

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Node;

Следующее выражение XPath можно использовать для фильтрации элементов по текстовому содержимому.

**String xPathString = "/root/item/category[text()='Bouquet Balloon']";** 

XPath xPath = XPathFactory.newInstance().newXPath();     
XPathExpression xPathExpression = xPath.compile(xPathString);

Получить результат, оцененный до требуемого типа,

Object result = xPathExpression.evaluate(getDrugBankXMLDoc(), XPathConstants.NODE);

Получить родительский элемент выбранного узла (import org.w3c.dom.Node;),

Node baloon = (Node)result;
if (baloon != null)
{
     baloon = baloon.getParentNode();
}
1 голос
/ 11 июня 2010

Чтобы выбрать элемент , Вы можете продолжить путь после предиката, чтобы вернуться к родителю найденного id (s)

XPathExpression expr = xpath.compile("/root/item/id[@isInStock='true']/../text()");

Когда вы оцениваете это, он должен вернуть NodeList, содержащий отфильтрованные item Nodes (и их поддеревья), которые вы можете затем перебрать.

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