使用Java更改xml节点的节点名称
我有以下场景:我有一个XML文档,例如使用Java更改xml节点的节点名称,java,xml,xmlnode,Java,Xml,Xmlnode,我有以下场景:我有一个XML文档,例如 <someRootElement> <tag1> <tag2 someKey=someValue someKey2=someValue2 /> <tag3/> <tag4 newKey=newValue newKey2=newValue2 /> </tag1> </someR
<someRootElement>
<tag1>
<tag2
someKey=someValue
someKey2=someValue2
/>
<tag3/>
<tag4
newKey=newValue
newKey2=newValue2
/>
</tag1>
</someRootElement>
现在,我希望在不丢失子节点的情况下调用父级tag1。
我尝试了以下方法,但不幸的是,它没有像我希望的那样工作(但我确实知道为什么,b/c它缺少一些东西,我猜):
//新元素:
元素neu=doc.createElement(newValue);
//将其附加到根目录:
根附子(neu);
//获取所有子节点:
NamedNodeMap nnm=nodes.item(i).getAttributes();
对于(int dg=0;dg
现在这在一定程度上是可行的,正如我所提到的,我想我遗漏了子节点出现的部分,但我真正想知道的是,是否有一种非常短的方法来重命名父节点,而不必复制所有内容并替换整个内容
Thnx提前!!!只需对要重命名的元素调用
setName(“reallyCoolTag”)
。无需复制周围的子元素;元素的name属性是一个可变字段。正如您获得属性一样:
NamedNodeMap nnm = nodes.item(i).getAttributes();
您将这些属性添加到新元素中
您应该获取节点的子节点。项(i)
并在新节点中设置它们
您可以使用,例如:
neu.addContent(nodes.item(i).getChildren());
tag1无效。它没有closing>。属性也应该被引用。它应该是这样的
<someRootElement>
<tag1>
<tag2
someKey="someValue"
someKey2="someValue2"
/>
<tag3/>
<tag4
newKey="newValue"
newKey2="newValue2"
/>
</tag1>
</someRootElement>
尝试使用正确的XML。它应该可以工作。您可以使用XSL转换(XSLT)来实现:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="*"> <!-- match anything -->
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="tag1"> <!-- switch the element name -->
<xsl:element name="reallyCoolTag">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
查看是否希望a作为输出。使用:
我以前试过,但不起作用。也许我做错了?如果我想重命名的节点是“nodes.item(I)”,根元素叫做root,那么我到底是怎么做的?我试过:nodes.item(I).setName(newValue)…但eclipse希望我添加一个强制转换…它确实有效;它只是不会更改磁盘上的文件。您需要将文档保存在RAM中的某个位置以查看效果。如上所述,eclipse希望我添加一个强制转换…我猜,该方法不应该以这种方式工作…正如您在上面所看到的,我正在保存我要进行的更改:(对不起,我不是指根元素,而是指要重命名的元素。确实不需要复制子元素。只需搜索要重命名的元素并对其调用setName()。也许我应该获得一个新的eclipse,或者它确实不知道“addContent”:(对不起,我使用的是JDOM.By org.w3c:您可以使用nodes.item(I).getChildNodes();//返回子元素的列表,然后使用appendChild(元素)对其进行循环;//除了建议的方法不起作用之外,还要附加每个子节点……我必须循环遍历节点的子节点并添加em……但你是对的,我所说的方法是无效的。如果你还需要运行java代码来运行样式表,那么最好只使用java来解决问题。这样做,你就限制了volved、磁盘访问和磁盘依赖项。当需要进行多个更改并且样式表更异构时,您可能更喜欢样式表。我建议使用Document.renameNode
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="*"> <!-- match anything -->
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="tag1"> <!-- switch the element name -->
<xsl:element name="reallyCoolTag">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer(new StreamSource(
new File("RenameTag.xslt")));
transformer
.transform(new DOMSource(document), new StreamResult(System.out));
NodeList nodes = document.getElementsByTagName("tag1");
for (Node eachNode: nodes) {
document.renameNode(eachNode, null, "reallyCoolTag");
}