我有以下场景:我有一个XML文档,例如像这样
<someRootElement>
<tag1>
<tag2
someKey=someValue
someKey2=someValue2
/>
<tag3/>
<tag4
newKey=newValue
newKey2=newValue2
/>
</tag1>
</someRootElement>
现在我希望将父 tag1 称为 reallyCoolTag ,而不会丢失子节点。 我尝试了下面的内容,但遗憾的是它没有按照我希望的方式工作(但我知道为什么,b / c它缺少一些东西,我想):
// the new element:
Element neu = doc.createElement( newValue );
// append it to the root:
root.appendChild( neu );
// get all the child nodes:
NamedNodeMap nnm = nodes.item(i).getAttributes();
for( int dg = 0; dg < nnm.getLength(); dg++ ){
neu.setAttribute( nnm.item( dg ).getNodeName(),
nnm.item( dg ).getNodeValue() );
}
//---------------------------------------------------------
// HERE I GUESS I AM MISSING THE PART WHERE THE CHILD NODES
// ARE BEING APPENDED TO THE NEW NODE?????
//---------------------------------------------------------
// nodes.item(i) := the old value (nodes := is a NodeList
root.replaceChild( neu, nodes.item(i));
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource( doc );
StreamResult result = new StreamResult( xml );
transformer.transform( source, result );
nodes.item( i ).getParentNode().removeChild( nodes.item(i) );
现在这确实在某种程度上有效,正如我所提到的,我想我错过了子节点被放置的部分,但我真正想知道的是,是否有一个非常简短的方法来重命名父节点,而不必复制所有内容并替换整个东西?
Thnx提前!!!
答案 0 :(得分:28)
NodeList nodes = document.getElementsByTagName("tag1");
for (Node eachNode: nodes) {
document.renameNode(eachNode, null, "reallyCoolTag");
}
答案 1 :(得分:2)
您可以使用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>
这可以与javax.xml.transform包(Java 1.4及更高版本)一起使用:
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer(new StreamSource(
new File("RenameTag.xslt")));
transformer
.transform(new DOMSource(document), new StreamResult(System.out));
答案 2 :(得分:0)
只需在要重命名的元素上调用setName("reallyCoolTag")
即可。没有必要复制孩子们;元素的name属性是一个可变字段。
答案 3 :(得分:0)
正如您所获得的属性:
NamedNodeMap nnm = nodes.item(i).getAttributes();
并将这些属性添加到新元素
您应该获得nodes.item(i)
的孩子并将其设置在新节点中。
您可以使用ex。:
neu.addContent(nodes.item(i).getChildren());
答案 4 :(得分:0)
您的tag1无效。它没有关闭&gt;。此外,还应引用属性。它看起来应该是这样的,
<someRootElement>
<tag1>
<tag2
someKey="someValue"
someKey2="someValue2"
/>
<tag3/>
<tag4
newKey="newValue"
newKey2="newValue2"
/>
</tag1>
</someRootElement>
尝试使用更正后的XML。它应该工作。