ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

JAVAのフォーマット変換:DOM編(その3:XMLの操作)

2006-09-29 16:48:00 | JavaとWeb

 きのうの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();
    	}

	}

}

(上記の< > ¥ は本当は半角です)


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« BREWで複数画面を開発する場... | トップ | 要約も、目的によって(要約... »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事