代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

如何使用XPath按文本内容过滤元素?按轴获取父对象?

  •  3
  • Michael Mao  · 技术社区  · 14 年前

    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。

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

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

    有没有更好的办法做这种事?正在学习w3cschools教程。。。

    很抱歉,我是Java中XPath的新手,请提前感谢。

    3 回复  |  直到 4 年前
        1
  •  6
  •   Dimitre Novatchev    14 年前

    这个XML中的item元素,如何

    XPath表达式示例:

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

    这个XPath表达式选择所有文本节点的所有子节点 <category> 所有要素 <item> 元素 isInStock id 孩子有价值 'true' 以及 元素),它们是XML文档顶部元素的子元素。

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

    :

    parent::node()

    或者只是

    ..

        2
  •  3
  •   Hirosh Wickramasuriya    11 年前

    爪哇。

    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;
    

    **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();
    }
    
        3
  •  1
  •   Matthew Flynn    14 年前

    项目 ,则可以继续谓词后的路径以跳回找到的谓词的父级 身份证件 (个)

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

    项目 节点(及其子树),然后可以对其进行迭代。