我正在尝试基于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内容。
谢谢。
答案 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>