XMLデータBeanはXMLデータを扱うためのデータBeanです。XMLデータBeanのクラスとしてcom.fujitsu.uji.xml.XmlDataBeanクラスを使います。XMLデータBean内部では、XMLデータをオブジェクトのツリー(木)として保持しています。このツリーをXMLツリーと呼びます。XMLツリーの各ノードはXMLの要素に対応し、XMLツリーのルートはXMLのルート要素に対応します。
XMLデータBeanが保持するXMLツリーのルートに対応する要素を、XMLデータBeanのルート要素と呼びます。上の図では、catalog要素がXMLデータBeanのルート要素です。
XMLデータBeanの作成
XmlDataBeanクラスのコンストラクタによって空のXMLデータを持つXMLデータBeanが作成されます。これにXMLデータを与えるには、ファイルなどからXMLデータを読み込みます。
XMLデータの読み込みと保存
XMLデータを読み込むには、XmlDataBeanクラスのloadFromメソッドを使用します。読み込み元の指定には、ファイル、InputStream、URI、org.xml.sax.InputSourceのいずれかを指定します。
XMLデータBean内のXMLデータを保存するにはXmlDataBeanのsaveToメソッドを使用します。保存先としてファイルやOutputStreamを指定できます。文字符号化方式の指定も可能です。
public void startup(DispatchContext context) { try { // ロードするファイルを表すFileオブジェクトを作成 ServletContext sc = ((HttpDispatchContext)context).getServletContext(); String root = sc.getRealPath("/"); File file = new File(root, "/WEB-INF/user.xml"); // XMLデータBeanを作成 XmlDataBean xmlBean = new XmlDataBean(); // XMLデータを読み込み BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); xmlBean.loadFrom(in); // XMLデータを保存 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); xmlBean.saveTo(out,"Shift_JIS"); context.setResponseBean("body",xmlBean); } catch (Exception e) { e.printStackTrace(); } }
保存時に文書型宣言を指定するには、setDoctypeメソッドを使用してください。また、改行コードの種類、空白記号の追加、省略された属性の追加の有無を指定するにはsetWriteOptionメソッドを使用してください。
XMLデータの操作
XMLデータBeanのメソッドを使ってデータの参照、更新、追加および削除が可能です。
XMLデータを操作する際は操作対象となるデータをXPathで指定します。XPathは、XMLデータ内のある要素を基点とし目的の要素までの経路を記述することによってデータを指定する方法です。
ポイント
XPathの記述例は“6.3 XPathの概略”を参照してください。
XMLデータの参照には、文字列として参照する方法と、XMLデータBeanとして参照する方法があります。
文字列として参照
getTextメソッドを使います。 XPathは、XMLデータBeanのルート要素からの相対パスで指定します。
String text = xmlBean.getText("item/name");
XMLデータの一部をXMLデータBeanとして参照
getSubBeanメソッドを使います。得られるXMLデータBeanは、XPathで指定した要素から始まるサブツリーを持ちます。
XmlDataBean subBean = xmlBean.getSubBean("item");
getSubBeanで取得したXMLデータBeanは、元のXMLツリーをコピーせずに共有します。したがって、getSubBeanで得られたXMLデータBean内のデータを更新すると、元のXMLデータBeanも更新されます。
XPathで指定されるデータには、単純要素、複合要素、混合要素、属性、それらのデータの集合があります。XPathで指定したデータの種類とgetText、getSubBeanの返値の関係は以下のようになります。
単純要素 | 複合要素 | 混合要素 | 属性 | 集合 | |
---|---|---|---|---|---|
getText | 要素の内容 | null | null | 属性値 | 先頭の要素または属性のみを参照して左記の条件に従う |
getSubBean | null | その要素をルート要素とするXMLデータBean | null | null | 先頭の要素のみを参照して左記の条件に従う |
(上記表の「null」は、メソッドがnullを返すことを意味します。)
ポイント
XMLデータ中の要素は、その内容として子要素やテキストを持つかどうかによって、単純要素、複合要素、混合要素に分類されます。
単純要素: 子要素を持ちません。テキストは持つことができます。
複合要素: 複数の子要素を持ちます。空白、改行以外のテキストは持つことができません。
混合要素: 複数の子要素と、テキストを持ちます。
以下のXMLデータで、titleは単純要素、headerは複合要素、bodyは混合要素です。
<doc> <header> <title>XML連携機能マニュアル</title> <author>富士通太郎</author> </header> <body> 本マニュアルでは、 <bold>Apcoordinator</bold> の <bold>XML連携機能</bold> について解説します。 </body> </doc>
単純要素の内容を指定した文字列で更新するには、setTextメソッドを使います。
xmlBean.setText("item/name", "白ワイン");
XPathで属性を指定した場合は、属性値が更新されます。集合の場合はその先頭のデータが更新の対象になります。複合要素、混合要素には使用できません。
XPathで指定された要素が存在しない場合、指定された要素がXMLに追加されます。ただしXPathが以下の条件のいずれかを満たす場合に限ります。
述語(“[式]”の形式)を使用していない(例: item/name)
述語を使用している場合、それが“[整数]”か“[position()=整数]”のいずれかの形式である。
(例: item[3]/note[position()=5])
上記2の場合、既存の要素の数が述語で指定した整数に満たない場合、不足分が追加されます。例えば、item要素が1個しかないXMLに対し、setText("item[4]","foo") を実行すると、item要素が3個追加されて合計4個になり、その4番目のitem要素の内容が"foo"になります。
子要素(単純要素)を追加するには、appendメソッドを使います。
xmlBean.append("item", "name", "白ワイン");
item要素の子要素としてname要素が末尾に追加されます。name要素の内容は“白ワイン”となります。
子要素(単純要素)を挿入するには、insertメソッドを使います。
xmlBean.insert("item", "author", "title", "XML連携機能マニュアル");
item要素の子要素としてtitle要素がauthor要素の直前に挿入されます。title要素の内容は“XML連携機能マニュアル”となります。
要素を削除するには、removeメソッドを使います。
xmlBean.remove("item/name");
XPathで指定した要素が削除されます。
XMLデータBeanを複製するには、cloneメソッドを使用します。複製されたXMLデータBeanに対する更新処理は、複製元のデータには反映されません。