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を使うと、後から作ったノードでも、ノードの前に追加できたりするのね。 たけち: 今回も、そんなに難しくなかったよね。 さらら: はい。ありがとう。 → この後はどうしましょうか・・・ (^ ^; |
|