この章の内容は以下のとおりです。
Extensible Markup Language (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スキーマと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を使用すると、異なるソースからのデータを組み合せて、すべての当事者が理解できる1つのフォーマットを作成できます。
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は、XMLデータ解析のための2つの標準Javaアプリケーション・プログラミング・インタフェース(API)です。いずれも、WebLogic Serverデフォルト・パーサーによりサポートされます。この2つのAPIは、解析に対して異なるアプローチをとっており、それぞれのAPIに長所と短所があります。
SAXはSimple API for XMLの略語です。イベント・ベースのXML解析用標準インタフェースで、プラットフォームや言語に依存しません。SAXは、パーサーが要素の最初または最後などのXMLドキュメントを読み取る際に発生するイベントを定義します。プログラマは、ドキュメント解析時に異なるイベントを処理するハンドラを提供します。
XMLドキュメントを解析するためにSAX APIを使用するプログラマは、これらのイベントが発生したときに起こることを完全に制御する権限を持ち、解析プロセスをカスタマイズできます。たとえば、プログラマは、ドキュメントが不正であることを示すエラーがパーサーで発生したときに、ドキュメントがすべて解析されるまで待つのではなく、すぐにXMLドキュメントの解析を中止できるので、パフォーマンスが向上します。
WebLogic Serverのデフォルト・パーサー(JDKに付属のパーサー)は、SAXバージョン2.0をサポートしています。SAXバージョン1.0を使用してXMLドキュメントを解析するプログラムを作成した場合は、2つのバージョンの相違点を把握し、それに従ってプログラムを更新する必要があります。2つのバージョンの相違点については、http://www.saxproject.org/
を参照してください。
DOMはDocument Object Model の略語です。プラットフォームや言語に依存しないインタフェースであり、これを使用することにより、プログラムとスクリプトはXMLドキュメントのコンテンツ、構造、およびスタイルに動的にアクセスして、それらを更新できます。DOMは、XMLドキュメントをメモリーに読み込んでツリー表示します。ツリーの各ノードは、元のXMLドキュメントからの特定のデータの一部を表します。ツリー構造は、データを表すための標準プログラミング・メカニズムで、Javaを使用したツリーのナビゲートおよび操作を簡単に素早く、かつ効率的に実行できます。しかし、DOMでツリーを作成するためにXMLドキュメント全体をメモリーに読み込む必要があるため、XMLドキュメントのサイズが大きくなると、アプリケーションのパフォーマンスが低下するという欠点があります。
WebLogic Serverのデフォルト・パーサー(JDKに付属のパーサー)は、DOM Level 2.0 Coreをサポートしています。DOM Level 1.0を使用してXMLドキュメントを解析するプログラムを作成した場合は、2つのバージョンの相違点を把握し、それに従ってプログラムを更新する必要があります。相違点の詳細は、http://www.w3.org/DOM/DOMTR
を参照してください。
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)の使い方」を参照してください。
前の節では、XMLデータの解析に使用できるAPI、SAX、DOMについて説明しました。Java API for XML Processing (JAXP)は、これらのパーサーにアクセスする手段を提供します。JAXPはまた、どのような仕様のパーサーまたはトランスフォーマも使用できるプラガブル・レイヤーも定義します。
WebLogic Serverには、XMLアプリケーションの開発と、WebLogic Serverで構築したXMLアプリケーションを他のWebアプリケーション・サーバーに移植するのに必要な作業を容易にするために、JAXPが実装されています。JAXPは、XMLアプリケーションの移植性を高めるために開発されました。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には、以下の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データの変換」を参照してください
Java EE 1.4には、バージョン1.2のJAXPが含まれています。JAXPバージョン1.2は、1.1バージョンを基に、W3C XMLスキーマのサポートを加えたものです。特に、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://docs.oracle.com/javase/6/docs/technotes/guides/xml/jaxp/index.html
を参照してください。
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仕様と情報」を参照してください
企業間(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ドキュメントを作成するためのものです。