【问题标题】:Modify XML content based on XPath DOM基于 XPath DOM 修改 XML 内容
【发布时间】:2015-12-04 11:28:41
【问题描述】:

我正在尝试基于 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,其中包含与“名称”匹配的所有节点。

谁能指出我如何使用 DOM 修改基于 XPath 的 XML 内容。

谢谢。

【问题讨论】:

    标签: java xml dom xpath


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2012-04-10
      • 2015-08-08
      相关资源
      最近更新 更多