Использование Document.renameNode :
NodeList nodes = document.getElementsByTagName("tag1");
for (Node eachNode: nodes) {
document.renameNode(eachNode, null, "reallyCoolTag");
}
Для этого можно использовать 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));
См. DOMResult , если вы хотите получить документ в качестве вывода.
Ваш tag1 недействителен. У него нет закрытия>. Также следует указать атрибуты. Должно получиться так:
<someRootElement>
<tag1>
<tag2
someKey="someValue"
someKey2="someValue2"
/>
<tag3/>
<tag4
newKey="newValue"
newKey2="newValue2"
/>
</tag1>
</someRootElement>
Попробуйте использовать исправленный XML. Должно сработать.
Просто вызовите setName ("reallyCoolTag")
для элементов, которые вы хотите переименовать. Нет необходимости копировать детей; атрибут name элемента является изменяемым полем.
Поскольку вы получили атрибуты:
NamedNodeMap nnm = nodes.item(i).getAttributes();
и добавили эти атрибуты к новому элементу,
вы должны получить дочерние элементы nodes.item (i)
и установите их в новом узле.
Вы можете использовать, например:
neu.addContent(nodes.item(i).getChildren());