• 検索結果がありません。

Caché での XML の使用法

N/A
N/A
Protected

Academic year: 2021

シェア "Caché での XML の使用法"

Copied!
44
0
0

読み込み中.... (全文を見る)

全文

(1)

Caché での XML の使用

Version 5.1

2006-03-14

(2)

Caché での XML の使用法 Caché Version 5.1 2006-03-14 Copyright © 2006 InterSystems Corporation. All rights reserved.

このドキュメントは、 Sun Microsystems、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム (www.w3c.org)のツールと情報を使用して、 Adobe Portable Document Format (PDF)で作成およびフォーマットされました。 主要ドキュメント開発ツールは、InterSystemsが構築したCaché と Javaを使用した特別目的のXML処理アプリケーションで す。

Caché 製品とロゴは InterSystems Corporation の登録商標です。

Ensemble 製品とロゴは InterSystems Corporation の登録商標です。

InterSystems という名前とロゴは InterSystems Corporation の登録商標です

このドキュメントは、インターシステムズ社(住所:One Memorial Drive, Cambridge, MA 02142)あるいはその子会社が所有す る企業秘密および秘密情報を含んでおり、インターシステムズ社の製品を稼動および維持するためにのみ提供される。こ の発行物のいかなる部分も他の目的のために使用してはならない。また、インターシステムズ社の書面による事前の同意 がない限り、本発行物を、いかなる形式、いかなる手段で、その全てまたは一部を、再発行、複製、開示、送付、検索可能 なシステムへの保存、あるいは人またはコンピュータ言語への翻訳はしてはならない。 かかるプログラムと関連ドキュメントについて書かれているインターシステムズ社の標準ライセンス契約に記載されている 範囲を除き、ここに記載された本ドキュメントとソフトウェアプルグラムの複製、使用、廃棄は禁じられている。インターシス テムズ社は、ソフトウェアライセンス契約に記載されている事項以外にかかるソフトウェアプログラムに関する説明と保証を するものではない。さらに、かかるソフトウェアに関する、あるいはかかるソフトウェアの使用から起こるいかなる損失、損害 に対するインターシステムズ社の責任は、ソフトウェアライセンス契約にある事項に制限される。 前述は、そのコンピュータソフトウェアの使用およびそれによって起こるインターシステムズ社の責任の範囲、制限に関する 一般的な概略である。完全な参照情報は、インターシステムズ社の標準ライセンス契約に記され、そのコピーは要望によっ て入手することができる。 インターシステムズ社は、本ドキュメントにある誤りに対する責任を放棄する。また、インターシステムズ社は、独自の裁量 にて事前通知なしに、本ドキュメントに記載された製品および実行に対する代替と変更を行う権利を有する。

Caché および InterSystems Caché、Caché SQL、 Caché ObjectScript および Caché Object は、インターシステムズ社の 商標です。 ここで使われている他の全てのブランドまたは製品名は、各社および各組織の商標または登録商標です。 インターシステムズ社の製品に関するサポートやご質問は、以下にお問い合わせください: InterSystems ワールドワイド カスタマサポート +1 617 621-0700 Tel: +1 617 374-9391 Fax: support@InterSystems.com Email:

(3)

目次

1 はじめに ... 1 1.1 Caché XML 機能... 1 1.2 Caché XML アーキテクチャ... 2 2 XML の概要... 3 2.1 XML の基礎 ... 3 2.2 検証と DTD... 4 2.3 XML スキーマ... 5 3 Caché オブジェクト - XML プロジェクション... 7 3.1 既定の XML プロジェクションの変更... 8 3.1.1 XMLNAME:要素名 ... 9 3.1.2 XMLPROJECTION:プロパティが投影される方法... 9 3.1.3 XMLITEMNAME:コレクション内の名前付け項目 ... 10 3.1.4 XMLKEYNAME:配列プロパティの名前付けキー ... 10 3.1.5 XMLIO:インポートとエクスポートの制御... 10 3.1.6 XMLTYPE:XML スキーマ名の制御... 11 3.1.7 XSDTYPE:XML スキーマ・タイプの制御... 11 3.2 XML プロジェクションの例... 11 3.2.1 既定のプロジェクション... 11 3.2.2 要素名の変更 ... 11 3.2.3 要素から属性への変更 ... 12 3.2.4 プロパティの XML プロジェクションを使用不可能にする... 12 3.2.5 混在するコンテンツを持つプロパティの投影 ... 13 3.2.6 プロパティをコンテンツとして投影する ... 13 3.3 コレクションの XML プロジェクション... 14 3.3.1 リスト・コレクション ... 14 3.3.2 配列コレクション... 15 4 Caché からの XML のエクスポート... 17 4.1 単純な Caché XML サーバ... 17 4.2 XML としてオブジェクトを提供する... 19 4.2.1 %XML.Adaptor クラス... 19 4.2.2 XML サーバ・クラスの変更... 20 5 Caché への XML コンテンツのインポート... 23 5.1 XML インポートの例... 23 6 %XML.TextReader クラス ... 27 6.1 概要 ... 27

(4)

6.2 ドキュメントの解析... 28 6.2.1 ドキュメント・ソースの選択 ... 29 6.2.2 検証 ... 29 6.2.3 エンティティの解析... 29 6.3 ドキュメント・モデル... 30 6.3.1 ノード・タイプ... 30 6.3.2 ノード名... 31 6.3.3 ノード値... 31 6.3.4 要素情報... 32 6.4 コンテンツの読み取り... 32 6.4.1 次のノードの読み取り... 33 6.4.2 特定の要素の検索... 33 6.4.3 属性値の読み取り... 33 7 SAX インタフェースの使用法... 35 7.1 SAX コンテンツ・ハンドラとは... 36 7.2 SAX ハンドラの例... 37

(5)

図一覧

オブジェクト XML プロジェクション... 7

(6)

テーブル一覧

XML パラメータ... 8 XMLPROJECTION の値... 9 XMLIO の値 ... 10 ノード・タイプ ... 31 ノード値... 32 要素情報... 32

(7)

1

はじめに

このドキュメントでは、Caché で XML を使用する方法について説明します。 Caché は、XML 処理に対する強力なオブジェクトを提供しています。XML を単純なテキスト・ファイ ル (またはリレーショナル BLOB) として使用するという必要がなく、また、複雑な XML ドキュメントを リレーショナルの行や列に挿入する必要もありません。その代わり、XML ドキュメントの直接表現とし てオブジェクトを使用でき、また、その逆も可能です。Caché はネイティブのオブジェクト・データベー スを含むので、このようなオブジェクトを直接データベース内で使用できます。複雑なミドルウェアや 変換技術は必要ありません。 以下のように、様々な方法で Caché で XML を使用できます。 • メッセージ・アプリケーションで、標準形式として使用できます。これには、業界標準のプロトコル や、よりローカルなソリューションも含まれます。 • アプリケーションとユーザ間の、データ変換に対する標準形式として使用できます。 • 外部データ・ストレージに対する、標準表示として使用できます。これには、従来のデータベー ス・レコードや、ドキュメントのようなより複雑なコンテンツも含まれます。

また Caché は、SOAP や Web サービスをサポートする組み込みの XML 能力を使用します。詳細 は、"Caché での SOAP と Web サービスの使用法" を参照してください。

1.1 Caché XML 機能

Caché は、XML 関連の以下のような機能を提供しています。

• オブジェクトは、XML ドキュメントとしてそれ自身を自動的に “投影” できます。XML 要素や 属性としてオブジェクト・プロパティを投影できるだけでなく、入れ子の要素 (オブジェクト・コレク ション、埋め込みオブジェクト、オブジェクト・リレーションシップなどとして表示) もサポートされ

(8)

ています。投影された XML は、標準ファイルやオンライン・コンテンツ (HTTP 要求への応答な ど) として提供されます。また、オブジェクト・プロジェクションも XML DTD (XML ドキュメントの コンテンツを定義する標準 XML メソッド) を自動的に生成します。 • XML ドキュメントは、同等のオブジェクト表示に自動的に変換されます。ビジネス論理を実行す るため、または Caché オブジェクトのデータベース内のストレージのために、結果のオブジェク トを使用できます。内向きの XML は、ファイル、ストリーム、または内向き HTTP 要求から読ま れます。Caché は、業界標準の XML DTD 妥当性検証を使用して、すべての内向き XML を 検証します。 • 特別なアプリケーションに対しては、Caché の XML サポートを様々な方法でカスタマイズでき ます。これには、カスタム XML サーバ・コードを簡単に生成できる方法や、カスタム XML イン ポート・メカニズムを作成する機能 (Caché の SAX インタフェースを使用) などがあります。 • Caché スタジオでは、XML スキーマからクラス定義を自動的に生成する XML スキーマ・ウィ ザードが提供されています。詳細は、"XML スキーマ" のセクションを参照してください。

1.2 Caché XML アーキテクチャ

Caché には、XML での作業を支援する以下のコンポーネントが用意されています。

• Caché SAX パーサー — 標準 Xerce ライブラリを使用した、組み込みの SAX XML 検証パー サー。SAX は、完全な XML 検証とドキュメントの解析を提供する解析エンジンです。Caché SAX は、高性能な、プロセス内コールイン・メカニズムを使用して、Caché プロセスとの通信を行 います。Caché SAX を使用して、Caché の組み込み XML サポートを使用するか、または Caché 内で独自のカスタム SAX インタフェース・クラスを提供することで、XML を処理できます。 • Caché XML ライブラリ — XML 操作用の一連の Caché クラス。これには、オブジェクト・インスタ ンスを XML に自動的に投影 (シリアル化) したり、その逆の投影を行ったりする機能をすべて のクラスに提供する%XML.Adaptor と、XML ドキュメントを読み込み、それをオブジェクト・イン スタンスに自動的に変換する機能を提供する%XML.Reader、およびオブジェクト・マッピングな しで汎用 XML ドキュメントを読み込む方法を提供する%XML.TextReader があります。 上記のコンポーネントの詳細は、このドキュメントの章で順に説明します。 はじめに

(9)

2

XML の概要

この章では、XML の基本的な概要について説明します。ここでは、以下のトピックについて説明し ます。 • XML の基礎 • 検証と DTD • XML スキーマ XML に関する詳細は、書籍を参考にしてください。また、W3C ウェブサイト http://www.w3.org で、 XML に関する情報を得ることもできます。

2.1 XML の基礎

拡張マークアップ言語 (eXtensible Markup Language) である XML は、データの標準化されたテキ スト表示を提供します。このような表示方法は、 “マークアップ言語” と呼ばれます。これは、プレー ン・テキスト・コンテンツから開始し、コンテンツに意味を持たせる、一連の特殊なマークアップ記号 を追加するためです。 XML は、HTML で使用されているようなタグを使用して、テキスト・ドキュメントでデータをマークしま す。例えば、HTML では一般的に使用されているタグは、テキストを太字で表示する “<b>” タグで す。

<b>This text is in bold.</b>

XML が特別である理由は、ユーザが独自のタグを指定した独自のドキュメント・タイプを定義できる からです。例えば、XML を使用して、“MySpecialText” と言うタグを含むドキュメントを作成できま す。

(10)

<MySpecialText> Wow!

</MySpecialText>

この例では、MySpecialText は要素と見なされ、この MySpecialText 要素のコンテンツが “Wow!” になります。XML では要素の開始と終了を定義するペアのタグがあるので、MySpecialText の開始 と終了の場所を必ず明確にすることに注意してください (“<MySpecialText>” が開始タグで、 “</MySpecialText>” が終了タグ)。XML では、すべての要素に開始タグと終了タグが必要です。 実際には、以下のように要素はデータ・レコードの異なる部分を参照する傾向があります。 <Student level="undergraduate"> <Name>Barnes,Gerry</Name> <DOB>1981-04-23</DOB> </Student>

この例では、Student 要素が “level” 属性を持ち、その属性が取りうる値の 1 つに “undergraduate” (学部生) があります。属性値は引用符で囲む必要があることに注意してください。 XML では、要素や属性の使用に関する特別な規定はありません。一般的に、要素はデータのプロ パティ (上記のName と DOB など) で、属性は説明されているデータの構造を定義します (一意の ID など)。この例は、以下の通りです。 <Person ID="230902">Smith,Leslie</Person> 属性は、異なる種類のレコード間の異なる点を指定することがよくあります。従って、Student の例で は、undergraduate (学部生) は学生の副専攻を指定する要素をもち、graduate (大学院生) は The-sisAdvisor 要素を持つことができます。

2.2 検証と DTD

XML の主な機能は、ユーザが単純で明確に定義された構成を使用して、ドキュメントを定義できる ということです。ドキュメント構成の定義は、DTD (Document Type Definition) を使用して行うことが できます。 DTD (外部ファイル内、または XML ドキュメント内に含まれる、一連のテキスト指示語) は、要素の 定義と、ドキュメント内で使用される属性を提供します。DTD は、ドキュメントに対するすべての有効 な要素を指定します。Student の例において、DTD は、大学のデータベース内の、異なるすべての 学生のグループを指定するとします。この場合、Student、Professor、Instructor、Researcher、 StaffMember、Alumnus などの要素が存在します。各要素は、DTD で指定された独自の構造を持ち ます。 一般的に、すべての XML ドキュメント (DTD の有無に関わらず) は 適格に構成 されている必要が あります。つまり、以下のような特定の規約に従う必要があります。 • すべてのドキュメントの要素が、開始タグと終了タグを含むこと (終了タグは </student>、開始タ グは <student>)。 XML の概要

(11)

• すべてのドキュメントの属性が、引用符で囲まれていること (<Graduate> に、レベル属性の値を 引用符に囲んで配置することなど)。 • ドキュメントに、< > 括弧 (< や > シンボル) や & 文字が含まれないこと (これらはエンティティと して指定された特殊文字を区切るために、XML で使用されます)。 DTD を使用して、ドキュメントの構成に関する追加の検証を提供できます。例えば、Student 要素が 内部に “Name” 要素のタイプミスである “Nime” を含むかということなどを検証します。しかし、 DTD ベースの検証は、ドキュメントの構造がコンテンツのみの場合には、何の保証にもなりません。 例えば、検証済みの学生のリストに表示された名前は、適格な形式である必要がありますが、現在 登録されている学生である必要はありません。コンテンツの検証に対しては、他のツールが必要で す。Caché で XML を使用するとき、XML ドキュメントが処理されると、XML 検証 (適格性と DTD の両方) が発生します。コンテンツの検証は、アプリケーション・レベルで、XML ファイルが読み込ま れた後に発生します。 検証の必要がないデータを含める場合には、XML “CDATA” 要素を使用します。 <tag><![CDATA[

Non-validated data goes here.

You can even have stray "<" or ">" symbols in it. ]]></tag> CDATA 要素のコンテンツでの唯一の制約は、要素の末尾を示す文字列 “]]>” を含めることがで きないということです。つまり、CDATA セクションは入れ子にできないという意味もあります。

2.3 XML スキーマ

XML 標準の比較的新しい機能は、XML スキーマです。XML スキーマは、DTD の代わりに一連の XML ドキュメントのメタ情報を指定する手法です。DTD では、スキーマを使用して特定の XML ド キュメントのコンテンツを検証できます。 XML スキーマは、以下のような特定の用途に対して、DTD 上でいくつかの利点を提供します。 • XML スキーマ自体は、有効な XML ドキュメントであり、スキーマ上で操作するツールをより簡 単に開発できます。 • XML スキーマは、より豊富な一連の機能を指定でき、値の型情報を取り込みます。 以下は、非常に単純な Person レコードを定義する XML スキーマのサンプルです。 XML スキーマ

(12)

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="MyApp.Person">

<xsd:sequence>

<xsd:element name="Age" type="xsd:integer"/> <xsd:element name="DOB" type="xsd:string"/> <xsd:element name="Home" type="s:MyApp.Address"/> <xsd:element name="Name" type="xsd:string"/>

<xsd:element name="Office" type="s:MyApp.Address"/> <xsd:element name="SSN" type="xsd:string"/>

</xsd:sequence> </xsd:complexType> </xsd:schema> XML スキーマに関する詳細は、W3C リンク http://www.w3.org/TR/xmlschema-0/ を参照してくだ さい。 XML の概要

(13)

3

Caché オブジェクト - XML プロジェクショ

Caché は、 “XML プロジェクション” を使用して、XML ドキュメントとしてオブジェクトを投影します。 任意のクラスに対する XML プロジェクションは、オブジェクト・プロパティがどのように XML 要素 (ま たは属性) に対応するか (およびその属性) を決定します。 オブジェクト XML プロジェクション XML プロジェクションをサポートするクラスは、 “XML 対応クラス” と呼ばれます。%XML.Adaptor クラスを拡張 (派生) するすべてのクラス (Caché ライブラリの一部) は、自動的に XML 対応になり ます。 • オブジェクト・インスタンスは、最高レベルの XML 要素に対応します。既定では、クラス名は要 素名として使用されます。クラスのパッケージ名は、その要素名の一部として使用されません。 • オブジェクト・プロパティは、最高レベルの XML 要素で囲まれている内部の XML 要素や属性 に対応します。既定では、プロパティ名は要素名、または属性名として使用されます。また、既 定では、パブリック・プロパティのみが投影されます。

(14)

• リテラル・プロパティは、独自の “XSD” (SOAP エンコード) 値を使用して投影されます。つま りそのデータ型クラスの LogicalToXSD メソッドが存在すれば、これが使用されます。 • プロパティは、そのシーケンス番号順に XML に投影されます。つまり、Caché スタジオに表示 された順で投影されるということです。 • コレクション、リレーションシップ、および埋め込みオブジェクトは、入れ子にされた要素として投 影されます。 • 文字ストリームは、文字列と同じ方法で投影されます。 • バイナリ・ストリームは、base64 のコード化を使用して投影されます。 • XML 対応のクラスには、メソッド XMLDTD が追加されます。これは、XML プロジェクションに 対する DTD を提供します。 • XML 対応のクラスには、メソッド XMLSchema が追加されます。これは、XML プロジェクション に対する XML スキーマを提供します。 • XML はデータ表示なので、メソッドは XML に投影されません。

3.1 既定の XML プロジェクションの変更

特定のクラスやプロパティ・パラメータに対する値を指定することで、クラスを XML に投影する方法 を制御できます。 XML パラメータ 説明 パラメータ プロパティをインポートまたはエクスポートする方法を制御します。 XMLIO XML への投影時、コレクション内の個別の項目に使用する名前を 制御します。 XMLITEMNAME XML への投影時、配列要素に対するキー値を保持するために使 用する属性の名前を制御します。 XMLKEYNAME XML への投影時、クラスやプロパティに使用する名前 (要素や属 性) を制御します。 XMLNAME プロパティを XML に投影する方法を制御します。 XMLPROJECTION クラス名を XML スキーマでどのように表現するかを制御します。 XMLTYPE クラスの XML スキーマの生成時に、プロパティに使用される XSD タイプをオーバーライドする方法を提供します。 XSDTYPE Caché オブジェクト - XML プロジェクション

(15)

これらのパラメータに関する詳細は、以下のセクションで説明しています。

3.1.1 XMLNAME:要素名

XMLNAME パラメータは、オブジェクト・エンティティに対応する XML 要素の名前を変更するため に使用します。これは、クラス・レベルとプロパティ・レベルの両方で行うことができます。

• XMLNAME クラス・パラメータを使用して、クラスに対応する XML 要素名を指定します。

Parameter XMLNAME = "company";

• プロパティ XMLNAME のプロパティ・パラメータに対応する、XML 要素名、または属性名を指 定します。

Property Name As %String(XMLNAME = "CompanyName");

3.1.2 XMLPROJECTION:プロパティが投影される方法

XMLPROJECTION プロパティ・パラメータに対する値を指定することで、プロパティを XML 要素 (既定)、または属性として表示するかどうかを指定できます。 XMLPROJECTION の値 概要 XMLPROJECTION プロパティは、XML に投影されません。 NONE プロパティは、XML 属性として投影されます。 ATTRIBUTE プロパティは、XML 要素として投影されます (非コレクション・プ ロパティの既定)。 ELEMENT プロパティは、項目のコレクションとして投影されます (コレクショ ン・プロパティの既定)。詳細は、以下のコレクションを参照し てください。 COLLECTION プロパティは、このクラスに対するプライマリ・コンテンツとして 投影されます (つまり、プロパティのコンテンツは要素で囲まれ ることなく記述されます)。詳細は、以下を参照してください。 CONTENT XMLPROJECTION が指定されていない場合は、既定のプロジェクション (つまり、現在のプロパティ に関連するプロジェクション) が使用されます。 XMLPROJECTION パラメータの例は、以下のセクションを参照してください。 既定で投影されていないプロパティを、プロパティの XMLPROJECTION パラメータの値を明示的 に設定することで投影できます。 既定の XML プロジェクションの変更

(16)

Property InternalID As %Integer(XMLPROJECTION = "ATTRIBUTE") [Private];

3.1.3 XMLITEMNAME:コレクション内の名前付け項目

XMLITEMNAME パラメータは、コレクション内の項目に使用する XML 名を制御するために使用し ます。 詳細は、コレクションのセクションを参照してください。

3.1.4 XMLKEYNAME:配列プロパティの名前付けキー

XMLKEYNAME パラメータは、配列内の項目に対するキー値に使用する XML 名を制御するため に使用します。 詳細は、コレクションのセクションを参照してください。

3.1.5 XMLIO:インポートとエクスポートの制御

XMLIO パラメータは、XMLImport メソッドと XMLExport メソッドがプロパティを処理する方法を制 御します。 XMLIO キーワードは、以下の値のいずれかを取ることができます。 XMLIO の値 概要 XMLIO このプロパティは、XMLImport に使用しますが、XMLExport からは無視されま す。 IN このプロパティは、XMLExport に使用しますが、XMLImport からは無視されま す。このプロパティに対応する XML 要素が XML ドキュメントに存在する場合、 XMLImport はエラーを返します。 OUT このプロパティは、XMLImport と XMLExport の両方に使用します。 INOUT このプロパティは、XMLExport に使用しますが、XMLImport からは無視されま す。このプロパティに対応する XML 要素が XML ドキュメントに存在する場合、 XMLImport はそれを無視します。一般的に、この値は、計算されたプロパティに 使用されます (値が他のプロパティの値を基に計算されているもの)。このため、 エクスポートではすべての値を記録し、インポートでは計算された値を無視でき ます。 CALC XMLIO パラメータの値を指定しない場合は、既定値 (INOUT) が使用されます。 Caché オブジェクト - XML プロジェクション

(17)

3.1.6 XMLTYPE:XML スキーマ名の制御

XMLTYPE パラメータは、XMLSchema メソッドの XML スキーマ出力に使用する、既定の型の名前 (パッケージでのクラス名) を制御するために使用します。 XMLTYPE のパラメータは、既定のトップ・レベルのタグ名を制御する XMLNAME と区別されます。 XMLTYPE を使用することで、SOAP での使用のために、異なるパッケージで同じ名前を持つ 2 つ のクラスを区別できます。

3.1.7 XSDTYPE:XML スキーマ・タイプの制御

XSDTYPE パラメータは、クラスに対して生成された XML スキーマに使用される既定の XSD (XML スキーマ・タイプ) をオーバーライドできます。

3.2 XML プロジェクションの例

以下の例は、XML 対応のクラスの既定の XML 表示と、様々な XML パラメータ値を変更した結果 を示しています。

3.2.1 既定のプロジェクション

以下は、単純な XML 対応のクラスの定義です。

Class MyApp.Company Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Property Name As %String; Property CompanyID As %String; } 以下は、このクラスのインスタンスの XML 表示の例です。 <Company> <Name>XYZ Corp.</Name> <CompanyId>Q4673</CompanyId> </Company>

3.2.2 要素名の変更

以下は、クラスに対して使用された XML 要素名と、XMLNAME パラメータを使用して変更された CompanyId プロパティの例です。 XML プロジェクションの例

(18)

Class MyApp.Company Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Parameter XMLNAME = "CompanyData"; Property Name As %String;

Property CompanyID As %String(XMLNAME = "Id"); } 以下は、このクラスのインスタンスの XML 表示の例です。 <CompanyData> <Name>XYZ Corp.</Name> <Id>Q4673</Id> </CompanyData>

3.2.3 要素から属性への変更

以下は、XML 属性として投影されたCompanyId プロパティの例です。

Class MyApp.Company Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Parameter XMLNAME = "CompanyData"; Property Name As %String;

Property CompanyID As %String(XMLNAME = "Id", XMLPROJECTION="ATTRIBUTE"); } 以下は、このクラスのインスタンスの XML 表示の例です。 <CompanyData Id="Q4673"> <Name>XYZ Corp.</Name> </CompanyData>

3.2.4 プロパティの XML プロジェクションを使用不可能にする

XML に投影されないようにするには、XMLPROJECTION パラメータを “NONE” に設定します。 以下は、XML プロジェクションから排除されたName プロパティの例です。

Class MyApp.Company Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Parameter XMLNAME = "CompanyData";

Property Name As %String(XMLPROJECTION="NONE");

Property CompanyID As %String(XMLNAME = "Id", XMLPROJECTION="ATTRIBUTE"); }

以下は、このクラスのインスタンスの XML 表示の例です。

<CompanyData Id="Q4673"> </CompanyData>

(19)

3.2.5 混在するコンテンツを持つプロパティの投影

既定で、リテラル・プロパティ (文字列、または文字ストリーム) は、XML 要素を何も含まないと見な されます。リテラル・プロパティ値が XML に投影されるとき、すべての “<” 文字や “>” 文字はそ れぞれ “&lt;” と “&gt;” にエスケープされます。 リテラル・プロパティのコンテンツに XML 要素を含むようにしたい場合 (例えば、データ・モデルの 一部ではない埋め込みマークアップ・コマンドを含むメモ・フィールド)、このプロパティが混在したコ ンテンツを含むということを示す必要があります。最も簡単な方法は、Caché クラス・ライブラリに含ま れる%XML.String データ型クラスを使用することです。 以下は、混在したコンテンツを含む、%XML.String 型の追加の Memo プロパティの例です。

Class MyApp.Company Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Parameter XMLNAME = "CompanyData"; Property Name As %String;

Property CompanyID As %String(XMLNAME = "Id", XMLPROJECTION="ATTRIBUTE"); Property Memo As %XML.String(MAXLEN=2000);

}

以下は、このクラスのインスタンスの XML 表示の例です。

<CompanyData Id="Q4673"> <Name>XYZ Corp.</Name>

<Memo>This is a <emphasis>very</emphasis> important customer.</Memo> </CompanyData>

%XML.String クラスは、特別な CONTENT パラメータを “MIXED” に定義する、%String データ型 クラスのサブクラスです。 混在したコンテンツ・プロパティに有効なマークアップが含まれていることを確認するのは、アプリケー ション側で行う必要があります。%XML.String クラスには、この検証機能はありません。 混在したコンテンツを含む文字ストリームを投影したい場合は、そのストリーム・プロパティの CONTENT パラメータを “MIXED” に設定する必要があります。 Property MyStream As %CharacterStream(CONTENT = "MIXED");

3.2.6 プロパティをコンテンツとして投影する

クラスを、サブ要素をもたない XML に投影することを望むこともあります。例えば、以下のようになり ます。

<Part Code="T22">Left-handed Screw Driver</Part>

これを行うには、XMLPROJECTION パラメータが “CONTENT” であるプロパティを含むクラスを 生成します (一般的には、埋め込みオブジェクト・クラス、またはシリアル・オブジェクト・クラス)。

(20)

例えば、以下は上記の XML 表現に対応するクラスです。

Class MyApp.Part Extends (%SerialObject,%XML.Adaptor) [ClassType=serial] {

Property Content As %String(MAXLEN=100,XMLPROJECTION="CONTENT"); Property Code As %String(XMLPROJECTION="ATTRIBUTE");

} クラスで “CONTENT” の XMLPROJECTION を使用するときは、いくつかの制約があります。 1. コンテンツとして投影された 1 つのプロパティとしてのみ存在します。シングル・バリューの、リテ ラル・プロパティです。 2. すべての追加のプロパティは、属性として投影する必要があります。クラスは、要素として投影 されるプロパティを持つことはできません。

3.3 コレクションの XML プロジェクション

コレクション (リスト、配列、またはリレーションシップ) の要素を XML に投影する方法は、いくつかあ ります。最も簡単な方法を、以下に示します (リスト・コレクションと配列コレクション)。

3.3.1 リスト・コレクション

単独のリスト・プロパティData を含む、単純なクラス MyApp.Test を定義すると想定します。

Class MyApp.Test Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Property Data As List Of %String; } 以下は、このクラスのインスタンスの、既定の XML 表示の例です。 <Test> <Data> <DataItem>Value 1</DataItem> <DataItem>Value 2</DataItem> <DataItem>Value 3</DataItem> </Data> </Test>

この場合、Data がコレクションなので、その XMLPROJECTION パラメータは自動的に “COLLEC-TION” に設定されます。これにより、<Data> タグが、一連のコレクション内の個別項目を囲む <DataItem> タグの前後に配置されます。<Data> タグの名前は、コレクション・プロパティの XMLNAME パラメータによって決定されます。

コレクション内の各項目は、タグの内部に囲まれています。既定では、このタグの名前は、コレクショ ンに対する XMLNAME パラメータに付加された文字列 “Item” です。コレクション・プロパティの XMLITEMNAME パラメータを使用して、この既定をオーバーライドできます。

(21)

Class MyApp.Test Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Property Data As List of %String(XMLITEMNAME="Value"); } 以下は、このクラスのインスタンスの対応する XML 表示の例です。 <Test> <Data> <Value>Value 1</Value> <Value>Value 2</Value> <Value>Value 3</Value> </Data> </Test> コレクションのコンテンツを、タグで囲まずに投影できます ( “ラップされていない配列” と言われる こともあります)。これを実行するには、XMLPROJECTION パラメータを “ELEMENT” に設定しま す。これにより、コレクション内の各項目が、個別の要素として投影されます。この場合、XMLNAME パラメータ (XMLITEMNAME パラメータではない) が要素名を決定するのに使用されます。例えば、 以下のようになります。

Class MyApp.Test Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Property Data As List of %String(XMLPROJECTION = "ELEMENT"); } 以下は、このクラスのインスタンスの対応する XML 表示の例です。 <Test> <Data>Value 1</Data> <Data>Value 2</Data> <Data>Value 3</Data> </Data> </Test> コレクション・プロパティの XMLPROJECTION パラメータを “ATTRIBUTE” に設定することは特に 意味を持たず、コンパイル・エラーが返されます。

3.3.2 配列コレクション

配列コレクションは、リスト・コレクションと同様に取り扱われますが、1 つだけ重要な違いがあります。 配列内の各項目には、その項目に関連付けられた対応するキーがあります。配列が XML に投影 されるとき、そのキーは個別のコレクション要素内で属性として投影されます。 単独の配列プロパティData を含む、単純なクラス MyApp.Test を定義すると想定します。

Class MyApp.Test Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Property Data As Array Of %String; }

以下は、このクラスのインスタンスの、既定の XML 表示の例です。

(22)

<Test> <Data>

<DataItem DataKey="Key1">Value 1</DataItem> <DataItem DataKey="Key2">Value 2</DataItem> <DataItem DataKey="Key3">Value 3</DataItem> </Data>

</Test>

既定では、キーを含む属性名は、コレクション・プロパティに使用する要素名に “Key” を付加する ことで生成されます。この名前は、XMLKEYNAME パラメータを使用して変更できます。例えば、以 下のようになります。

Class MyApp.Test Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Property Data As Array Of %String(XMLKEYNAME="MyKey"); }

以下は、このクラスのインスタンスの、既定の XML 表示の例です。

<Test> <Data>

<DataItem MyKey="Key1">Value 1</DataItem> <DataItem MyKey="Key2">Value 2</DataItem> <DataItem MyKey="Key3">Value 3</DataItem> </Data>

</Test>

(23)

4

Caché からの XML のエクスポート

Caché は、様々な方法で XML データを提供します。 この章では、以下のことについて説明します。 • CSP テクノロジーを使用した、単純な HTTP ベースの XML サーバを構築する • Caché XML プロジェクションを使用するこのサーバを、データベースに保存されているオブジェ クトを基にした XML ドキュメントを使用するサーバに変更する

4.1 単純な Caché XML サーバ

このセクションでは、Caché を使用して、単純な HTTP ベースの XML サーバを生成する方法を説 明します。このサーバは、CSP (Caché Server Page) テクノロジーを使用して、内向き HTTP 要求に 応答する静的な XML コンテンツを提供します。その後のセクションでは、永続データベース・オブ ジェクトを基にした XML ドキュメントを提供するための、このサーバについて詳細に説明します。 XML サーバは、HTML の代わりに XML を提供するために拡張された、%CSP.Page クラスのサブ クラスです。このようなサーバ・クラスの定義は、以下のようになります。

(24)

/// A simple XML server

Class XMLSamples.Server Extends %CSP.Page {

Parameter CONTENTTYPE = "text/xml"; ClassMethod OnPage() As %Status {

Write "<?xml version=""1.0"" ?>",! Write "<Company>",!

Write "<Name>XYZ Corp.</Name>",!

Write "<Mission>To serve and project.</Mission>",! Write "</Company>",!

Quit $$$OK }

}

このクラスは%CSP.Page クラスを拡張し、CONTENTTYPE パラメータを “text/xml” にオーバー ライドし、OnPage メソッドをオーバーライドして、XML コンテンツを書き出します (この場合は静的コ ンテンツ)。 以下の要領で、Caché スタジオ内で同様のクラスを生成できます。 1. Caché スタジオを開始し、ローカル・サーバの “Samples” ネームスペース内で新規プロジェク トを生成します。 2. 新規のクラス定義を作成します。[ファイル]メニューの[新規作成]コマンドを使用し、[Caché ク ラス定義] を指定して、[新規クラス・ウィザード] を起動します。 3. ウィザードの最初のページで、パッケージ名を [XMLSamples]、クラス名を [Server] と指定しま す。 4. ウィザードの 2 ページ目で、新規クラス定義のタイプを [CSP] と指定します。 5. ウィザードの 3 ページ目で、CSP が転送するコンテンツ・タイプを [XML] と指定します。 6. [完了]ボタンをクリックします。 7. 以下のように、スタジオ・クラス・エディタに新規クラス定義が表示されます。

Class XMLSamples.Server Extends %CSP.Page {

Parameter CONTENTTYPE = "text/xml"; ClassMethod OnPage() As %Status { Write "<?xml version=""1.0"" ?>",! Quit $$$OK } } 8. OnPage メソッドが Write コマンドを使用して、複数の単純な XML コンテンツを提供するように、 このメソッドを以下のように実装を変更します。 Caché からの XML のエクスポート

(25)

Class XMLSamples.Server Extends %CSP.Page {

Parameter CONTENTTYPE = "text/xml"; ClassMethod OnPage() As %Status {

Write "<?xml version=""1.0"" ?>",! Write "<Company>",!

Write "<Name>XYZ Corp.</Name>",!

Write "<Mission>To serve and project.</Mission>",! Write "</Company>",! Quit $$$OK } } 9. [ビルド]メニューの[コンパイル]コマンドを使用して、クラスを保存してコンパイルします。 10. ブラウザで以下の URL を入力し、このクラスの結果を表示します。 http://127.0.0.1/csp/samples/XMLSamples.Server.cls ブラウザによって、この結果は XML ツリーとして表示されるか、またはテキストのみが表示され ます。いずれの場合も、ブラウザの[ソース]コマンドで、送信された実際の XML を表示できま す。 これで、単純ですが機能的な XML サーバを構築できました。このサーバをより便利にするには、 サーバの OnPage メソッドに論理を追加します。 次のセクションでは、このサーバがオブジェクト・データを提供できるように変更する方法について説 明します。

4.2 XML としてオブジェクトを提供する

XML 対応のすべての Caché クラスは、%XML.Adaptor クラスによって提供される XMLExport メソッ ドを使用して、自身のインスタンスを XML として自動的に投影します。 このセクションでは、XML 対応のクラスを生成し、単純な XML サーバ・クラス内でその XMLExport メソッドを実行します。

4.2.1 %XML.Adaptor クラス

以下は、Company クラスの XML 対応クラス定義です。これは、前のセクションで提供された会社情 報に対応しています。 XML としてオブジェクトを提供する

(26)

/// A company object.

Class XMLSamples.Company Extends (%Persistent,%XML.Adaptor,%Populate) [ ClassType = persistent ]

{

Property Name As %String;

Property City As %String(POPSPEC = "City()");

Property YearFounded As %Integer(POPSPEC = "Integer(1975,2000)"); Property Mission As %String(MAXLEN = 500, POPSPEC = "Mission()"); } %XML.Adaptor クラスは、オブジェクトから XML へのエクスポート、XML からオブジェクトへのイン ポート、およびオブジェクトの DTD の生成を管理するメソッドを提供します。%Populate クラスは、自 動データ生成を提供します (これにより、いくつかのデータを提供します)。 %XML.Adaptor スーパークラスから提供される XMLExport メソッドを実行することで、オブジェクト・ インスタンスのコンテンツを現在の Caché デバイスに記述できます。これは、以下の手順で実行しま す。 1. Caché スタジオを使用して、上記のXMLSamples.Company クラスに類似する、新規の永続クラ ス定義を作成します。このクラスを%Populate クラスと %XML.Adaptor クラスで拡張します。これ を行うには、[新規クラス・ウィザード]で [XML 有効] オプションと [データ生成] オプションを選 択します。 2. 新規クラス定義に、上記のプロパティ定義をコピーします。新規のクラス定義を保存し、コンパイ ルします。 3. Caché ターミナルを起動し、コマンド行を使用して、現在のネームスペースから “Samples” ネームスペースに変更し、新規クラスに対するサンプル・データを生成するために Populate メ ソッドを実行します。 ZN "SAMPLES" Do ##class(XMLSamples.Company).Populate(10) これで、データベース内に 10 のインスタンスを持つ、XML 対応の永続クラスを生成できました。コ マンド行から、オブジェクト・インスタンスをオープンし、その XMLExport メソッドを実行します。

Set company = ##class(XMLSamples.Company).%OpenId(1) Do company.XMLExport() XMLExport メソッドは、 “1” というオブジェクト ID を持つCompany オブジェクトのコンテンツを、 XML としてコンソールに記述します。

4.2.2 XML サーバ・クラスの変更

前述の 2 つのサンプルを結合して、XML サーバ・クラスを変更し、1 つまたは複数の永続オブジェ クトから生成した XML を提供する方法を示します。 Caché からの XML のエクスポート

(27)

Class XMLSamples.XMLServer Extends %CSP.Page {

Parameter CONTENTTYPE = "text/xml"; ClassMethod OnPage() As %Status {

Write "<?xml version=""1.0"" ?>",!

Set company = ##class(XMLSamples.Company).%OpenId(1) Set status = company.XMLExport()

If ($system.Status.IsError(status)) { Do $system.OBJ.DisplayError(status) Quit status } Quit $system.Status.OK() } } ブラウザで以下の URL を入力し、この結果を表示します。 http://127.0.0.1/csp/samples/XMLSamples.Server.cls 前述の例で説明したように、これは XML ドキュメントをブラウザに提供します。 各種 XML パラメータに値を与えることで、クラスに XML をエクスポートする方法を制御できます。 詳細は、"XML プロジェクション" の章を参照してください。 XML としてオブジェクトを提供する

(28)
(29)

5

Caché への XML コンテンツのインポー

Caché XML プロジェクションにより、ユーザは XML ドキュメントを読み込み、そのドキュメントの要素 に対応した、1 つまたは複数の XML 対応 Caché オブジェクトのインスタンスを生成できます。これ は、%XML.Reader クラスのインスタンスを使用して行うことができます。 %XML.Reader クラスは、%XML.Adaptor によって提供されるメソッドと連携して、以下の処理を行い ます。 • Caché SAX インタフェースを使用して、内向き XML ドキュメントを解析および検証します。検証 には、DTD 検証と XML スキーマ検証のいずれかを実行できます。 • XML 対応のオブジェクトが XML ドキュメントに含まれる要素と相互に関連するかどうかを判定 し、ドキュメントを読み込むためにこれらのオブジェクトのメモリ内インスタンスを生成します。 %XML.Reader によって生成されたオブジェクト・インスタンスは、データベース内に保存されないこ とに注意してください。これは、メモリ内のオブジェクトです。データベースにオブジェクトを保存した い場合、%Save メソッドを呼び出すか、関連するプロパティ値を永続オブジェクトにコピーし、それを 保存します。また、アプリケーションでは、新規のデータをデータベースに挿入するタイミングと、既 存のデータを更新するタイミングを決定する必要があります。%XML.Reader では、これらを区別でき ません。

5.1 XML インポートの例

“Person” 要素を含む、test.xml と呼ばれる XML ファイルがあると想定します。

(30)

<Person>

<Name>Elvis</Name> </Person>

まず、Person のオブジェクト表示である、XML 対応のクラスMyPerson を定義します。

Class MyApp.MyPerson Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

Parameter XMLNAME = "Person"; Property Name As %String; }

このファイルをMyPerson クラスのインスタンスにインポートするには、クラス・メソッド Import を生成 します。

Class MyApp.MyPerson Extends (%Persistent,%XML.Adaptor) [ClassType=persistent] {

// ...

ClassMethod Import() {

// Create an instance of %XML.Reader Set reader = ##class(%XML.Reader).%New() // Begin processing of the file

Do reader.OpenFile("test.xml")

// Associate a class name with the XML element name Do reader.Correlate("Person","MyApp.MyPerson") // Read objects from xml file

While (reader.Next(.object,.sc)) { Write object.Name,!

}

// If error found during processing, show it

If $system.Status.IsError(sc) do $system.OBJ.DisplayError(sc) }

}

このメソッドは、以下のタスクを実行します。

• Caché SAX インタフェースを使用して、test.xml を解析します。DTD が指定されている場合、 DTD に対するドキュメントの認証も行ないます。

• (Correlate メソッドを使用して) クラスMyPerson を XML 要素 “Person” と関連させます。 Person の各子要素は、MyPerson のプロパティになります。 • test.xml から Person 要素がなくなるまで、または参照変数 sc を経由してエラーが報告される まで、各 Person 要素を読み込みます。いずれの場合も、Next は偽を返します。 • 最後に、エラーによりループが終了された場合、そのエラーが現在の出力デバイスに表示され ます。 上記の説明の通り、この例はオブジェクトをデータベースに保存しません。MyPerson は永続オブ ジェクトなので、以下の行を追加することで、オブジェクトをデータベースに保存できます。 Caché への XML コンテンツのインポート

(31)

Set savestatus = object.%Save() If $system.Status.IsError(savestatus) { do $system.OBJ.DisplayError(savestatus) } While ループ内で行います。 ドキュメントから XML データを抽出する機能は、%XML.Reader によって提供されます。その一般的 な使用法は、上記の例で示した通り、ファイルを開き、XML 要素を Caché オブジェクトと関連させ、 XML からの要素を Caché に読み込む方法です。 また、%XML.Reader クラスの OpenStream メソッドを使用してストリームからデータを読み込んだり、 OpenString メソッドを使用して文字列からデータを読み込んだりすることもできます。 XML インポートの例

(32)
(33)

6

%XML.TextReader クラス

%XML.TextReader クラスは、XML ドキュメントを簡単に処理できる方法を提供しま す。%XML.TextReader は、特に適格な XML ドキュメントに対して繰り返し処理を実行し、そのコン テンツ (要素、属性やその他) をオブジェクト・プロパティとして表示する方法を提供しま す。%XML.TextReader によって、ドキュメント内の特定の要素が次にどこにあるかを検索する場合な ど、XML ドキュメントを検索する追加のメソッドを使用できます。 %XML.TextReader クラスは、DTD、もしくは XML スキーマを基にした、ドキュメントの完全な検証を 提供します。 %XML.TextReader は、Caché で XML を操作するための代替手段となります。ユーザの要求やア プリケーションによっては、Caché の XML オブジェクト・シリアル化メカニズム (%XML.Adaptor アダ プタ・クラスを利用)、または SAX ベースのコンテンツ・ハンドラ (%SOAP.Parser クラスを利用) の代 わりに、%XML.TextReader を使用できます。

6.1 概要

%XML.TextReader クラスは、以下の要領で XML ドキュメントを処理します。 1. 様々なソース (ストリーム、ファイル、または単純な文字列) から XML ドキュメントを読み込みま す。ドキュメントは、適格な XML ドキュメントである必要があります。つまり、ドキュメントは XML 構文の基本的な規約に従っている必要があります。 2. DTD (ドキュメントで指定されている場合) や XML スキーマ (ドキュメントのロードの呼び出しで 指定されている場合) を使用して、XML ドキュメントを検証します。これは、Caché SAX プロセッ サと同じメカニズムを使用して実行されます。 3. Caché テンポラリ・ストレージで、ドキュメント・オブジェクト・モデルを作成します。これは、XML ドキュメントのコンテンツを表します。

(34)

4. %XML.TextReader オブジェクトのインスタンスを生成し、返します。このオブジェクトは、XML ド キュメントのナビゲートに使用されます。 5. %XML.TextReader オブジェクトが壊れた場合、ドキュメント・オブジェクト・モデルに使用されて いるすべてのテンポラリ・ストレージは、自動的にクリーンアップされます。 以下は、XML ファイルに対して%XML.TextReader オブジェクトを生成し、そしてドキュメント内のす べての要素をリストにするためにそのオブジェクトを使用する、単純な Caché ObjectScript の例で す。 %XML.TextReader の使用

ClassMethod ShowElements(filename As %String) {

// Create an instance of %XML.TextReader (returned by reference) Set sc = ##class(%XML.TextReader).ParseFile(filename,.reader) If ($$$ISOK(sc)) {

// Read all elements within the document While (reader.Read()) { If (reader.NodeType = "element") { Write reader.Name,! } } } } この例は、以下を実行します。 1. ParseFile クラス・メソッドを呼び出します。これはソースファイル filename を読み取 り、%XML.TextReader オブジェクトを生成して、変数 reader にそのオブジェクトを参照によって 返します。 2. ParseFile が成功した場合、Read メソッドを実行して、ドキュメント内で成功した各ノードを検索 します。 3. NodeType プロパティを使用して、各ノードのタイプをチェックします。ノードが要素の場合、名 前を現在のデバイスに出力します。 %XML.TextReader クラスの他のメソッドやプロパティを使用して、より洗練された操作を実行できま す。

6.2 ドキュメントの解析

%XML.TextReader クラスで XML ドキュメントを処理する場合、最初にドキュメント・ソースを選択し て、そのコンテンツを解析します。 %XML.TextReader クラス

(35)

6.2.1 ドキュメント・ソースの選択

%XML.TextReader クラスによって、処理する XML ドキュメントを提供するソースの種類を選択でき ます。これを実行するいくつかのクラス・メソッドが提供されています。これらのメソッドは、入力ソース (または入力ソース名) を取り、XML ドキュメントの解析を正常に行うことができた場 合、%XML.TextReader オブジェクトのインスタンスを (参照によって) 返します。 これらのメソッドには、以下のものがあります。 概要 入力 メソッド ファイルから XML ドキュメントを読み込みます。 ファイル名 ParseFile ストリーム・オブジェクトから XML ドキュメントを読み込 みます。ストリーム・オブジェクトは、%AbstractStream クラスから派生している必要があります。 ストリーム・オブ ジェクト ParseStream 文字列に含まれた XML ドキュメントを読み込みます。 文字列には、有効な XML ドキュメントが含まれている 必要があります。 文字列 ParseString

6.2.2 検証

適切な ParseXXX メソッドの Flags 引数を使用して、XML パーサでドキュメントを検証するかどうか を制御できます。 既定では、%XML.TextReader クラスは、ドキュメントが DTD 宣言を含む場合に DTD 検証を実行し ます。SchemaSpec 引数を使用して、スキーマ仕様を提供する場合、XML スキーマ検証が実行され ます。 スキーマ仕様は、ネームスペースと URL の組み合わせの、コンマ区切りのリストを含む文字列です。

"namespace URL,namespace URL"

namespace はスキーマに使用する XML ネームスペースで、URL はスキーマ・ドキュメントの位置を 表す URL です。ネームスペースと URL の値は、1 つの空白文字で区切られています。

6.2.3 エンティティの解析

XML ドキュメント内の外部エンティティのカスタム解析に興味がない (または知識がない) ユーザは、 このセクションを飛ばして次に進んでください。 ユーザの XML ドキュメントには、解決する必要のある、外部 DTD やエンティティ定義が含まれて いることがあります。つまり、この定義に対するソース・ドキュメントは、パーサによって検索される必 ドキュメントの解析

(36)

要があります。この場合、適切な ParseXXX メソッドの Resolver 引数を使用して、エンティティ・リゾ ルバ・クラスのインスタンスを提供することで、これらの外部エンティティの検索方法を制御できます。 エンティティ・リゾルバ・クラスは、%XML.SAX.EntityResolver クラスから派生しており、resolveEntity メソッドを実装します。 XML プロセッサが外部エンティティ (DTD など) への参照を検出したときは常に、提供されたエン ティティ・リゾルバの resolveEntity メソッドを実行し、それをソース・ドキュメント内の Public エンティ ティ識別子文字列と System エンティティ識別子文字列に渡します。 例えば、以下のような XML ドキュメントを想定してみましょう。

<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "c:\cachesys\csp\docbook\doctypes\docbook\docbookx.dtd">

この場合、resolveEntity メソッドは、 “-//OASIS//DTD DocBook XML V4.1.2//EN” に設定され た publicId と、 “c:\cachesys\csp\docbook\doctypes\docbook\docbookx.dtd” に設定された systemId で実行されます。

resolveEntity メソッドは、外部エンティティに対する正確なソースを決定し、ストリーム・オブジェクト (%AbstractStream から派生) のインスタンスを生成し、それを返します。XML パーサは、このストリー ムからエンティティ定義を読み込み、ストリームを閉じます。

この例は、Caché ライブラリの%XML.Catalog クラスと %XML.CatalogResolver クラスに対応しま す。%XML.Catalog クラスは、パブリック識別子とシステム識別子を URL と関連させる、単純なデー タベースを定義します。%XML.CatalogRevolver クラスは、このデータベースを使用して、与えられた 識別子に対する URL を検索する、エンティティ・リゾルバ・クラスです。%XML.Catalog クラスは、SGMS スタイルの Catalog ファイルから、このデータベースをロードできます。SGMS スタイルの Catalog ファイルとは、標準形式で URL に対する識別子のマップを含むファイルのことです。

6.3 ドキュメント・モデル

%XML.TextReader クラスは XML ドキュメントを解析し、ドキュメントのすべてのコンポーネントを含む ドキュメント・モデル構成を作成します。このようなコンポーネントは ノード と呼ばれます。 ノードからノードへ移動しながら、XML ドキュメントのコンテンツの処理を繰り返すと、%XML.TextReader オブジェクトの各種プロパティは、現在のノードに対応する値を取得します。

6.3.1 ノード・タイプ

各ノードには、NodeType プロパティ経由で利用できるタイプがあります。利用できるタイプは以下の 通りです。 %XML.TextReader クラス

(37)

ノード・タイプ 概要 タイプ XML 属性 “attribute” CDATA セクション “cdata” 文字一式 (要素のコンテンツなど) “chars” XML コメント “comment” XML 要素の先頭 “element” XML 要素の終了 “endelement” XML エンティティ “entity” XML 処理命令 “processinginstruction” 混在したコンテンツ・モデルのマークアップ間にある空白 “ignorablewhitespace”

6.3.2 ノード名

要素と属性ノードには、名前があります。これは、Name プロパティと LocalName プロパティから利 用できます。 Name は、完全に認証された名前です (存在する場合はネームスペースも含みます)。LocalName は、ネームスペースの接頭語のない名前です。例えば、要素<xyz:Info>は、 “xyz:Info” の

Name と “Info” の LocalName を持ちます。

要素と属性以外の他のノード・タイプでは、これらのプロパティの値は空の文字列となります。

6.3.3 ノード値

ノードには、Value プロパティを経由して利用できる値があります。ノードが値を持つかどうかは、 HasValue プロパティを使用して確認できます。 Value プロパティのコンテンツは、ノード・タイプによって異なります。 ドキュメント・モデル

(38)

ノード値 値 タイプ 属性の値 “attribute” CDATA セクションのコンテンツ “cdata” テキスト・ノードのコンテンツ “chars” コメントのコンテンツ “comment (コメント)” なし — すべての要素コンテンツは、後続のノードに入ります。 “element” なし “endelement” エンティティの拡張されたコンテンツ “entity” ターゲット以外の処理命令全体のコンテンツ “processinginstruction” 混在したコンテンツ・モデルのマークアップ間にある空白 “ignorablewhitespace”

6.3.4 要素情報

要素ノードは、以下の追加の情報を持っています。 要素情報 概要 プロパティ 現在のノードの属性数 AttributeCount 現在の要素は空白であるかどうかの情報 IsEmptyElement 現在の要素が属性を含むかどうかの情報 HasAttributes

6.4 コンテンツの読み取り

%XML.TextReader クラスによって、ユーザはドキュメント・モデル内でノードをナビゲートできます。 ノードからノードへの移動に応じて、%XML.TextReader オブジェクトの各種プロパティは、現在のノー ドに対応する値を取得します。 XML ドキュメントでは、前方への移動しか行うことができず、前に読んだノードに戻ることはできませ ん。 %XML.TextReader クラス

(39)

最初に%XML.TextReader オブジェクトを生成するとき、オブジェクトにはその時点でノードはありま せん。%XML.TextReader オブジェクトのプロパティが値を取得する前に、(以下で説明するメソッドの 1 つを使用して) 前方のノードに進む必要があります。

6.4.1 次のノードの読み取り

ドキュメント内の次のノードに進むには、Read メソッドを使用します。 While (reader.Read()) { } Read メソッドは、前方のノードが存在しなくなるまで、真の値を返します。上記のループは、ドキュメ ントの最後に到達するまで実行を継続します。

6.4.2 特定の要素の検索

ReadStartElement メソッドを使用して、ドキュメント内の特定の要素の、次の場所に移動できます。

6.4.3 属性値の読み取り

要素に対する属性名と属性値を検索するには、以下の手順を実行します。 1. 要素ノードに移動します (例えば、Read メソッドを使用します)。 2. MoveToAttributeIndex メソッドでインデックス (要素内の属性の位置) を指定するか、 MoveToAttributeName メソッドで名前を指定して、特定の属性に移動します。 3. %XML.TextReader オブジェクトのプロパティを使用して、属性の情報を取得します。 4. 現在の要素に対する属性を終了したら、Read などの検索メソッドを実行することで、ドキュメント 内の次の要素に移動できます。また、MoveToElement メソッドを実行して、現在の属性を含む 要素に戻ることもできます。 例えば、以下のコードは、インデックス番号によって、現在のノードに対するすべての属性をリストに します。 If (reader.NodeType = "element") { // list attributes for this node For a = 1:1:reader.AttributeCount { Do reader.MoveToAttributeIndex(a)

Write reader.LocalName," = ",reader.Value,! }

}

以下のコードは、現在のノードに対するcolor 属性の値を検索します。

(40)

If (reader.NodeType = "element") {

// find color attribute for this node If (reader.MoveToAttributeName("color")) { Write "color = ",reader.Value,!

} }

(41)

7

SAX インタフェースの使用法

XML オブジェクトのカスタム・インポート・マッピングを作成するには、Caché SAX インタフェースを 使用します。SAX (Simple API for XML) は、イベント駆動型の XML パーサーです。SAX を使用し て、XML ファイルを読み、ファイル内の要素でメソッドを実行できます。Caché には、SAX コンテン ツ・ハンドラ、%XML.SAX.ContentHandler クラスが備わっています。カスタム XML インポートと処理 メカニズムを作成するには、%XML.SAX.ContentHandler のサブクラスを生成し、その新規のクラスで 既定のコンテンツ・ハンドラのメソッドをオーバーライドして、必要なアクションを実行します。 以下の図は、この操作の詳細です。 Caché SAX インタフェース カスタム・インポート・メカニズムを作成し、それを使用するプロセスは以下の通りです。 1. %XML.SAX.ContentHandler から派生するクラスを生成します。 2. オーバーライドするメソッドを、そのクラスに追加します。

(42)

3. %XML.SAX.Parser クラスの ParseFile メソッドを使用して、外部ファイルを読み込むクラス・メソッ ドをそのクラスに追加します。 4. そのクラス・メソッドを実行し、解析するファイルにそのメソッドを渡します。 ファイルの解析時、オーバーライドされたメソッドは定義されたアクションを実行し、コンテンツは適切 に処理されます。

7.1 SAX コンテンツ・ハンドラとは

%XML.SAX.ContentHandler クラスは XML ファイルを解析し、XML ファイルの特定の場所に到達し たとき、イベントを生成します。特定の場所に到達するたびに、クラスのメソッド (既定では空) をオー バーライドできます。これにより、使用しているアプリケーションに対するカスタム・コンテンツ処理を 生成できます。そのメソッドは、以下の通りです。 • characters — 文字データからトリガされる • endDocument — ドキュメントの最後でトリガされる • endElement — 要素の最後でトリガされる • endPrefixMapping — ネームスペース接頭マッピングの最後でトリガされる • ignorableWhitespace — 要素コンテンツ内の無視可能な空白でトリガされる • skippedEntity — スキップされたエンティティによってトリガされる • startDocument — ドキュメントの最初でトリガされる • startElement — 要素の最初でトリガされる • startPrefixMapping — ネームスペース接頭マッピングの最初でトリガされる エラー処理や、制御処理のメソッドもあります。 • error — リカバリ可能なパーサー・エラーによってトリガされる • fatalError — 致命的な XML 解析エラーによってトリガされる • processingInstruction — XML 処理命令によってトリガされる • warning — パーサー警告の報告によってトリガされる SAX インタフェースの使用法

(43)

7.2 SAX ハンドラの例

コンテンツ・ハンドラの設定と使用方法の理解を深めるため、以下の例について考察します。ユーザ が、ファイル内のすべての要素のリストを取得する場合を想定します。そのためには、すべての開始 要素を記述する必要があります (それぞれは対応する終了要素を持つ必要があります)。そのプロ セスは、以下の通りです。 1. %XML.SAX.ContentHandler から派生した、MyApp.Handler というクラスを生成します。

Class MyApp.Handler Extends %XML.SAX.ContentHandler {

}

2. ContentHandler クラスの startElement メソッドを、以下のコンテンツでオーバーライドします。

Class MyApp.MyHandler extends %XML.SAX.ContentHandler {

// ...

Method startElement(uri As %Library.String, localname As %Library.String, qname As %Library.String, attrs As %Library.List)

{

// we've found an element Write !,"Element: ",localname }

}

3. クラス・メソッドを、外部ファイルを読み、解析するHandler クラスに追加します。

Class MyApp.MyHandler extends %XML.SAX.ContentHandler {

// ...

ClassMethod ReadFile(file as %String) {

// create an instance of MyHandler class Set handler = ##Class(MyHandler).%New() // now parse the file using the handler

Set sc = ##Class(%XML.SAX.Parser).ParseFile(file,handler) } } これは、処理を実行するためにアプリケーションで実行される、クラス・メソッドであることに注意 してください。このメソッドは、以下を実行します。 a. これは、コンテンツ・ハンドラ・オブジェクトのインスタンスを生成します。

Set handler = ##Class(MyHandler).%New()

b. これは、%XML.SAX.Parser クラスの ParseFile メソッドを実行します。これは、(file で指定さ れた) ドキュメントの検証、および解析を行い、コンテンツ・ハンドラ・オブジェクトの様々なイ ベント処理メソッドを実行します。

Set sc = ##Class(%XML.SAX.Parser).ParseFile(file,handler)

参照

関連したドキュメント

l 「指定したスキャン速度以下でデータを要求」 : このモード では、 最大スキャン速度として設定されている値を指 定します。 有効な範囲は 10 から 99999990

※ 硬化時 間につ いては 使用材 料によ って異 なるの で使用 材料の 特性を 十分熟 知する こと

この課題のパート 2 では、 Packet Tracer のシミュレーション モードを使用して、ローカル

本装置は OS のブート方法として、Secure Boot をサポートしています。 Secure Boot とは、UEFI Boot

次に、第 2 部は、スキーマ療法による認知の修正を目指したプログラムとな

当社は「世界を変える、新しい流れを。」というミッションの下、インターネットを通じて、法人・個人の垣根 を 壊 し 、 誰 もが 多様 な 専門性 を 生 かすことで 今 まで

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge

計量法第 173 条では、定期検査の規定(計量法第 19 条)に違反した者は、 「50 万 円以下の罰金に処する」と定められています。また、法第 172