2017-02-22 91 views
0

示例XML:獲取節點與父節點以及沒有兄弟姐妹使用XPath

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

假設,如果我搜索元素 「狗」 時,預期的結果是
<animals>
<dog>dog</dog>
<animals>

我只想要父節點(動物)和搜索到的節點(狗)。不應該顯示兄弟姐妹(貓,獅子)。我可以通過XPath實現嗎?

回答

0

這應該是足夠

(/animals/dog)[1] 
+0

不會這樣做 – Andersson

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> 

如果whant變異您當前的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); 
    } 
相關問題