我发现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新手,并且非常感谢。
答案 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,其中包含已过滤的项节点(及其子树),然后您可以迭代这些节点。