示例XML:獲取節點與父節點以及沒有兄弟姐妹使用XPath
<animals>
<cat>cat</cat>
<dog>dog</dog>
<lion>lion</lion>
</animals>
假設,如果我搜索元素 「狗」 時,預期的結果是
<animals>
<dog>dog</dog>
<animals>
我只想要父節點(動物)和搜索到的節點(狗)。不應該顯示兄弟姐妹(貓,獅子)。我可以通過XPath實現嗎?
示例XML:獲取節點與父節點以及沒有兄弟姐妹使用XPath
<animals>
<cat>cat</cat>
<dog>dog</dog>
<lion>lion</lion>
</animals>
假設,如果我搜索元素 「狗」 時,預期的結果是
<animals>
<dog>dog</dog>
<animals>
我只想要父節點(動物)和搜索到的節點(狗)。不應該顯示兄弟姐妹(貓,獅子)。我可以通過XPath實現嗎?
這應該是足夠
(/animals/dog)[1]
最簡單的答案是:你不能,因爲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);
}
不會這樣做 – Andersson