Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Caché XML ツールの概要

このドキュメントでは、Caché XML ツールの使用方法について説明します。

Caché は、オブジェクトが持つ高度な機能を XML 処理に応用しています。このため、オブジェクトを使用して XML ドキュメントを直接表現できると共に、その逆も可能です。Caché には、ネイティブのオブジェクト・データベースが含まれているため、このようなオブジェクトを直接データベース内で使用できます。さらに、Caché には、XML ドキュメントと DOM (ドキュメント・オブジェクト・モデル) を操作するためのツールが用意されています。これらが Caché のいずれのクラスにも関連していない場合でも同じです。

以下の項目について説明します。

XML でのオブジェクト・データの表現

Caché XML ツールの一部は、主として XML 対応のクラスと併用することを目的としています。クラスを XML 対応にするには、そのスーパークラス・リストに %XML.AdaptorOpens in a new tab を追加します。%XML.AdaptorOpens in a new tab クラスを使用すると、そのクラスのインスタンスを XML ドキュメントとして表すことができます。クラス・パラメータとプロパティ・パラメータを追加して、プロジェクションを微調整します。オプションの数があまりにも多いため、"オブジェクトの XML への投影" というドキュメント全体が、これらのオプションにあてられています。

generated description: xmlobj

XML 対応のクラスでは、データは以下のすべての形式で使用できます。

  • クラス・インスタンスに含まれています。クラスによっては、データをディスクに保存することもでき、ディスク上では、他の永続クラスとまったく同じように使用できます。

  • XML ドキュメントに含まれています。これは、ファイルやストリームなどのドキュメントの場合もあります。

  • DOM (ドキュメント・オブジェクト・モデルOpens in a new tab) に含まれています。

以下の図は、これらの形式の間でデータを変換するために使用するツールの概要です。

generated description: data moving

%XML.WriterOpens in a new tab クラスを使用すると、XML ドキュメントを作成できます。出力先は通常、ファイルまたはストリームです。出力に含めるオブジェクトを特定します。そうすると、クラス定義内に確立されたルールに基づいて、出力が生成されます。詳細は、“Caché オブジェクトからの XML 出力の記述”、および “Caché からの XML のエクスポート” を参照してください。

%XML.ReaderOpens in a new tab を使用すると、クラスのインスタンスに適切な XML ドキュメントをインポートできます。ソースは通常、ファイルまたはストリームです。このクラスを使用するには、クラス名と XML ドキュメントに含まれている要素との間の相関関係を指定します。指定された要素は、対応するクラスで予想される構造になっている必要があります。次に、ノードごとにドキュメントを読み取ります。読み取ると、そのクラスのメモリ内インスタンスが作成され、そこには XML ドキュメント内で見つかったデータが含まれます。詳細は、“Caché オブジェクトへの XML のインポート” を参照してください。

XML ドキュメントを操作する場合には、DOM も役に立ちます。%XML.ReaderOpens in a new tab クラスを使用すると、XML ドキュメントを読み取り、それを表す DOM を作成できます。この表現では、DOM は一連のノードであり、必要に応じてノード間を移動します。具体的には、%XML.DocumentOpens in a new tab のインスタンスを作成します。これはドキュメント自体を表し、ノードを含みます。その後、%XML.NodeOpens in a new tab を使用し、ノードを検査して操作します。必要に応じて、%XML.WriterOpens in a new tab を使用して XML ドキュメントを再度記述します。詳細は、“XML ドキュメントの DOM 表現” を参照してください。

Caché XML ツールには、XML ドキュメントと DOM にあるデータにアクセスしたり、この両方を変更したりする方法が数多く用意されています。

任意の XML の作成

任意の XML、つまり Caché のいずれのクラスにもマップしない XML の作成と操作には、Caché XML ツールも使用できます。任意の XML ドキュメントを作成するには、%XML.WriterOpens in a new tab を使用します。このクラスには、要素の追加、属性の追加、ネームスペース宣言の追加などを行うメソッドが用意されています。

任意の DOM を作成するには、%XML.DocumentOpens in a new tab を使用します。このクラスには、1 つの空のノードと共に DOM を返すクラス・メソッドが用意されています。次に、必要に応じて、そのクラスのインスタンス・メソッドを使用してノードを追加します。

または、%XML.ReaderOpens in a new tab を使用して任意の XML ドキュメントを読み取り、そのドキュメントから DOM を作成します。

データへのアクセス

Caché XML ツールには、XML 形式のデータにアクセスする方法がいくつか用意されています。次の図に概要を示します。

generated description: data accessing

適格な XML ドキュメントでは、以下のクラスを使用して、そのドキュメント内のデータを操作できます。

Caché では、DOM は %XML.DocumentOpens in a new tab のインスタンスです。このインスタンスはドキュメント自体を表し、ノードを含みます。DOM から値を取得するには、このクラスのプロパティおよびメソッドを使用します。ノードの検査と操作には、%XML.NodeOpens in a new tab を使用します。詳細は、“XML ドキュメントの DOM 表現” を参照してください。

XML の変更

Caché XML ツールには、XML 形式のデータを変更する方法も用意されています。次の図に概要を示します。

generated description: data modifying

XML ドキュメントでは、%XML.XSLT.TransformerOpens in a new tab のクラス・メソッドを使用して、XSLT 変換を実行し、変更後のドキュメントを取得できます。“XSLT 変換の実行” を参照してください。

DOM では、%XML.DocumentOpens in a new tab のメソッドを使用して DOM を変更できます。例えば、要素または属性を追加するか、または削除することができます。

SAX パーサ

Caché XML ツールでは、Caché SAX (Simple API for XML) パーサが使用されます。これは、標準 Xerces ライブラリを使用した、組み込みの SAX XML 検証パーサです。SAX は、完全な XML 検証とドキュメントの解析を提供する解析エンジンです。Caché SAX は、高性能なプロセス内コールイン・メカニズムを使用して、Caché プロセスと通信します。Caché の組み込み XML サポートを使用するか、または Caché 内で独自のカスタム SAX インタフェース・クラスを提供することで、このパーサを使用して XML ドキュメントを処理できるようになります。

特別なアプリケーションに対しては、Caché XML サポートをカスタマイズできます。これには、カスタム XML サーバ・コードを簡単に生成できる方法が含まれます。“Caché からの XML のエクスポート” を参照してください。また、カスタム・エンティティ・リゾルバおよびコンテンツ・ハンドラを作成することもできます。“SAX パーサの使用法のカスタマイズ” を参照してください。

業界標準の XML DTD 妥当性検証を使用して、すべての内向き XML を検証できます。また、解析対象の XML 項目 も指定できます。“SAX パーサの使用法のカスタマイズ” を参照してください。

追加の XML ツール

Caché XML サポートには、以下の追加のツールが含まれています。

XML ツールを使用する場合の検討事項

任意の種類の XML ツールを操作する場合には、以下のように、一般的に検討すべき事項が少なくとも 3 つあります。

入出力の文字エンコード

XML ドキュメントをエクスポートするときには、使用する文字エンコードを指定できます。指定しなかった場合は、エクスポート先に応じて、Cache によってエンコードが選択されます。

  • 出力先がファイルまたはバイナリ・ストリームの場合は、"UTF-8" が既定です。

  • 出力先が文字列または文字ストリームの場合の既定の設定は、Caché システムによって異なります。

    • Unicode の Caché システムでは "UTF-16" が既定です。

    • 8 ビットの Caché システムではロケールの既定の文字セットが既定の設定となります。

Caché によって読み取られた任意の XML ドキュメントでは、ドキュメントの XML 宣言にそのファイルの文字エンコードを明記する必要があり、明記しておけば、ドキュメントは宣言どおりにエンコードされるようになります。以下はその例です。

<?xml version="1.0" encoding="UTF-16"?>

ただし、文字エンコードがドキュメントで宣言されていない場合は、以下のように想定されます。

  • ドキュメントがファイルまたはバイナリ・ストリームの場合は、文字セットが "UTF-8" と想定されます。

  • ドキュメントが文字列または文字ストリームの場合は、以下のように想定されます。

    • Unicode の Caché システムでは、文字セットが "UTF-16" と想定されます。

    • 8 ビットの Caché システムでは、文字セットはロケールの既定の文字セットと想定されます。

Caché の文字変換に関する背景情報は、"Caché プログラミング入門ガイド" の “ローカライズのサポート” を参照してください。

ドキュメント形式の選択

XML ドキュメントを操作するときには、ドキュメントを Caché のクラスにマップするときに使用する形式を認識しておく必要があります。同様に、XML ドキュメントを作成するときには、ドキュメントを記述するときに使用するドキュメント形式を指定します。XML ドキュメント形式は、以下のとおりです。

  • リテラルとは、ドキュメントがオブジェクト・インスタンスのリテラル・コピーであることを示します。ほとんどの場合、作業対象が SOAP の場合でもリテラル形式を使用します。

    別途明記されている場合を除き、このドキュメントに挙げている例ではリテラル形式を使用しています。

  • エンコードとは、SOAP 1.1 規格または SOAP 1.2 規格で説明されている方法でエンコードされていることを示します。これらの規格へのリンクについては、この章で後述する “Caché でサポートされる規格” を参照してください。

    SOAP 1.1 と SOAP 1.2 では、詳細が少し異なります。

以下のサブセクションに、これらのドキュメント形式の違いを示します。

リテラル形式

以下の例では、XML ドキュメントをリテラル形式で表示します。

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <Person>
      <Name>Klingman,Julie G.</Name>
      <DOB>1946-07-21</DOB>
      <GroupID>W897</GroupID>
      <Address>
         <City>Bensonhurst</City>
         <Zip>60302</Zip>
      </Address>
      <Doctors>
         <DoctorClass>
            <Name>Jung,Kirsten K.</Name>
         </DoctorClass>
         <DoctorClass>
            <Name>Xiang,Charles R.</Name>
         </DoctorClass>
         <DoctorClass>
            <Name>Frith,Terry R.</Name>
         </DoctorClass>
      </Doctors>
   </Person>
</Root>

エンコード形式

一方、以下の例では同じデータをエンコード形式で表示します。

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
   <DoctorClass id="id2" xsi:type="DoctorClass">
      <Name>Jung,Kirsten K.</Name>
   </DoctorClass>
...
   <DoctorClass id="id3" xsi:type="DoctorClass">
      <Name>Quixote,Umberto D.</Name>
   </DoctorClass>
...
   <DoctorClass id="id8" xsi:type="DoctorClass">
      <Name>Chadwick,Mark L.</Name>
   </DoctorClass>
...
   <Person>
      <Name>Klingman,Julie G.</Name>
      <DOB>1946-07-21</DOB>
      <GroupID>W897</GroupID>
      <Address href="#id17" />
      <Doctors SOAP-ENC:arrayType="DoctorClass[3]">
         <DoctorClass href="#id8" />
         <DoctorClass href="#id2" />
         <DoctorClass href="#id3" />
      </Doctors>
   </Person>
   <AddressClass id="id17" xsi:type="s_AddressClass">
      <City>Bensonhurst</City>
      <Zip>60302</Zip>
   </AddressClass>
...
</Root>

エンコードされたバージョンでは、以下の違いに注意してください。

  • 出力のルート要素に、SOAP エンコードのネームスペースおよび他の標準ネームスペースの宣言が含まれます。

  • このドキュメントには、person、address、および doctor の各要素がすべて同じレベルで含まれます。address 要素および doctor 要素は、この 2 つの要素を参照する person 要素が使用する一意の ID でリスト表示されます。各オブジェクト値プロパティはこの方法で処理されます。

  • 最上位レベルの address および doctor 要素の名前は、それらの要素を参照するプロパティと同じ名前ではなく、それぞれのクラスの名前と同じになります。

  • エンコード形式には、属性は含まれません。GroupID プロパティは、Person クラスの属性としてマッピングされます。リテラル形式では、このプロパティは属性として投影されます。ただし、エンコードされたバージョンでは、このプロパティは要素として投影されます。

  • コレクションに対する処理は異なります。例えば、リスト要素には属性 ENC:arrayType があります。

  • 各要素は xsi:type 属性の値を持ちます。

Note:

SOAP 1.2 の場合、エンコード・バージョンは若干異なります。バージョンを簡単に区別するには、SOAP エンコードのネームスペースの宣言を確認します。

  • SOAP 1.1 の場合、SOAP エンコードのネームスペースは "http://schemas.xmlsoap.org/soap/encoding/" です。

  • SOAP 1.2 の場合、SOAP エンコードのネームスペースは "http://schemas.xmlsoap.org/wsdl/soap12/" です。

パーサの動作

Caché SAX パーサは、Caché により XML ドキュメントが読み取られるたびに使用されるので、その既定の動作を知っておくと役に立ちます。パーサは、以下のようなタスクを行います。

  • XML ドキュメントが適格な文書であるかどうかを検証します。

  • 指定されたスキーマまたは DTD を使用して、ドキュメントを検証しようとします。

    ここでは、1 つのスキーマには、他のスキーマを参照する <import> 要素および <include> 要素を含めることができる、ということを覚えておくと役に立ちます。以下はその例です。

    <xsd:import namespace="target-namespace-of-the-importing-schema"
                      schemaLocation="uri-of-the-schema"/>
    
    <xsd:include schemaLocation="uri-of-the-schema"/>
    
    
    

    これらの他のスキーマをパーサで使用できる場合以外は、検証は失敗します。特に WSDL ドキュメントの場合は、すべてのスキーマをダウンロードして、修正された場所を使用するように主スキーマを編集することが必要になる場合もあります。

  • すべての外部エンティティを含め、すべてのエンティティを解決しようとします (この作業は他の XML パーサでも行います)。場所によっては、このプロセスには時間がかかる場合もあります。特に、Xerces では一部の URL の解決にネットワーク・アクセサが使用され、実装ではブロックする I/O が使用されます。結果的に、タイムアウトは発生せず、ネットワーク・フェッチがエラー状態になって停止する可能性があります (現実にはまず発生しません)。

    また、Xerces では https をサポートしていないので、https に位置するエンティティの解析はできません。

    必要に応じて、カスタム・エンティティ・リゾルバを作成したり、エンティティの解決を無効にしたりすることもできます。“SAX パーサの使用法のカスタマイズ” を参照してください。

Caché でサポートされる規格

Caché XML サポートは以下の規格に従います。

Caché SAX パーサでは、XML 1.0 の推奨に準拠する標準 Xerces-C++ ライブラリが使用されます。これらの標準のリストについては、http://xml.apache.org/xerces-c/Opens in a new tab を参照してください。

Caché は、以下の 2 つの XSLT プロセッサを提供します。

  • Xalan プロセッサは XSLT 1.0 をサポートします。

  • Saxon プロセッサは XSLT 2.0 をサポートします。

Web サービスとクライアントに関連する追加の規格の詳細は、"Caché での Web サービスおよび Web クライアントの作成" および "Caché Web サービスの保護" を参照してください。

XML で想定される文字セットの詳細は、W3 Web サイト (http://www.w3.org/TR/2006/REC-xml-20060816/#charsetsOpens in a new tab) を参照してください。

Note:

長い文字列演算に対するサポートを有効にしてある場合は、属性を 32 KB より大きくすることができます。有効にしていない場合は、それぞれの属性は 32 KB 未満にする必要があります。また、Caché XML は、1 つの要素内では、それぞれ別のネームスペースにある同じ名前を持つ、複数の属性をサポートしていません。

FeedbackOpens in a new tab