XmlDataAccessクラスとは、入出力項目に、項目のXPathでアクセスするクラスです。このクラスを使用することにより、DOM(Document Object Model)インターフェースを意識しないで簡単にXMLデータの設定・取得を行うことができます。
■ クラスの概要
クラス名 | XmlDataAccess |
パッケージ名 | com.fujitsu.form |
文法 | public class XmlDataAccess |
継承関係 | java.lang.Object | +--- com.fujitsu.form.XmlDataAccess |
■ コンストラクタの概要
コンストラクタ名 | 説明 |
---|---|
与えられたXMLデータのドキュメントオブジェクトに対して値の取得・設定を行います。 |
■ メソッドの概要
戻り値型 | メソッド名 | 説明 |
---|---|---|
org.w3c.dom.Document | XMLデータのドキュメントオブジェクトを返します。 | |
com.fujitsu.form. | XPathで指定された集団項目をルートとするXmlDataAccessオブジェクトを生成します。 | |
java.lang.String | XPathで指定された項目が持つ値を取得します。 | |
void | XPathで指定された項目に値を設定します。 | |
void | XMLデータの値のコピーを行います。 |
■ コンストラクタの詳細
XmlDataAccess(org.w3c.dom.Document)
形式:
public XmlDataAccess(org.w3c.dom.Document xmlData) throws java.lang.IllegalArgumentException
説明:
パラメタ「xmlData」のデータルートをルートとするXmlDataAccessオブジェクトを生成します。
指定したドキュメントオブジェクトに対して、データの編集処理を直接行います。
XmlDataAccessオブジェクトの先頭のノードを、以降、「仮想ルート」と呼びます。
パラメタ:
XMLデータのドキュメントオブジェクト
XMLデータのドキュメントオブジェクトは、データルートタグをルートとするドキュメントオブジェクトです。XMLデータのドキュメントオブジェクトは、InputDataBuilderクラスのgetXMLData()メソッド、OutputDataBuilderクラスのgetTemplateXMLData()メソッドなどで取得できます。
例外:
パラメタ「xmlData」がnullまたは空のオブジェクトの場合
■ メソッドの詳細
形式:
public org.w3c.dom.Document getDocument()
説明:
処理中のXMLデータのドキュメントオブジェクトを返します。
返されたドキュメントオブジェクト内のノードの構成を変更したあとに、このクラスのほかのメソッドを呼び出すと、正しく動作しない場合があります。
戻り値:
XMLデータのドキュメントオブジェクト
getGroupItem(java.lang.String)
形式:
public com.fujitsu.form.XmlDataAccess getGroupItem(java.lang.String Xpath) throws java.lang.IllegalArgumentException, com.fujitsu.form.XmlProcessorException com.fujitsu.form.NoSuchItemException com.fujitsu.form.InvalidItemException
説明:
XPathで指定した集団項目を仮想ルートとするXmlDataAccessオブジェクトを生成します。
パラメタ「Xpath」が複数の集団項目を示しているときは、最初に見つかった集団項目に対して処理を行います。
このメソッドで取得したXmlDataAccessオブジェクトは、元のXMLデータをコピーしないで共有します。したがって、このメソッドで得られたXmlDataAccessオブジェクト内のデータを更新すると、元のXMLデータも更新されます。
戻り値:
「XmlDataAccessオブジェクト」の仮想ルートは、パラメタ「Xpath」となります。
パラメタ:
集団項目のXPath (仮想ルート名)
XmlDataAccessオブジェクトを生成したときの仮想ルートからの相対で指定します。
戻り値:
XmlDataAccessオブジェクト
例外:
パラメタ「Xpath」がnullまたは空のオブジェクトの場合
次に示すどちらかの場合
XMLパーサでエラーが発生した場合
ドキュメントオブジェクトの操作に失敗した場合
パラメタ「Xpath」が処理中のドキュメントオブジェクトに存在しない場合
パラメタ「Xpath」が項目のXPathの場合
補足:
XmlDataAccessオブジェクトが次に示す例の場合、一般職の氏名を表す集団項目は、「一般職/氏名」となります。「一般職/氏名」で取得したXmlDataAccessオブジェクトの仮想ルートは、「氏名」となります。
例:
<名簿> <管理職> <氏名> <ふりがな>ふじつうたろう</ふりがな> <名前>富士通太郎</名前> </氏名> </管理職> <一般職> <氏名> <ふりがな>ふじつうはなこ</ふりがな> <名前>富士通花子</名前> </氏名> </一般職> </名簿>
形式:
public java.lang.String getValue(java.lang.String Xpath) throws java.lang.IllegalArgumentException, com.fujitsu.form.XmlProcessorException, com.fujitsu.form.InvalidItemException
説明:
XPathで指定した項目に設定されている値を取得します。
パラメタ「Xpath」が複数の項目を示しているときは、最初に見つかった項目に対して処理を行います。
なお、パラメタ「Xpath」にデータルートまたは集団項目を指定することはできません。
パラメタ:
項目のXPath
指定する項目のXPathは、次に示す形式です。
XPathの例 | 内容 |
---|---|
aaa | 子要素(XmlDataAccessオブジェクトを生成したときのルートノードの子) |
aaa/bbb | 相対指定(XmlDataAccessオブジェクトを生成したときのルートノードからの相対) |
aaa/bbb[1] | 繰り返し |
戻り値:
項目に設定されている値(文字列)
項目のXPathが存在しない場合はnull。項目が空要素の場合は空のオブジェクト
例外:
パラメタ「Xpath」がnullまたは空のオブジェクトの場合
次に示すどちらかの場合
XMLパーサでエラーが発生した場合
ドキュメントオブジェクトの操作に失敗した場合
パラメタ「Xpath」がデータルートまたは集団項目のXPathの場合
setValue(java.lang.String, java.lang.String)
形式:
public void setValue(java.lang.String Xpath, java.lang.String value) throws java.lang.IllegalArgumentException, com.fujitsu.form.XmlProcessorException, com.fujitsu.form.InvalidItemException, com.fujitsu.form.NoSuchItemException
説明:
XPathで指定した項目に値を設定します。
項目に値がない状態(空タグ)にするときは、nullまたは空のオブジェクトを指定してください。また、処理中のドキュメントオブジェクトに存在する項目を指定する必要があります。
なお、パラメタ「Xpath」にデータルートまたは集団項目を指定することはできません。
パラメタ:
項目のXPath
項目のXPathについては、getValueメソッド()を参照してください。
設定する値
例外:
パラメタ「Xpath」がnullまたは空のオブジェクトの場合
次に示すどちらかの場合
XMLパーサでエラーが発生した場合
ドキュメントオブジェクトの操作に失敗した場合
パラメタ「Xpath」がデータルートまたは集団項目のXPathの場合
パラメタ「Xpath」が処理中のドキュメントオブジェクトに存在しない場合
形式:
public void copy(org.w3c.dom.Document doc) throws java.lang.IllegalArgumentException, com.fujitsu.form.XmlProcessorException
説明:
パラメタ「doc」のXMLデータを、コンストラクタで指定したドキュメントオブジェクトにコピーします。XMLデータのコピーは、同一のXPathの項目に対して行われます。
コピーを行う際、コンストラクタで指定したドキュメントオブジェクトの項目にデータが存在する場合は、上書きされます。
コピーを行うドキュメントオブジェクトに存在する項目が、コンストラクタで指定したドキュメントオブジェクトに存在しない場合は、コピーされません。
コピーを行うドキュメントオブジェクトに存在しない項目が、コンストラクタで指定したドキュメントオブジェクトに存在する場合は、その項目は無視されます。
コピーを行うドキュメントオブジェクトの項目が、データを持たない場合(空要素の場合)は、データのコピーは行われません。
例:
コンストラクタのドキュメントオブジェクト <DataRoot> <Item1/> <Item2/> <Item3>abc</Item3> <Item3>ABC</Item3> <Item3/> <Group> <Item4>xyz</Item4> <Item3/> </Group> </DataRoot> | 引数のドキュメントオブジェクト <DataRoot> <Item1>あいうえお</Item1> <Item2>かきくけこ</Item2> <Item3>さしすせそ</Item3> <Item3/> <Group> <Item4>たちつてと</Item4> <Item4>なにぬねの</Item4> </Group> <Item3>はひふへほ</Item3> </DataRoot> | ||
↓ | |||
コピー後のドキュメントオブジェクト <DataRoot> <Item1>あいうえお</Item1> <Item2>かきくけこ</Item2> <Item3>さしすせそ</Item3> <Item3>ABC</Item3> <Item3>はひふへほ</Item3> <Group> <Item4>たちつてと</Item4> <Item3/> </Group> </DataRoot> |
パラメタ:
ドキュメントオブジェクト
コピーを行うXMLデータのドキュメントオブジェクトを指定してください。
例外:
パラメタ「doc」がnullまたは空のオブジェクトの場合
次に示すどちらかの場合
XMLパーサでエラーが発生した場合
ドキュメントオブジェクトの操作に失敗した場合
■ 使用例
XmlDataAccessクラスおよびItemAttributeAccessクラスの使用例を示します。
入出力共にFormcoordinatorの場合
import org.w3c.dom.*; import com.fujitsu.form.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import javax.servlet.ServletException; public class SampleServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try{ InputDataBuilder idb = new InputDataBuilder(request); Document idoc = idb.getXMLData(); XmlDataAccess xdai = new XmlDataAccess(idoc); // 入力データから個々の項目を取得します。 String 氏名 = xdai.getValue("個人データ/氏名"); String 年齢 = xdai.getValue("個人データ/年齢"); String 性別 = xdai.getValue("個人データ/性別"); String 部署名 = xdai.getValue("会社情報/部署名"); String 社員番号 = xdai.getValue("会社情報/社員番号"); // データベースなどへデータを登録します。 ・ ・ ・ // Webブラウザで未入力の項目は、送信されないので、その項目を編集する場合 // は、雛形で補う必要があります。 // Windowsの場合は以下のように記述します。 OutputDataBuilder odb = new OutputDataBuilder(request, java.net.URLEncoder.encode("file:///c:/pmd", System.getProperty("file.encoding")), "sample"); // SolarisおよびLinuxの場合は以下のように記述します。 // OutputDataBuilder odb = // new OutputDataBuilder(request, // java.net.URLEncoder.encode("file:////home/pmd", // System.getProperty("file.encoding")), "sample"); // 雛形のXMLデータをドキュメントオブジェクトで取得します。 Document odoc = odb.getTemplateXMLData(); // 入力データで未入力部分に対して、出力データで値を設定する場合、 // 次に示すように指定します。 XmlDataAccess xdao = new XmlDataAccess(odoc); xdao.copy(idoc); xdao.setValue("入社/入社年度", "入力を御願いします"); // 項目に項目制御情報を設定します。 ItemAttributeAccess iaa = new ItemAttributeAccess("項目制御情報"); iaa.setColor("syear", ItemAttributeAccess.RED); iaa.setColor("name", ItemAttributeAccess.BLUE); odb.setXMLData(xdao.getDocument(), true); odb.setItemAttribute(iaa.getDocument()); odb.write(response.getOutputStream()); } catch(Exception e){ // 例外処理 ・ ・ ・ } } }
入力がCGIパラメタ、出力がFormcoordinatorの場合
import com.fujitsu.form.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import javax.servlet.ServletException; public class SampleServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try{ // 入力データから個々の項目を取得します。 String 氏名 = request.getParameter("氏名"); String 年齢 = request.getParameter("年齢"); String 性別 = request.getParameter("性別"); String 部署名 = request.getParameter("部署名"); String 社員番号 = request.getParameter("社員番号"); // データベースなどへデータを登録します。 ・ ・ ・ // Windowsの場合は以下のように記述します。 OutputDataBuilder odb = new OutputDataBuilder(request, java.net.URLEncoder.encode("file:///c:/pmd", System.getProperty("file.encoding")), "sample"); // SolarisおよびLinuxの場合は以下のように記述します。 // OutputDataBuilder odb = // new OutputDataBuilder(request, // java.net.URLEncoder.encode("file:////home/pmd", // System.getProperty("file.encoding")), "sample"); // 雛形からXmlDataAccessオブジェクトおよびItemAttributeAccessオブジェクト // を生成します。 XmlDataAccess xda = new XmlDataAccess(odb.getTemplateXMLData()); ItemAttributeAccess iaa = new ItemAttributeAccess("項目制御情報"); // 各項目のデータを設定します。 xda.setValue("個人データ/氏名", 氏名); xda.setValue("個人データ/年齢", 年齢); xda.setValue("個人データ/性別", 性別); xda.setValue("会社情報/部署名", 部署名); xda.setValue("会社情報/社員番号", 社員番号); // 項目制御情報を設定します。 iaa.setColor("name", ItemAttributeAccess.BLUE); // 上記で設定したデータおよび項目制御情報のドキュメントオブジェクトを // OutputDataBuilderオブジェクトに設定します。 odb.setXMLData(xda.getDocument(), true); odb.setItemAttribute(iaa.getDocument()); odb.write(response.getOutputStream()); } catch(Exception e){ // 例外処理 ・ ・ ・ } } }