17

私は次のシナリオを持っています:私は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!!!

4

5 に答える 5

36

Document.renameNodeの使用:

NodeList nodes = document.getElementsByTagName("tag1");
for (Node eachNode: nodes) {
  document.renameNode(eachNode, null, "reallyCoolTag");
}
于 2009-08-22T21:40:48.307 に答える
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));

ドキュメントを出力として使用する場合は、DOMResultを参照してください。

于 2009-08-19T15:33:17.813 に答える
0

setName("reallyCoolTag")名前を変更する要素を呼び出すだけです。子供たちをコピーする必要はありません。要素のname属性は可変フィールドです。

于 2009-08-19T13:41:03.667 に答える
0

属性を取得したように:

NamedNodeMap nnm = nodes.item(i).getAttributes();

これらの属性を新しい要素に追加しました。

の子を取得nodes.item(i)して、新しいノードに設定する必要があります。

あなたは例のために使うことができます:

neu.addContent(nodes.item(i).getChildren());
于 2009-08-19T13:48:54.300 に答える
0

tag1が無効です。クロージング>はありません。また、属性は引用符で囲む必要があります。このように見えるはずです、

<someRootElement>
<tag1>
    <tag2 
        someKey="someValue"
        someKey2="someValue2"
    />
    <tag3/>
    <tag4
        newKey="newValue"
        newKey2="newValue2"
    />
</tag1>
</someRootElement>

修正したXMLを試してください。動作するはずです。

于 2009-08-19T14:12:21.650 に答える