使用Java更改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

我有以下场景:我有一个XML文档,例如

<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");
}