如何使用XPath按TextContent过滤元素?按轴获取父项?

时间:2010-06-11 01:29:12

标签: java xml xpath

我发现a similar question on 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>

如果我想从这个XML中获取item元素的“过滤”子集,我怎么能使用XPath表达式来直接解决这个问题呢?

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

我现在知道这将评估为类别中所有TextContent的集合,但是,这意味着我必须使用集合来存储值,然后迭代,然后返回以获取其他相关信息,例如项目ID再次。

另一个问题是:我怎样才能正确引用父节点?

说,这个xpath表达式会让我得到所有id节点的集合,对吧?但我想要的是项目节点的集合:

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

我知道我应该使用“父”轴来引用它,但我无法做到正确...

有没有更好的办法做这种事情?现在学习w3cschools教程......

对不起,我是Java新手,并且非常感谢。

3 个答案:

答案 0 :(得分:6)

  

如果我想获得“过滤”的子集   如何从这个XML的item元素   我可以使用XPath表达式吗?   直接解决了这个问题?

示例XPath表达式:

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

此XPath表达式选择所有<category>元素的所有<item>元素的所有文本节点子元素isInStock子元素的值id属性'true'id元素),它们是XML文档顶部元素的子元素。

  

另一个问题是:我怎么可能   正确引用父节点?

使用

<强> parent::node()

或只是

<强> ..

答案 1 :(得分:2)

爪哇。

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

获取所选节点的父节点(导入org.w3c.dom.Node;),

Node baloon = (Node)result;
if (baloon != null)
{
     baloon = baloon.getParentNode();
}

答案 2 :(得分:1)

要选择,您可以在谓词后继续路径以跳回找到的 id 的父级

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

当您对此进行评估时,它应该返回一个NodeList,其中包含已过滤的节点(及其子树),然后您可以迭代这些节点。