2015-12-04 61 views
0

我想操縱一些基於XPATH的基於XML的文件。使用DOM。但是在處理複雜的XPath時遇到問題。基於XPath修改XML內容DOM

基本上我需要的是改變人名稱,其中電子郵件是[email protected] 這裏的XPath是//person[email='[email protected]']/name

<?xml version="1.0" encoding="UTF-8"?> 
<details> 
    <person> 
     <name>batman</name> 
     <email>[email protected]</email> 
    </person> 
    <person> 
     <name>spiderman</name> 
     <email>[email protected]</email> 
    </person> 
    <person> 
     <name>tintin</name> 
     <email>[email protected]</email> 
    </person> 
</details> 

我現在實現如下

 Node nodeXpath = (Node) xPath.evaluate(<<xpath>>,document.getDocumentElement(), XPathConstants.NODE); 
    Element element = document.getDocumentElement(); 
    Node tatgetNode = document.importNode(nodeXpath, true); 
    element.getElementsByTagName(tatgetNode.getNodeName()).item(0).setTextContent("BatMan"); 

問題是如果我使用tagName查找元素,它確實返回NodeList與所有與「name」匹配的節點。

有人可以請我指出我可以如何使用DOM修改基於XPath的XML內容。

謝謝。

回答

1

您可以更改evaluate()直接返回該節點的文本內容:

Node nodeXpath = (Node) xPath.evaluate("//person[email='[email protected]']/name",document, XPathConstants.NODE); 
nodeXpath.setTextContent("BatMan"); 

另一種方法是使用XSLT:

Transformer t = TransformerFactory.newInstance().newTransformer(new StreamSource("batmanTransform.xsl")); 
t.setOutputProperty(OutputKeys.INDENT, "yes"); 
StreamResult target = new StreamResult(System.out); 
t.transform(new DOMSource(document), target); 

和batmanTransform.xsl,放:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:template match="//person[email='[email protected]']/name"> 
     <name>BatMan</name> 
    </xsl:template> 

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