2010-06-11 61 views
3

我发现a similar question on SO,然而,这似乎不正是我想要实现:如何使用XPath通过TextContent过滤元素?逐轴获取父母?

说,这是一个示例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中的元素元素,我如何使用XPath表达式来直接解决这个问题?

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

现在我知道这将评估从类别所有的TextContent的集合,然而,这意味着我必须使用一个集合来存储的值,然后进行迭代,然后回去抢其他相关诸如物品ID之类的信息。

另一个问题是:我该如何正确引用父节点?

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

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

我知道我应该用“父”轴来指代,但我不能作出正确的...

是否有做这种事情的更好方法?现在学习w3cschools教程吧...

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

+0

良好问题(+1)。查看我的答案,了解您需要的正确XPath表达式。 – 2010-06-11 02:13:31

回答

6

如果我想获得的 一个“过滤”子集,从这个XML的项目元素,我怎么 可以使用XPath表达式 直接解决了吗?

一个例子XPath表达式:

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

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

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

使用

parent::node()

或者干脆

..

+0

感谢您的回答,我现在看到表达式更像查询。坦率地说,知道一个针对xml(tree)的查询/地址表达式是非常有趣的,类似于jQuery的查询/地址表达式,但并不完全:) – 2010-06-11 02:19:18

+0

@ Michael-Mao:我可以推荐学习XPath的最佳方式是使用我自己的XPath Visualizer。 – 2010-06-11 02:34:19

+0

这个? http://xpathvisualizer.codeplex.com/ 相当不错,让我想起jQuery选择器可视化器:) – 2010-06-11 02:46:55

1

要选择项目,您可以断言后继续路径跳回发现ID(S)的母公司

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

当你评估这一点,应该返回包含已过滤的节点列表项目节点(及其子树),然后可以迭代。

+0

ahhh,那是我唯一没有尝试过自己的情况...感谢您的回答 – 2010-06-11 02:20:05

+1

糟糕 - 我刚刚在回复时编辑了原始答案。我的第一反应是不正确的,实际上(我尝试过)。现在有什么作品。 – 2010-06-11 02:23:25

+0

谢谢你。我对XPath完全陌生,所以我总是有错误:)现在我看到表达式背后的逻辑更加清晰。 – 2010-06-11 02:33:10

1

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

获取所选择的节点(进口org.w3c.dom.Node中)的母体,

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