1

次のような dom ノードがあるとします。

org.w3c.dom.Element ノード:

<node id="101">
  <node id="102">
    <node id="103" />
  </node>
  <node id="104">
    <node id="103" />
  </node>
</node>

id 属性を変換するには、Java コードで次のようにします。

String nodeId = node.getAttribute("id");
String newNodeId = "prefix/" + nodeId;
node.getAttributeNode("id").setValue(newNodeId);

次に、上記のノードは次のように変換されます。

<node id="prefix/101">
  <node id="102">
    <node id="103" />
  </node>
  <node id="104">
    <node id="103" />
  </node>
</node>

しかし、すべてのサブノードを再帰的に変更したいと考えています。予想される変換されたノードは次のとおりです。

<node id="prefix/101">
  <node id="prefix/102">
    <node id="prefix'103" />
  </node>
  <node id="prefix/104">
    <node id="prefix/103" />
  </node>
</node>

子ノードをループすることはできますが、ノードには複数のレベルの子がある可能性があります。この場合、ルートには 2 つのサブレベルがあります。しかし、サブレベルがさらにある場合、すべてのレベルの子ノードをループするのは少し厄介に思えます。このタスクを達成するためのより簡単なアプローチはありますか?

ありがとう、ソニー

4

2 に答える 2

2

XPath を使用して、変更するすべてのノードのリストを取得できます。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

...

final String xml = "<node id=\"101\"><node id=\"102\"><node id=\"103\" /></node><node id=\"104\"><node id=\"103\" /></node></node>";
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder db = dbf.newDocumentBuilder();
final Document doc = db.parse(new InputSource(new StringReader(xml)));
final XPathFactory xpathFactory = XPathFactory.newInstance();
final XPath xpath = xpathFactory.newXPath();
final NodeList nodes = (NodeList) xpath.compile("//node[@id]").evaluate(doc, XPathConstants.NODESET);
for (int nodeNumber = 0; nodeNumber < nodes.getLength(); ++nodeNumber) {
    final Element node = (Element) nodes.item(nodeNumber);
    final String nodeId = node.getAttribute("id");
    final String newNodeId = "prefix/" + nodeId;
    node.getAttributeNode("id").setValue(newNodeId);
}

ドキュメントは次の内容で構成されます。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<node id="prefix/101">
    <node id="prefix/102">
        <node id="prefix/103" />
    </node>
    <node id="prefix/104">
        <node id="prefix/103" />
    </node>
</node>
于 2012-01-26T02:06:21.090 に答える
0

id 属性に追加するプレフィックス値が一定である場合は、XSLT を使用できます。(これはあなたが必要とする正確なコードではありません...私の頭の上の単なる例です)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node">
    <xsl:element name="node">
      <xsl:attribute name="id">
       <xsl:value-of select="concat('prefix/', @id)" />
      </xsl:attribute>

      <xsl:apply-templates/>
    <xsl:element>
  </xsl:template>
</xsl:stylesheet>

これによりコードはより単純になりますが、変換を実行するには xalan などの XSLT インタープリターをロードする必要があります。XSLT をまだ使用していない場合、これが最善の方法である場合とそうでない場合がありますが、Java コードで DOM 構造を直接操作する別の方法です。

于 2012-01-26T01:59:23.760 に答える