ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server XML プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55533-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

2 XML の概要

以下の節では XML テクノロジと WebLogic Server XML サブシステムについて概説します。

XML とは

Extensible Markup Language (XML) とは、ドキュメント内のデータの内容および構造を示すのに使用するマークアップ言語です。XML は、Standard Generalized Markup Language (SGML) を簡素化したものです。XML は、インターネット上でコンテンツを配信するための業界標準です。XML には新しいタグを定義する機能があるので、拡張が可能です。

HTML と同じように、XML でもタグを使用してコンテンツを記述します。しかし、XML のタグはコンテンツの表示方法ではなく、データの意味と階層構造を表します。この機能を使用すれば、異なるプログラムやシステム間でのデータ交換を効率化するために必要な高度なデータ型を定義できます。さらに、XML ではコンテンツと表現を分離できるため、コンテンツ (データ) を異種システム間で移植できます。

XML 構文では、一対の開始タグと終了タグ (<name></name> など) を使用して情報をマークアップします。タグで区切られる情報のことを、要素と呼びます。どの XML ドキュメントにもルート要素が 1 つあります。ルート要素は、他のすべての要素を含む最上位の要素です。他の要素内に含まれる要素をしばしば下位要素と言います。要素には、名前と値のペアという構造の属性が付くことがあります。属性は、要素の一部として要素をさらに定義するのに使用します。

次のサンプル XML ファイルでは、アドレス帳の内容を説明します。

<?xml version="1.0"?>

<address_book>
  <person gender="f">
    <name>Jane Doe</name>
    <address>
      <street>123 Main St.</street>
      <city>San Francisco</city>
      <state>CA</state>
      <zip>94117</zip>
    </address>
    <phone area_code=415>555-1212</phone>
  </person>
  <person gender="m">
    <name>John Smith</name>
    <phone area_code=510>555-1234</phone>
    <email>johnsmith@somewhere.com</email>
  </person>
</address_book>

XML ファイルのルート要素は address_book です。アドレス帳には現在、person 要素の形で「Jane Doe」と「John Smith」の 2 つのエントリがあります。Jane Doe のエントリには住所と電話番号、John Smith のエントリには電話番号と電子メール アドレスがあります。この XML ドキュメントの構造では、要素の本体の下位要素ではなく、phone 要素に area_code 属性を指定して市外局番を格納するように定義しています。すべての下位要素が person 要素で必須であるわけではないことにも注意してください。

XML ドキュメントの記述方法

XML ドキュメントの記述方法には、XML スキーマと DTD の 2 種類があります。

XML スキーマは、特定の XML ドキュメントの構造で基本的に必要なものを定義します。スキーマでは、XML ドキュメントで有効な要素と属性、およびそれらが有効となるコンテキストを定義します。言い換えれば、スキーマでは特定のタグ内で有効なタグ、およびオプションのタグと属性を指定します。スキーマは、それ自体が XML ファイルです。

スキーマ仕様は、World Wide Web Consortium (W3C) によって策定されました。XML スキーマの詳細については、http://www.w3.org/TR/xmlschema-0/ を参照してください。

次の例では、上のアドレス帳のサンプル XML ドキュメントを定義するスキーマを示します。

<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema">

<xsd:complexType name="personType">
  <xsd:element   name="name"     type="xsd:string"/>
  <xsd:element   name="address"  type="addressType"/>
  <xsd:element   name="phone"    type="phoneType"/>
  <xsd:element   name="email"    type="xsd:string"/>
  <xsd:attribute name="gender"   type="xsd:string"/> 
</xsd:complexType>

<xsd:complexType name="addressType">
  <xsd:element   name="street"  type="xsd:string"/>
  <xsd:element   name="city"    type="xsd:string"/>
  <xsd:element   name="state"   type="xsd:string"/>
  <xsd:element   name="zip"     type="xsd:string"/>
</xsd:complexType>

<xsd:simpleType name="phoneType">
  <xsd:restriction base="xsd:string"/>
  <xsd:attribute name="area_code" type="xsd:string"/>
</xsd:simpleType>

</xsd:schema>

XML スキーマよりも古いテクノロジである文書型定義 (Document Type Definition : DTD) ファイルを使用して XML ドキュメントを記述することもできます。DTD は XML ファイルではありません。

次の例では、上のアドレス帳のサンプル XML ドキュメントを定義する DTD を示します。

<!DOCTYPE address_book [
<!ELEMENT person (name, address?, phone?, email?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (street, city, state, zip)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT zip (#PCDATA)> 
<!ATTLIST person gender CDATA #REQUIRED>
<!ATTLIST phone area_code CDATA #REQUIRED>
]>

XML ドキュメントでは、ドキュメント自体の一部としてスキーマまたは DTD を指定することも、外部スキーマまたは DTD を参照することも、スキーマや DTD をまったく指定または参照しないようにすることもできます。次の XML ドキュメントの抜粋に、address.dtd という外部 DTD を参照する方法を示します。

<?xml version=1.0?>
<!DOCTYPE address_book SYSTEM "address.dtd">
<address_book>
...

XML ドキュメントは、パーサで検証する場合、または複雑なタイプが含まれる場合にのみスキーマまたは DTD を付ける必要があります。XML ドキュメントは、1) 関連するスキーマまたは DTD がある場合、および 2) 関連するスキーマまたは DTD に定義されている制約に準拠している場合に有効であると見なされます。ただし、XML ドキュメントが整形式でなければならない場合は、ドキュメントにスキーマまたは DTD を付ける必要はありません。W3C の XML 1.0 勧告のすべてのルールに従っている場合、ドキュメントは整形式と見なされます。XML 1.0 仕様の完全な説明については、http://www.w3.org/XML/ を参照してください。

XML を使用する理由

通常、ある業界では、その業界にとって意味がある固有のデータ交換方式を使用しています。電子商取引の誕生により、企業ではさまざまな業界と関係を結ぶようになっています。このため、こうした企業は、これらの業界で使用されるさまざまな電子通信プロトコルに関する専門知識を取得しなければなりません。

XML は拡張性に優れているため、さまざまな業界間のデータ交換フォーマットを標準化するための非常に効果的なツールとなっています。たとえば、複数の業界間または一企業内の複数の部門間でメッセージ ブローカとワークフロー エンジンがトランザクションを調整しなければならない場合、XML を使用すると、異なるソースからのデータを組み合わせて、すべての当事者が理解できる 1 つのフォーマットを作成できます。

XSL と XSLT とは

Extensible Stylesheet Language (XSL) は、XML ドキュメントに適用する表示のルールを記述するための W3C の規格です。XSL には、変換言語 (XSLT) とフォーマット言語の両方が含まれます。この 2 つの言語は、互いに独立して機能します。XSLT は XML ベースの言語で、XML ドキュメントを別の XML ドキュメントに、または HTML、PDF、その他の文書フォーマットに変換する方法を記述するための W3C の仕様です。

XSLT トランスフォーマは、XML ドキュメントと XSLT ドキュメントを入力として受け付けます。XSLT ドキュメントに定義されるテンプレート ルールには、そのルールの適用先となる XML ツリーを指定するパターンが含まれています。XSLT トランスフォーマは、XML ドキュメントをスキャンしてルールに一致するパターンを見つけ出し、元の XML ドキュメントの該当するセクションにテンプレートを適用します。

DOM と SAX とは

DOM および SAX は、XML データ解析のための 2 つの標準 Java アプリケーション プログラミング インタフェース (API) です。いずれも、WebLogic Server デフォルト パーサによりサポートされます。この 2 つの API は、解析に対して異なるアプローチをとっており、それぞれの API に長所と短所があります。

SAX

SAX は Simple API for XML の略語です。SAX は、イベント ベースの XML 解析用標準インタフェースで、プラットフォームや言語に依存しません。SAX は、パーサが要素の最初または最後などの XML ドキュメントを読み取る際に発生するイベントを定義します。プログラマは、ドキュメント解析時に異なるイベントを処理するハンドラを提供します。

XML ドキュメントを解析するために SAX API を使用するプログラマは、これらのイベントが発生したときに起こることを完全に制御する権限を持ち、解析プロセスをカスタマイズできます。たとえば、プログラマは、ドキュメントが不正であることを示すエラーがパーサで発生したときに、ドキュメントがすべて解析されるまで待つのではなく、すぐに XML ドキュメントの解析を中止できるので、パフォーマンスが向上します。

WebLogic Server のデフォルト パーサ (JDK 5.0 に付属のパーサ) は、SAX バージョン 2.0 をサポートしています。SAX バージョン 1.0 を使用して XML ドキュメントを解析するプログラムを作成した場合は、2 つのバージョンの相違点を把握し、それに従ってプログラムを更新する必要があります。2 つのバージョンの相違点については、http://www.saxproject.org/ を参照してください。

DOM

DOM は Document Object Model の略語です。DOM は、プラットフォームや言語に依存しないインタフェースであり、DOM を使用することにより、プログラムとスクリプトは XML ドキュメントのコンテンツ、構造、およびスタイルに動的にアクセスして、それらを更新できます。DOM は、XML ドキュメントをメモリに読み込んでツリー表示します。ツリーの各ノードは、元の XML ドキュメントからの特定のデータの一部を表します。ツリー構造は、データを表すための標準プログラミング メカニズムで、Java を使用したツリーのナビゲートおよび操作を簡単に素早く、かつ効率的に実行できます。しかし、DOM でツリーを作成するために XML ドキュメント全体をメモリに読み込む必要があるため、XML ドキュメントのサイズが大きくなると、アプリケーションのパフォーマンスが低下するという欠点があります。

WebLogic Server のデフォルト パーサ (JDK 5.0 に付属のパーサ) は、DOM Level 2.0 Core をサポートしています。DOM Level 1.0 を使用して XML ドキュメントを解析するプログラムを作成した場合は、2 つのバージョンの相違点を把握し、それに従ってプログラムを更新する必要があります。相違点の詳細については、http://www.w3.org/DOM/DOMTR を参照してください。

Streaming API for XML (StAX) とは

SAX と DOM だけでなく、Streaming API for XML (StAX) を使用して XML ドキュメントを解析および生成することもできます。

StAX は、XML を読み書きするための双方向 API を記述する Java Community Process 仕様です。StAX を使用すると、単純なイテレータベースの API とイベントの基底のストリームをエクスポーズすることで、解析を制御できます。API には、コールバック内のイベントを処理するのではなく次のイベントを問い合わせることができる next()hasNext() などのメソッドがあります。これにより、より整った手順に従って XML ドキュメントを処理できるようになります。

DOM や SAX と異なり、StAX は、まだ Java API for XML Processing (JAXP) の一部ではありません。


注意 :

旧バージョンの WebLogic Server には、これによく似た WebLogic XML Streaming API という独自の API がありました。StAX は、この API を基にしています。WebLogic XML Streaming API はこのリリースの WebLogic Server でもアクセス可能ですが、その機能は WebLogic Server リリース 9.0 の時点で非推奨になっています。プログラマは、代わりに StAX を使用してください。

StAX の使用の詳細については、「Streaming API for XML (StAX) の使い方」を参照してください。

JAXP とは

前の節では、XML データの解析に使用できる API、SAX、DOM について説明しました。Java API for XML Processing (JAXP) は、これらのパーサにアクセスする手段を提供します。JAXP はまた、どのような仕様のパーサまたはトランスフォーマも使用できるプラグイン可能レイヤも定義します。

WebLogic Server には、XML アプリケーションの開発と、WebLogic Server で構築した XML アプリケーションを他の Web アプリケーション サーバに移植するのに必要な作業を容易にするために、JAXP が実装されています。JAXP は、XML アプリケーションの移植性を高めるために Sun Microsystems で開発されました。JAXP では、Java プラットフォームの API の標準セットを介して XML ドキュメントを解析および変換するための基本機能がサポートされています。WebLogic Server 配布キット内の JAXP 1.2 は、デフォルト パーサを使用するコンフィグレーションになっています。したがって、WebLogic Server で構築される XML アプリケーションでは、デフォルトで JAXP を使用します。

WebLogic Server 配布キットには、JAXP 1.2 で必要なインタフェースとクラスがあります。JAXP 1.2 は、SAX バージョン 2 と DOM Level 2 を明示的にサポートしています。

JAXP パッケージ

JAXP には、以下の 2 つのパッケージがあります。

  • javax.xml.parsers

  • javax.xml.transform

javax.xml.parsers パッケージには、SAX バージョン 2.0 および DOM Level 2.0 モードで XML データを解析するためのクラスがあります。XML ドキュメントを SAX モードで解析するには、まず newInstance() メソッドで新しい SaxParserFactory オブジェクトのインスタンスを作成します。このメソッドは、明確に定義された場所のリストを基に、ロードするパーサの特定の実装をルックアップします。次に、SaxParserFactory から SaxParser インスタンスを取得し、その parse() メソッドを実行して、解析する XML ドキュメントにそれを渡します。XML ドキュメントを DOM モードで解析する場合に似ていますが、この場合は DocumentBuilder クラスと DocumentBuilderFactory クラスを使用します。

JAXP による XML ドキュメント解析の詳細については、「XML ドキュメントの解析」を参照してください。

javax.xml.transform パッケージには、XML ドキュメント、DOM ツリー、SAX イベントなどの XML データを別の形式に変換するためのクラスがあります。トランスフォーマ クラスも、パーサ クラスと同じように機能します。XML ドキュメントを変換するには、まず newInstance() メソッドで新しい TransformerFactory オブジェクトのインスタンスを作成します。このメソッドは、明確に定義された場所のリストを基に、ロードする XSLT トランスフォーマの特定の実装をルックアップします。次に、特定の XSLT スタイルシートを基に新しい Transformer オブジェクトのインスタンスを作成し、その transform() メソッドを実行して、変換する XML オブジェクトに渡します。XML オブジェクトは、XML ファイルでも DOM ツリーなどでもかまいません。

JAXP による XML オブジェクト変換の詳細については、「JAXP による XML データの変換」を参照してください。

JAXP 1.2 の新機能

J2EE 1.4 には、バージョン 1.2 の JAXP が含まれています。JAXP バージョン 1.2 は、1.1 バージョンを基に、W3C XML スキーマのサポートを加えたものです。特に、JAXP バージョン 1.2 は、XML スキーマ検証を有効にする新しいプロパティ文字列、使用するスキーマ言語、XML ファイルの検証時に使用する特定の XML スキーマ ファイルの場所を指定します。

以下のコードの抜粋では、SAX パーサ使用時のスキーマ検証を設定する方法を示します。

try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        spf.setValidating(true);
        SAXParser sp = spf.newSAXParser();
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                       "http://www.w3.org/2001/XMLSchema");
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",
                       "http://www.example.com/Report.xsd");
        DefaultHandler dh = new DefaultHandler();
        sp.parse("http://www.wombats.com/foo.xml", dh);
    } catch(SAXException se) {
        se.printStackTrace();
    }

詳細については、http://java.sun.com/xml/jaxp/change-requests-11.html で「JAXP 1.2 Approved Changes」を参照してください。

XML と XSLT の一般的な使い方

XML と XSLT をどのように使用するかは、ビジネス上のニーズによって異なります。

XML と XSLT を使用したコンテンツと表示の分離

XML と XSLT は、複数のクライアント タイプをサポートするアプリケーションでよく使用されます。たとえば、ブラウザ ベースのクライアントと Wireless Application Protocol (WAP) クライアントの両方をサポートする Web ベース アプリケーションを使用しているとします。これらのクライアントでは、それぞれ HTML と Wireless Markup Language (WML) という異なるマーク付け言語を理解しますが、アプリケーションでは両方に適したコンテンツを提供しなければなりません。

これを実現するには、クライアントに送信するデータを表す XML ドキュメントを最初に作成するようにアプリケーションを記述します。次に、アプリケーションは、データを表す XML ドキュメントを、クライアントのブラウザ タイプによって HTML または WML に変換します。アプリケーションでは、HTTP リクエストの User-Agent リクエスト ヘッダを調べることによって、クライアントのブラウザ タイプを認識できます。クライアントのブラウザ タイプを認識すると、適切な XSLT スタイル シートを使用して、適切なマーク付け言語にドキュメントを変換します。このヘッダ情報へのアクセス方法の例については、WebLogic Server 配布キットの examples/servlets ディレクトリに収められている SnoopServlet サンプルを参照してください。

このように、クライアント タイプごとに異なるマーク付け言語を使用して同じ XML ドキュメントを表示する方法を用いると、複数のクライアント タイプのサポートに必要な努力を、適切な XSLT スタイル シートの開発に集中させることができます。さらに、必要な場合は、アプリケーションを他のクライアント タイプに簡単に適合させることができます。

XSLT の詳細については、「その他の XML 仕様と情報」を参照してください。

企業間通信用メッセージ フォーマットとしての XML

企業間 (B2B) 環境で、企業 A と企業 B は両者間の電子商取引に関する情報の交換を望んでいます。企業 A は大手の電子商取引サイトです。企業 B は、企業 A の製品を最適な顧客集団に販売する小規模な子会社です。企業 B が企業 A に顧客情報を送ると、企業 B は企業 A から 2 通りの方法で対価を受け取ることができます。企業 B は、金銭、および企業 B が提供した顧客と同じ購買層の他の顧客に関する情報を企業 A から受け取ります。情報を交換するためには、企業 A と企業 B は、マシンが理解できてどちらの企業のシステムでも簡単に処理できるデータ フォーマットについて合意する必要があります。XML は、このシナリオで使用する論理データ フォーマットですが、このフォーマットの選択はほんの第一歩に過ぎません。次に両企業は、交換する XML メッセージのフォーマットについて合意しなければなりません。企業 A はその子会社と 1 対多の関係にあるため、やり取りする XML メッセージのフォーマットは企業 A 側で定義する必要があります。

XML メッセージ、つまり XML ドキュメントのフォーマットを定義するために、企業 A は 2 種類の文書型定義 (DTD) を作成します。1 つは企業 A が提供する顧客情報を記述するもので、もう 1 つは企業 A が受け取る新しい子会社の情報を記述するものです。企業 B も、2 種類の DTD を作成します。1 つは企業 A から受け取る XML ドキュメントを処理するためのもの、もう 1 つは企業 A 側で処理できるフォーマットで XML ドキュメントを作成するためのものです。