きのうのJAVAのフォーマット変換:DOM編では、書き出し、JAVAのフォーマット変換:DOM編では、読み込みをやったので、今日は編集をやります。
●XMLのノードを書き換える
テキストのノードにいって、そのノードにsetNodeValueをします。
たとえば昨日のような
<Hotel>
<HotelName>ホテル1</HotelName>
</Hotel>
<Hotel>
:
:
のようになっているときに1番初めのレコードのホテル名を変える場合
NodeList hotellist = xtree.getElementsByTagName("Hotel");
で、Hotelタグのノードをとりだし、
(Element)hotellist.item(0)
で1番初めのホテルをとりだし、それに
getElementsByTagName("HotelName")
をして、1番初めのホテルのホテル名のノードをとりだします。
ホテル名は1個しか入ってないので、上記の結果に.item(0);をかけて、
はじめのものをとりだし、
それにたいして、getFirstChild()をして、ホテル名のノードの初めの要素
ここでは、テキストになってるはずなので、それを取り出して
setNodeValueするのですが。。
よくわかんないっすか(^^;)
結局まとめると、こうなります。
NodeList hotellist = xtree.getElementsByTagName("Hotel");
Node hotelname = ((Element)hotellist.item(0) ).getElementsByTagName("HotelName").item(0);
hotelname.getFirstChild().setNodeValue("ペンギンホテル");
■エレメントの削除
親のノードをgetParentNode();で取得し
親のノード.removeChild(削除したいノード);
とします。
■エレメントの追加
ドキュメント.createElement(タグ名)で、エレメントを作成します
ドキュメント.createTextNode(値の文字列)で、テキストを作成します
この作成されたものを、どんどんappendChildで追加してゆき、最後に
実際に追加したいところの親に
親のノード.appendChild(作成した、追加したいノード)
をします
■サンプル仕様
昨日作成したhotel.xmlを読み込み
以下の操作をします
・はじめのHotelの要素のHotelNameを”ペンギンホテル”に変えます
・2番目のHotelの要素を削除します
・HotelNameが、「ホテル追加その1」の要素Hotelを追加します。
その後、Hotel2.xmlとして、書き出します。
■ソース
実際の編集をやっているのは、赤字の部分です。
import java.io.*; import java.net.*; import javax.xml.parsers.*; import org.w3c.dom.*; // 出力のために追加 import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; public class test { public static void main(String[] args) { try { int i; // InputStreamを作り出すために // ファイルを取得 FileInputStream fi = new FileInputStream("hotel.xml"); //==============================// // 読み込む // //==============================// // ドキュメントビルダーファクトリを生成 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); // ドキュメントビルダーを生成 DocumentBuilder builder = dbfactory.newDocumentBuilder(); // パースを実行してDocumentオブジェクトを取得 Document xtree = builder.parse(fi); //==============================// // 編集 // //==============================// NodeList hotellist = xtree.getElementsByTagName("Hotel"); // 1番目のノードのHotelNameをペンギンホテルに Node hotelname = ((Element)hotellist.item(0)). getElementsByTagName("HotelName").item(0); hotelname.getFirstChild().setNodeValue("ペンギンホテル"); // 2番目のノードは削除 Node oya = hotellist.item(1).getParentNode(); //おやを取得 oya.removeChild(hotellist.item(1)); // エレメント(Hotel)追加 Element ne1 = xtree.createElement("Hotel"); Element ne2 = xtree.createElement("HotelName"); Text nt1 = xtree.createTextNode("ホテル追加その1"); ne2.appendChild(nt1); ne1.appendChild(ne2); oya.appendChild(ne1); //==============================// // 変換のための元生成 // //==============================// DOMSource source= new DOMSource(xtree); //==============================// // 変換先(ファイル)生成 // //==============================// File f =new File("hotel2.xml"); FileOutputStream fo = new FileOutputStream(f); StreamResult result = new StreamResult(fo); //==============================// // 変換 // //==============================// TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = transFactory.newTransformer(); transformer.transform(source, result); //==============================// // あとしまつ // //==============================// fo.close(); System.out.println("Job End"); } catch (Exception e) { e.printStackTrace(); } } } |
(上記の< > ¥ は本当は半角です)