|
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データをどう作るかを、テキストノードの箇所を中心に図に示しておくね。 さらら: はい。 |
|

■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ノード(ノード名は"manyosyu")の最初の子ノードを見つけるのに たけち: そうなんだね。 |
|
■DOMSample26の実行結果: sample26.xmlの内容確認
|
たけち: じゃ、このDOMSample26プログラムを実行させてみよう。Eclipseで実行させた場合、実行結果として、図のように作成されたファイル名が表示されるよ。で、その中身を見てみると図のようになっていることが分かるよ。 |

|
(注): Eclipseで実行したときには、プロジェクトを選択して、右クリックで表示されるメニューの中から [更新(F)] を選択してください。作成されたファイル名(この例の場合は、sample26.xml)が表示されます。 |
|
さらら: なるほど。insertBeforeを使うと、後から作ったノードでも、ノードの前に追加できたりするのね。 たけち: 今回も、そんなに難しくなかったよね。 さらら: はい。ありがとう。 → この後はどうしましょうか・・・ (^ ^; |
|