使用xpath

时间:2017-02-22 08:05:57

标签: java xpath

示例XML:

<animals>
<cat>cat</cat>
   <dog>dog</dog>
   <lion>lion</lion>
</animals>

假设我搜索元素“dog”,预期结果为
<animals>
<dog>dog</dog>
<animals>

我只想要父节点(动物)和搜索节点(狗)。不应该显示兄弟姐妹(猫,狮子)。我如何通过XPath实现这一目标?

2 个答案:

答案 0 :(得分:2)

简单的答案是:你不能,因为XPath选择节点并且不会改变DOM。

您可以使用xslt转换执行此操作。

例如,你可以发射所有节点但过滤动物节点只允许一只猫进入并移除所有其他动物:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" ></xsl:output>
    <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="//animals[cat]">
    <xsl:comment>CAT animals</xsl:comment>
    <animals>
    <xsl:apply-templates select="cat"/>
    </animals>
  </xsl:template>

  <xsl:template match="//animals[not(cat)]">
    <xsl:comment>Skipped</xsl:comment>
  </xsl:template>



  <xsl:template match="cat">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

如果您想改变当前的dom元素,您只需选择所有不需要的节点并将其删除。

    XPath xpath = XPathFactory.newInstance().newXPath();

    NodeList unitAnimals = (NodeList) xpath.evaluate("//animals[cat]/*[not(self::cat)]", doc, XPathConstants.NODESET);
    for(int i = 0; i<unitAnimals.getLength();i++){
        Node unitAnimal = unitAnimals.item(i);
        Node parentNode = unitAnimal.getParentNode();
        parentNode.removeChild(unitAnimal);
    }

答案 1 :(得分:0)

那应该够了

(/animals/dog)[1]