ページの先頭行へ戻る
 Formcoordinatorユーザーズガイド

C.1.6 クラス:XmlDataAccess

XmlDataAccessクラスとは、入出力項目に、項目のXPathでアクセスするクラスです。このクラスを使用することにより、DOM(Document Object Model)インターフェースを意識しないで簡単にXMLデータの設定・取得を行うことができます。

■ クラスの概要

クラス名

XmlDataAccess

パッケージ名

com.fujitsu.form

文法

public class XmlDataAccess

継承関係

java.lang.Object
   |
   +--- com.fujitsu.form.XmlDataAccess

コンストラクタの概要

コンストラクタ名

説明

public
XmlDataAccess(org.w3c.dom.Document)

与えられたXMLデータのドキュメントオブジェクトに対して値の取得・設定を行います。

メソッドの概要

戻り値型

メソッド名

説明

org.w3c.dom.Document

getDocument()

XMLデータのドキュメントオブジェクトを返します。

com.fujitsu.form.
XmlDataAccess

getGroupItem(java.lang.String)

XPathで指定された集団項目をルートとするXmlDataAccessオブジェクトを生成します。

java.lang.String

getValue(java.lang.String)

XPathで指定された項目が持つ値を取得します。

void

setValue(java.lang.String, java.lang.String)

XPathで指定された項目に値を設定します。

void

copy(org.w3c.dom.Document)

XMLデータの値のコピーを行います。

コンストラクタの詳細

XmlDataAccess(org.w3c.dom.Document)

形式:

public XmlDataAccess(org.w3c.dom.Document xmlData)
  throws java.lang.IllegalArgumentException

説明:

パラメタ「xmlData」のデータルートをルートとするXmlDataAccessオブジェクトを生成します。
指定したドキュメントオブジェクトに対して、データの編集処理を直接行います。
XmlDataAccessオブジェクトの先頭のノードを、以降、「仮想ルート」と呼びます。


パラメタ:

xmlData

XMLデータのドキュメントオブジェクト
XMLデータのドキュメントオブジェクトは、データルートタグをルートとするドキュメントオブジェクトです。XMLデータのドキュメントオブジェクトは、InputDataBuilderクラスのgetXMLData()メソッド、OutputDataBuilderクラスのgetTemplateXMLData()メソッドなどで取得できます。


例外:

java.lang.IllegalArgumentException

パラメタ「xmlData」がnullまたは空のオブジェクトの場合

■ メソッドの詳細

getDocument()

形式:

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

集団項目のXPath (仮想ルート名)
XmlDataAccessオブジェクトを生成したときの仮想ルートからの相対で指定します。


戻り値:

XmlDataAccessオブジェクト


例外:

java.lang.IllegalArgumentException

パラメタ「Xpath」がnullまたは空のオブジェクトの場合

com.fujitsu.form.XmlProcessorException

次に示すどちらかの場合

  • XMLパーサでエラーが発生した場合

  • ドキュメントオブジェクトの操作に失敗した場合

com.fujitsu.form.NoSuchItemException

パラメタ「Xpath」が処理中のドキュメントオブジェクトに存在しない場合

com.fujitsu.form.InvalidItemException

パラメタ「Xpath」が項目のXPathの場合


補足:

XmlDataAccessオブジェクトが次に示す例の場合、一般職の氏名を表す集団項目は、「一般職/氏名」となります。「一般職/氏名」で取得したXmlDataAccessオブジェクトの仮想ルートは、「氏名」となります。

例:

<名簿>
  <管理職>
    <氏名>
      <ふりがな>ふじつうたろう</ふりがな>
      <名前>富士通太郎</名前>
    </氏名>
  </管理職>
  <一般職>
    <氏名>
      <ふりがな>ふじつうはなこ</ふりがな>
      <名前>富士通花子</名前>
    </氏名>
  </一般職>
</名簿>

getValue(java.lang.String)

形式:

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は、次に示す形式です。

XPathの例

内容

aaa

子要素(XmlDataAccessオブジェクトを生成したときのルートノードの子)

aaa/bbb

相対指定(XmlDataAccessオブジェクトを生成したときのルートノードからの相対)

aaa/bbb[1]

繰り返し


戻り値:

項目に設定されている値(文字列)
項目のXPathが存在しない場合はnull。項目が空要素の場合は空のオブジェクト

例外:

java.lang.IllegalArgumentException

パラメタ「Xpath」がnullまたは空のオブジェクトの場合

com.fujitsu.form.XmlProcessorException

次に示すどちらかの場合

  • XMLパーサでエラーが発生した場合

  • ドキュメントオブジェクトの操作に失敗した場合

com.fujitsu.form.InvalidItemException

パラメタ「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
項目のXPathについては、getValueメソッド()を参照してください。

value

設定する値


例外:

java.lang.IllegalArgumentException

パラメタ「Xpath」がnullまたは空のオブジェクトの場合

com.fujitsu.form.XmlProcessorException

次に示すどちらかの場合

  • XMLパーサでエラーが発生した場合

  • ドキュメントオブジェクトの操作に失敗した場合

com.fujitsu.form.InvalidItemException

パラメタ「Xpath」がデータルートまたは集団項目のXPathの場合

com.fujitsu.form.NoSuchItemException

パラメタ「Xpath」が処理中のドキュメントオブジェクトに存在しない場合

copy(org.w3c.dom.Document)

形式:

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>

パラメタ:

doc

ドキュメントオブジェクト
コピーを行うXMLデータのドキュメントオブジェクトを指定してください。


例外:

java.lang.IllegalArgumentException

パラメタ「doc」がnullまたは空のオブジェクトの場合

com.fujitsu.form.XmlProcessorException

次に示すどちらかの場合

  • 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){
      // 例外処理
                    ・
                    ・
                    ・
    }
  }
}