DOM: XMLデータを作成する(6) ノードを指定したノードの前に追加

2007年06月17日(日)更新


■ノードを指定したノードの前に追加

たけち: 今回は、ノードを指定したノードの前に追加してみよう。

さらら: はい。そんなこともあるのね。

たけち: 今回は次のようなXMLファイルを作成してみよう。

今回生成するXMLファイル例 sample26.xml
<?xml version="1.0" encoding="UTF-8"?>
<manyosyu><contents/><volume no="01"/></manyosyu>

さらら: manyosyu要素の子要素にcontentsとvolume要素があるのね。

たけち: そう。でも、今回は、最初にvolume要素を作ってから、contents要素を前に挿入する方法で作ってみるね。

さらら: そっか。contents要素を追加するときに「volume要素の前に追加」する指定をするわけね。

たけち: じゃ、このXMLデータをどう作るかを、テキストノードの箇所を中心に図に示しておくね。

さらら: はい。

出力サンプルXMLデータ(sample26.xml)の構造と作成手順の例


■insertBeforeメソッド

たけち: 図の「G contentsノードの追加」について説明するね。

さらら: はい。

たけち: 次のように、NodeクラスのinsertBeforeメソッドを使えばいいんだよ。

NodeクラスのinsertBeforeメソッド

Node

insertBefore(Node 追加するノードA, Node 追加する先のノードB)

・機能: ノードAを指定したノードBの前に追加(挿入)します。
・パラメタ: 
     Node 追加するノードA : 追加するノードAを指定します。
     Node 追加する先のノードB : 追加するノードAは、このノードBの直前に追加されます。このNodeが null の場合、ノードA は子ノードの最後に追加されます。
・戻り値: 追加されたノードA
     ノードの追加に失敗したら、nullが戻り値となります。

さらら: そっか、2番目のパラメタに指定したノードBの前に、パラメタの最初に指定したノードAを追加することができるのね。

たけち: そうだよ。

さらら: わかったわ。


■DOMサンプルプログラム ノードを指定したノードの前に追加(挿入)

たけち: じゃ、今回のDOMサンプルプログラム(26)のソースコードを載せておくね。

さらら: はい。

DOMサンプルプログラム(25) DOMSample26.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package dom.study.sample_2;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

public class DOMSample26 {

    public static void main(String[] args) {	
		
      try {
        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docbuilder = dbfactory.newDocumentBuilder(); // DocumentBuilderインスタンス
        Document document = docbuilder.newDocument();          // Documentの生成

        /*
         * root要素として manyosyu要素を生成
         */
         Element root = document.createElement("manyosyu");    // manyosyuノード作成
         document.appendChild(root);                // ノードをDocumentに追加

         /*
          * volume要素を生成し、no属性を追加
          */
         Element volume = document.createElement("volume");
          volume.setAttribute("no", "01");
         root.appendChild(volume);

         /*
          * ノードを生成し、rootのノードの最初の子ノードとして追加
          */
         Element contents = document.createElement("contents");
         root.insertBefore(contents, root.getFirstChild());

         /*
          * DOMオブジェクトをファイルとして出力
          */ 
         TransformerFactory tfactory = TransformerFactory.newInstance(); 
         Transformer transformer = tfactory.newTransformer(); 

         File outfile = new File("sample26.xml");
         transformer.transform(new DOMSource(document), new StreamResult(outfile)); 

      } catch (ParserConfigurationException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      } catch (TransformerException e) {
        // TODO 自動生成された catch ブロック
        e.printStackTrace();
      }

    }
}

たけち: 今回は、44行目に注目してね。4行目の
    root.insertBefore(contents, root.getFirstChild());
で、43行目で生成したcontnetsノードをrootノード(ノード名は"manyosyu")の最初の子ノードの前に追加(挿入)するように記述しているね。

さらら: あぁ、なるほど。rootノード(ノード名は"manyosyu")の最初の子ノードを見つけるのに
    root.getFirstChild()
を使っているのね。

たけち: そうなんだね。


■DOMSample26の実行結果: sample26.xmlの内容確認

たけち: じゃ、このDOMSample26プログラムを実行させてみよう。Eclipseで実行させた場合、実行結果として、図のように作成されたファイル名が表示されるよ。で、その中身を見てみると図のようになっていることが分かるよ。

DOMSample26によるXMLファイルの作成

(注): Eclipseで実行したときには、プロジェクトを選択して、右クリックで表示されるメニューの中から [更新(F)] を選択してください。作成されたファイル名(この例の場合は、sample26.xml)が表示されます。

さらら: なるほど。insertBeforeを使うと、後から作ったノードでも、ノードの前に追加できたりするのね。

たけち: 今回も、そんなに難しくなかったよね。

さらら: はい。ありがとう。

→ この後はどうしましょうか・・・ (^ ^;


たのしいXMLのインデックス