基于XPath DOM修改XML内容

时间:2015-12-04 11:28:41

标签: java xml dom xpath

我正在尝试基于XPATH操作一些基于XML的文件。使用DOM。但是我在处理复杂的XPath时遇到了问题。

基本上我需要的是更改电子邮件为xyz@gmail.com的人名 其中XPath是//person[email='xyz@gmail.com'] / name

<?xml version="1.0" encoding="UTF-8"?>
<details>
   <person>
      <name>batman</name>
      <email>abc@yahoo.com</email>
   </person>
   <person>
      <name>spiderman</name>
      <email>xyz@gmail.com</email>
   </person>
   <person>
      <name>tintin</name>
      <email>pqr@gmail.com</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 个答案:

答案 0 :(得分:1)

您可以直接更改evaluate()返回的节点的文本内容:

Node nodeXpath = (Node) xPath.evaluate("//person[email='xyz@gmail.com']/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='xyz@gmail.com']/name">
        <name>BatMan</name>
    </xsl:template>

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