BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Integration > AI トピック > アダプタの開発 > XML Toolkit |
アダプタの開発
|
XML Toolkit
BEA WebLogic Integration の Adapter Development Kit (ADK) に付属している XML ToolKit を使用すると、有効な XML ドキュメントを作成し、アダプタを介して EIS から別のアプリケーションに情報を送信できます。XML 操作に必要な処理の多くを 1 箇所に統合できるので、作業を軽減できます。
この章の内容は以下のとおりです。
Toolkit パッケージ
XML Toolkit は、主に 2 つの Java パッケージから構成されます。
これらのパッケージは、xmltoolkit.jar ファイル内にあり、WebLogic Integration のインストール時に、ADK と一緒にインストールされます。ここには、クラス、インタフェース、およびメソッドに関する詳細な Javadoc が格納されています。Javadoc を参照するには、次のディレクトリに移動してください。
WLI_HOME/docs/apidocs/index.html
この URL で、WLI_HOME のフォルダには、WebLogic Integration がインストールされています。
IDocument
com.bea.document.IDocument
IDocument は、W3C Document Object Model (DOM) と XPath インタフェースを XML ドキュメント内の要素に統合するコンテナです。この統合により、XPath 文字列を使用するだけで、IDocument オブジェクトをクエリおよび更新できます。XPath 文字列を使用すると、クエリする要素だけを指定し、そのクエリへの応答を返すことができるため、XML ドキュメント全体を解析して、特定の情報を探す必要がなくなります。
たとえば、リストB-1 で示す XML ドキュメントには、「Bob」という人物に関する記述がされています。
コードリスト B-1 XML の例
<Person name="Bob">
<Home squareFeet="2000"/>
<Family>
<Child name="Jimmy">
<Stats sex="male" hair="brown" eyes="blue"/>
</Child>
<Child name="Susie">
<Stats sex="female" hair="blonde" eyes="brown"/>
</Child>
</Family>
</Person>
ここで、<child> 要素から、「Jimmy」の髪の色を検索するとします。DOM を使用する場合、リストB-2 に示すようなコードを使用する必要があります。
コードリスト B-2 DOM データのサンプル検索
String strJimmysHairColor = null;
org.w3c.dom.Element root = doc.getDocumentElement();
if (root.getTagName().equals("Person") && root.getAttribute("name").
equals("Bob") {
org.w3c.dom.NodeList list = root.getElementsByTagName("Family"); if
(list.getLength() > 0) {
org.w3c.dom.Element family = (org.w3c.dom.Element)list.item(0);
org.w3c.dom.NodeList childList = family.getElementsByTagName ("Child");
for (int i=0; i < childList.getLength(); i++) {
org.w3c.dom.Element child = childList.item(i);
if (child.getAttribute("name").equals("Jimmy")) {
org.w3c.dom.NodeList statsList = child.
getElementsByTagName("Stats");
if (statsList.getLength() > 0) {
org.w3c.dom.Element stats = statsList.item(0);
strJimmysHairColor = stats.getAttribute("hair");
}
}
}
}
}
IDocument を使用すれば、リストB-3 に示すような XPath 文字列を作成し、同じように「Jimmy」の髪の色を検索できます。
コードリスト B-3 IDocument データのサンプル検索
System.out.println("Jimmy's hair color: " + person.getStringFrom
("//Person[@name=¥"Bob¥"] /Family/Child[@name=¥"Jimmy¥"]/Stats/@hair");
このように、IDocument を使用すると、簡単なコードでドキュメント内の情報をクエリおよび検索できます。
Schema Object Model (SOM)
SOM は、XML スキーマを構築するためのインタフェースです。アダプタによって、特定の要求メタデータや応答メタデータの EIS が呼び出されます。このメタデータは、その後 XML スキーマにプログラマティックに変換する必要があります。SOM は、複雑なスキーマ構文などの詳細な一般 XML スキーマ情報を数多く抽出し、有効性を検証するための一連のツールです。このツールを使うことで、XML ドキュメントの重要度のより高い作業に専念できます。
SOM の仕組み
XML スキーマは、アダプタで接続している EIS とアダプタ側のアプリケーションとの間で、いわば契約書のような役割を果たします。この契約書では、アプリケーションで操作を行うために、EIS のデータをどのように表示するかが定義されます。ドキュメント(XML で記述された EIS のメタデータの集合)は、スキーマで定義されたルールに準拠していれば、ドキュメントの XML コードが正しいかどうかに関係なく、有効とみなされます。たとえば、<name> 要素に名前を表示するスキーマを定義していて、この要素が<firstname> と <lastname> の 2 つの子要素を必要とする場合、EIS のドキュメントを有効にするには、このドキュメントをリストB-4 に示すフォームで表示し、スキーマをリストB-5 のように定義する必要があります。
コードリスト B-4 ドキュメント例
<name>
<firstname>Joe</firstname>
<lastname>Smith</lastname>
</name>
コードリスト B-5 スキーマ例
<スキーマ>
<element name="name">
<complexType>
<sequence>
<element name="firstname" />
<element name="lastname" />
</sequence>
</complexType>
</element>
</schema>
正しい XML コードとして作成されていても、<name></name> 以外のフォームは無効です。次に示すフォームは、無効の一例です。
<name>Joe Smith</name>
スキーマの作成
SOM にあるクラスおよびメソッドを使用して、プログラムで XML スキーマを作成できます。このツールを使用することの利点は、プログラムに変数を入力するだけで、スキーマを要求に応じて調整できることです。たとえば、次のコード例は購買発注ドキュメントを検証するスキーマを作成するためのものです。リストB-6 によって、スキーマが設定されて必要な要素が追加されます。
コードリスト B-6 購買発注スキーマ
import com.bea.schema.*;
import com.bea.schema.type.SOMType;
public class PurchaseOrder
{
public static void main(String[] args)
{
System.out.println(getSchema().toString());
}
public static SOMSchema getSchema()
{
SOMSchema po_schema = new SOMSchema();
po_schema.addDocumentation("Purchase order schema for
Example.com.¥nCopyright 2000 Example.com.¥nAll rights
reserved.");
SOMElement purchaseOrder =
po_schema.addElement("purchaseOrder");
SOMElement comment = po_schema.addElement("comment");
SOMComplexType usAddress =
po_schema.addComplexType("USAddress");
SOMSequence seq2 = usAddress.addSequence();
// adding an object to a SOMSchema defaults to type="string"
seq2.addElement("name");
seq2.addElement("street");
seq2.addElement("city");
seq2.addElement("state");
seq2.addElement("zip", SOMType.DECIMAL);
属性の設定は、リストB-7 で示すように、要素の作成と同じようにして行うことができます。属性を正しく設定するには、アドレスを正確に記述する必要があります。
コードリスト B-7 親属性の設定
SOMAttribute country_attr = usAddress.addAttribute("country",
SOMType.NMTOKEN);
country_attr.setUse("fixed");
country_attr.setValue("US");
リストB-8 で示すように、complexTypes と同様に、simpleTypes をスキーマのルートに追加できます。
コードリスト B-8 SimpleTypes をスキーマ ルートに追加
SOMSimpleType skuType = po_schema.addSimpleType("SKU");
SOMRestriction skuRestrict = skuType.addRestriction
(SOMType.STRING);
skuRestrict.setPattern("¥¥d{3}-[A-Z]{2}");
SOMComplexType poType =
po_schema.addComplexType("PurchaseOrderType");
purchaseOrder.setType(poType);
poType.addAttribute("orderDate", SOMType.DATE);
SOMComplexType オブジェクトの addSequence() メソッドによって、SOMSequence 参照が返されるため、ユーザはそのスキーマに追加された要素を変更できます。リストB-9 で示すように、このようにしてオブジェクトがスキーマに追加されます。
コードリスト B-9 要素を変更するための addSequence() の実装
SOMSequence poType_seq = poType.addSequence();
poType_seq.addElement("shipTo", usAddress);
poType_seq.addElement("billTo", usAddress);
スキーマ内の要素の属性を設定するには、SOMElement オブジェクトのセッター メソッドを呼び出します。たとえば、リストB-10 は、setMinOccurs() と setMaxOccurs() の実装方法を示します。
コードリスト B-10 setMinOccurs() および setMaxOccurs() の実装
SOMElement commentRef = new SOMElement(comment);
commentRef.setMinOccurs(0);
poType_seq.add(commentRef);
SOMElement poType_items = poType_seq.addElement("items");
SOMComplexType itemType = po_schema.addComplexType("Items");
SOMSequence seq3 = itemType.addSequence();
SOMElement item = new SOMElement("item");
item.setMinOccurs(0);
item.setMaxOccurs(-1);
seq3.add(item);
SOMComplexType t = new SOMComplexType();
item.setType(t);
SOMSequence seq4 = t.addSequence();
seq4.addElement("productName");
SOMElement quantity = seq4.addElement("quantity");
SOMSimpleType st = new SOMSimpleType();
quantity.setType(st);
SOMRestriction restrict =
st.addRestriction(SOMType.POSITIVEINTEGER);
restrict.setMaxExclusive("100");
この例では、PurchaseOrderType の items 要素は、Items タイプの前で作成されています。このため、リストB-11 に示すコードを使用して、Items タイプ オブジェクトが利用可能になったら、参照を作成してタイプを設定する必要があります。
コードリスト B-11 品目タイプ オブジェクトが使用可能になった時点でのタイプの設定
poType_items.setType(itemType);
最後に、要素をスキーマに追加します。要素を追加するには、SOMSequence の addElement() メソッド、または以前に作成した SOMElement の add() メソッドを実装します。リストB-12 は、この 2 つのメソッドを示します。
コードリスト B-12 スキーマへの要素の追加
seq4.addElement("USPrice", SOMType.DECIMAL);
SOMElement commentRef2 = new SOMElement(comment);
commentRef2.setMinOccurs(0);
seq4.add(commentRef2);
SOMElement shipDate = new SOMElement("shipDate", SOMType.DATE);
shipDate.setMinOccurs(0);
seq4.add(shipDate);
t.addAttribute("partNum", skuType);
return po_schema;
}
}
結果として作成されるスキーマ
前の 7 つのリスト(リストB-6 から リストB-12 まで)で示したコードを実行すると、リストB-13 に示すスキーマが作成されます。
コードリストB-13 XML スキーマ定義ドキュメント
<?xml version="1.0" ?>
<!DOCTYPE schema (View Source for full doctype...)>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/XMLSchema">
<xsd:annotation>
<xsd:documentation>Purchase order schema for Example.com.
Copyright 2000 Example.com. All rights
reserved.</xsd:documentation>
</xsd:annotation>
<xsd:simpleType name="SKU">
<xsd:annotation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:pattern value="¥d{3}-[A-Z]{2}" />
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element type="USAddress" name="shipTo" />
<xsd:element type="USAddress" name="billTo" />
<xsd:element ref="comment" minOccurs="0" />
<xsd:element type="Items" name="items" />
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date" />
</xsd:complexType>
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="item"
minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element type="xsd:string"
name="productName"/>
<xsd:element name="quantity">
<xsd:simpleType>
<xsd:restriction base=
"xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element type="xsd:decimal" name=
"USPrice" />
<xsd:element ref="comment"
minOccurs="0" />
<xsd:element type="xsd:date"
name="shipDate" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="partNum" type="SKU" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element type="xsd:string" name="name" />
<xsd:element type="xsd:string" name="street" />
<xsd:element type="xsd:string" name="city" />
<xsd:element type="xsd:string" name="state" />
<xsd:element type="xsd:number" name="zip" />
</xsd:sequence>
<xsd:attribute name="country" use="fixed" value="US"
type="xsd:NMTOKEN" />
</xsd:complexType>
<xsd:element type="PurchaseOrderType" name="purchaseOrder" />
<xsd:element type="xsd:string" name="comment" />
</xsd:schema>
XML ドキュメントの検証
次に、リストB-13 のスキーマを使用して、EIS から送られたドキュメントを検証します。たとえば、リストB-14 に示すドキュメントでは、先ほど作成したスキーマに基づいて検証します。
コードリスト B-14 検証対象の XML ドキュメント
<?xml version="1.0" ?>
<!DOCTYPE PurchaseOrder (View Source for full doctype...)>
<purchaseOrder orderDate="1/14/00">
<shipTo Country=“US”>
<name>Bob Jones</name>
<street>1000 S. 1st Street</street>
<city>Denver</city>
<state>CO</state>
<zip>80111</zip>
</shipTo>
<billTo Country=“US”>
<name>Bob Jones</name>
<street>1000 S. 1st Street</street>
<city>Denver</city>
<state>CO</state>
<zip>80111</zip>
</billTo>
<comment>None</comment>
<items>
<item partNum=“123-AA”>
<productName>Washer</productName>
<quantity>20</quantity>
<USPrice>0.22</USPrice>
<comment>Only shipped 10</comment>
<shipDate>1/14/00</shipDate>
</item>
<item partNum=“123-BB”>
<productName>Screw</productName>
<quantity>10</quantity>
<USPrice>0.30</USPrice>
<comment>None</comment>
<shipDate>1/14/00</shipDate>
</item>
</items>
</purchaseOrder>
ドキュメントの検証方法
SOM では、SOMSchema メソッドの isValid() を使用して、XML DOM ドキュメントの検証ができます。SOMElement クラスには対応する isValid() メソッドがあり、DOM ドキュメントではない要素の検証を行います。
この isValid() メソッドでは、ドキュメントまたは要素が有効の場合には確定し、無効の場合にはエラー リストをコンパイルします。ドキュメントが有効な場合、isValid()によって True が返され、エラー リストは空白になります。
isValid() の実装
リストB-15 では、isValid() を実装するための 2 つの方法を示します。
コードリスト B-15 isValid() の実装例
public boolean isValid(org.w3c.dom.Document doc,
java.util.List errorList)
public boolean isValid(IDocument doc,
List errorList)
以下のパラメータを使用します。
このスキーマに基づいて、ドキュメントが有効であると判断されると、isValid() は、True のブール値を返します。有効でないと判断されると、isValid() は False を返し、errorList が作成されます。
errorList は、doc ドキュメント内で検出されたエラーを報告するためのもので、java.util.List です。ドキュメントの検証前に、エラー リストはクリアされます。このため、使用するリスト実装は、clear() メソッドをサポートしている必要があります。isValid() が False を返す場合、エラー リストには、バリデーション プロシージャの実行中に検出されたエラーが入力されます。リスト内の項目は、クラス com.bea.schema.SOMValidationException のインスタンスです。isValid() が True を返す場合、errorList は空白になります。
API の詳細については、次の URL のisValid() の Javadoc を参照してください。
WLI_HOME/docs/apidocs/com/bea/SOMSchema.html
isValid() の実装例
リストB-16 に、isValid() の実装例を示します。
コードリスト B-16 isValid() の実装例
SOMSchema schema = ...;
IDocument doc = DocumentFactory.createDocument(new FileReader(f));
java.util.LinkedList errorList = new java.util.LinkedList();
boolean valid = schema.isValid(doc, errorList);...
if (! valid){
System.out.println("Document was invalid. Errors were:");
for (Iterator i = errorList.iterator; i.hasNext();)
{
System.out.println(((SOMValidationException) i.next).
toString());
}
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |