目次
- はじめに
- DOM ツリー
- XML 文書の作成
- DOM ( Document Object Model ) と SAX ( The Simple API for XML )
- DTD と XMLSchema
- Web サービスの開発
- 制約事項
はじめに
"SFXXML・・・・・・"で始まる SophiaFramework UNIVERSE の XML 関連クラスは、XML 文書の作成、解析、及び WSDL / SOAP の処理から構成されます。
XML パーサは DTD と XMLSchema をサポートし、 DOM パーサーと SAX パーサーが利用できます。
WSDL 1.1 と SOAP 1.1 / 1.2 に対応しています。
また、HTTPS を使ったセキュアな Web サービスにも利用可能です。
※ SOAP Attachment は実装されていません。また、SOAP Fault は SOAP 1.1 だけをサポートします。
SOAP ( Simple Object Access Protocol )
WSDL ( Web Services Description Language )
DOM ツリー
XMLノード ツリーの構築
W3C で定義される 12 種類のノードに対応する、以下のクラスを使って DOM ツリーを構築します。これらのクラスは SFXXMLNode クラスを継承します。
[ SFXXMLNode クラスの継承関係 ]
12 種類の XML ノード クラス
クラス名 | 解説 | ノード タイプ |
---|---|---|
SFXXMLNode | 抽象ノード | - |
SFXXMLElement | Element ノード | ELEMENT_NODE |
SFXXMLAttribute | Attribute ノード | ATTRIBUTE_NODE |
SFXXMLText | Text ノード | TEXT_NODE |
SFXXMLCDATASection | CDATASection ノード | CDATA_SECTION_NODE |
SFXXMLEntityReference | EntityReference ノード | ENTITY_REFERENCE_NODE |
SFXXMLEntity | Entity ノード | ENTITY_NODE |
SFXXMLProcessingInstruction | ProcessingInstruction ノード | PROCESSING_INSTRUCTION_NODE |
SFXXMLComment | Comment ノード | COMMENT_NODE |
SFXXMLDocument | Document ノード | DOCUMENT_NODE |
SFXXMLDocumentType | DocumentType ノード | DOCUMENT_TYPE_NODE |
SFXXMLDocumentFragment | DocumentFragment ノード | DOCUMENT_FRAGMENT_NODE |
SFXXMLNotation | DocumentFragment ノード | DOCUMENT_FRAGMENT_NODE |
SFXXMLNode の基本機能
DOM ツリーを操作するための関数
関数名 | 解説 |
---|---|
GetFirstChild | 最初の子ノードを取得します。 |
GetLastChild | 最後の子ノードを取得します。 |
GetNextSibling | 次の兄弟ノードを取得します。 |
GetPreviousSibling | 前の兄弟ノードを取得します。 |
GetParentNode | 親ノードを取得します。 |
DOM ツリーを構築するための関数
関数名 | 解説 |
---|---|
AppendChild | 子ノードを追加します。 |
RemoveChild | 子ノードを削除します。 |
ReplaceChild | 子ノードを置換します。 |
InsertBefore | ノードを挿入します。 |
CloneNode | ノードをコピーします。 |
ノードの属性を設定・取得するための関数
関数名 | 解説 |
---|---|
HasChildNodes | 子ノードを持つかどうかを判定します。 |
GetChildNodes | 全ての子ノードを取得します。 |
GetNodeType | ノード タイプを取得します。 |
GetNodeName | ノード名を取得します。 |
GetNodeValue | ノード内容を取得します。 |
SetNodeValue | ノード内容を更新します。 |
GetText | ノードのテキストを取得します。 |
SetText | ノードにテキストを設定します。 |
ノードを比較するための関数
関数名 | 解説 |
---|---|
IsSameNode | 2 つのノードが同一かを判定します。 |
EqualNode | 2 つのノードが同等かを判定します。 |
XML 文書の処理
[ XML 文書の処理フロー ]
XML パーサー ( XML プロセッサ ) は、文法チェック ( DTD または XMLSchema ) された XML 文書を、ツリー構造としてメモリ上に展開して、アプリに渡します。
実際のアプリでは、DOM パーサー ( SFXXMLDOMParser / SFXXSDDOMParser ) を呼んで XML 文書を解析し、DOM ツリー ( SFXXMLDocument ) を取得します。
[ シーケンス図 ]
-
■ SFXXMLDocument クラスの機能 :
1. DOM ツリーを構築できます。
2. DOM ツリーを保存できます。
3. DOM ツリーを操作できます。
※ XML パーサ ( XML プロセッサ ) では、DOM ツリー ( SFXXMLDocument ) が最も重要な役割を果たします。
XML 文書の作成
DOM ツリーの構築と保存
SFXXMLDocument クラスを使って、DOM ツリーを構築し、Save 関数で XML 文書としてファイル保存します。
SFXXMLDocument オブジェクトは DOM ツリーのルート ノードとなります。
Create 関数でノード ( SFXXMLNode オブジェクト ) を作成して、DOM ツリーを構築します。
すべてのノードは DOM ツリーのルート ノード ( SFXXMLDocument オブジェクト ) で管理します。
[ DOM ツリーを構築するコード ]
SFXXMLElementPtr element = document.CreateElement("new_node"); // 新しいノードを作る document.AppendChild(element); // 指定された位置に追加する
名前空間付き XML 文書の作成
SFXXMLDocument クラスには、名前空間の処理のために SFXXMLDocument::CreateElementNS 関数と SFXXMLDocument::CreateAttributeNS 関数が用意されています。
名前空間付き XML 文書では、要素または属性の名前の形式は「prefix:localname」のように、prefix とlocalname に分かれます。
SFXXMLDocument::CreateElementNS 関数で要素を作成すると、「xmlns:'prefix'="URI"」という属性が自動的に作成されます。
SFXXMLDocument::CreateAttributeNS 関数を使う場合は、SFXXMLElement::SetAttribute 関数で名前空間を設定する必要があります。
DOM ( Document Object Model ) と SAX ( The Simple API for XML )
XML パーサ ( XML プロセッサ ) には、DOM と SAX の2つがあります。
DOM は XML 文書をひとつのツリーとしてメモリ上に展開します。XML 文書の操作は簡単ですが、多くのメモリが必要になります。
SAX は XML 文書を先頭から順次読み取り、イベント ドリブンで処理する API です。
SAX は DOM ツリーをメモリ上に構築しないので、DOM よりも少ないメモリで処理できます。また、DOM の場合、DOM ツリーを構築するまでは次の処理に移れませんが、SAX は解析しながら処理をするので高速です。
SophiaFramework UNIVERSE は DOM パーサとして SFXXMLDOMParser クラスと SFXXSDDOMParser クラス、 SAX パーサとして SFXXMLSAXParser クラスを提供します。
SFXXMLDOMParser と SFXXMLSAXParser の基本機能
XML 文書の解析
関数名 | 解説 |
---|---|
Parse | XML 文書を解析します。 |
パーサ属性の設定と取得
関数名 | 解説 |
---|---|
SetGrammar | パーサが使う文法を設定します。 |
Set / GetDoNamespaces | 名前空間を処理するかどうかを設定 / 取得します。 |
Set / GetDoIndent | 文書をインデントするかどうかを設定 / 取得します。 |
Set / GetDoSchema | スキーマを処理するかどうかを設定 / 取得します。 |
Set / GetCreateCommentNodes | コメント ノードを生成するかどうかを設定 / 取得します。 |
Set / GetValidationSchema | XML 文書を Schema で検証するかどうかを設定 / 取得します。 |
Set / GetValidationDTD | XML 文書を DTD で検証するかどうかを設定 / 取得します。 |
Set / GetLoadExternalDTD | DTD 付き XML 文書の外部 DTD ファイルをロードするかどうかを設定 / 取得します。 |
Set / GetIgnoreAnnotations | XMLSchema 付き XML 文書の annotation 要素を無視するかどうかを設定 / 取得します。 |
SetSchemaLocation | XMLSchema 付き XML 文書の XSD ファイルを指定します。 |
GetDocument | DOM ツリーのルート ノードを取得します。 |
※ Set / Get 関連関数は IgnoreAnnotations 関数を除き、デフォルト値はfalseです。
ノードの取得
関数名 | 解説 |
---|---|
GetFirstChildElement | 指定したノードの最初の子ノードを取得します。 |
GetFirstChildElementNS | 指定した名前空間付きノードの最初の子ノードを取得します。 |
GetNextSiblingElement | 指定したノードの次の兄弟ノードを取得します。 |
GetNextSiblingElementNS | 指定した名前空間付きノードの次の兄弟ノードを取得します。 |
※ 上記のメンバ関数は SFXXMLSAXParser クラスにはありません。
※ SAX パーサーで解析する方法 : XML 文書解析時に通知されるイベントを処理するハンドラを SFXXMLDefaultHandler クラスを継承するクラスにて実装する必要があります。 実装したクラスは SFXXMLSAXParser クラスに登録します。
DTD と XMLSchema
DTD と XMLSchema は、XML 文書を解析するときに、その文書が正しい形式で構成されているかどうかをチェックするための文法です。
DTD では、データ型を定義できません。また、文法 XML で記述されていません。
XMLSchema の構文は XML 形式で記述され、データ型の定義や名前空間が扱えるなど、DTD には含まれない機能があります。
SophiaFramework UNIVERSE は、DTD と XMLSchema をサポートしています。DTD や XMLSchema を使うと、解析しているときに、文法で違反しているデータがあれば、エラーが返ります。
DTD 付き XML 文書の処理
DTD 付き XML 文書の処理は SFXXMLDOMParser クラスまたは SFXXMLSAXParser クラスの Set / GetValidationDTD、Set / GetLoadExternalDTD 関数を使います。 DTD が XML 文書とは別のファイル ( 外部 DTD ファイル ) で定義される場合、SetLoadExternalDTD 関数のパラメーターを true に指定して外部 DTD ファイルをロードします。
SFXXMLDocumentType オブジェクトを取得して、オブジェクトに対して、以下のような DTD に関連する操作が可能です。
関数名 | 解説 |
---|---|
GetEntities | DTD で宣言される全エンティティを取得します。 |
GetNotations | DTD で宣言される記法を取得します。 |
GetPublicID | 外部サブセットの公開識別子を取得します。 |
GetSystemID | 外部サブセットのシステム識別子を取得します。 |
XML Schema 付き XML 文書の処理
XML Schema 付き XML 文書の処理は SFXXMLDOMParser クラスまたは SFXXMLSAXParser クラスのSet / GetDoSchema、Set / GetValidationSchema、Set / GetIgnoreAnnotations、SetSchemaLocation 関数を使います。
SetDoNamespaces を true にすると、名前空間を設定できます。
Web サービスの開発
Web サービスには SOAP、WSDL、UDDI の 3 つの要素技術があります。データはすべて XML の形式に基づいて記述され、HTTP / SMTP などのインターネットプロトコルによって実装されます。
SophiaFramework UNIVERSE では、 SOAP ( SFXSOAPParser / SFXSOAPWriter / SFXSOAPRPC ) のクラスが提供されます。 SFXSOAPParser / SFXSOAPWriter / SFXSOAPRPC クラスでは、SOAP メッセージの解析、作成、基本的な RPC 通信の機能が提供されます。
SOAP : Simple Object Access Protocol
SOAP メッセージは Envelope、Header、Body の 3 つの要素から構成されます。 SFXSOAPParser クラスは SFXXMLDOMParser クラスから継承し、XML ツリーをメモリ上に展開します。XML ツリー オブジェクトを取得することなく、SOAP メッセージを解析するだけで、SOAP メッセージの任意の情報が取得できます。
SFXSOAPParser クラスの関数 ( 抜粋 1 )
関数名 | 解説 |
---|---|
GetEnvelope | SOAP メッセージの Envelope 要素を取得します。 |
GetHeader | SOAP メッセージの Header 要素を取得します。 |
GetBody | SOAP メッセージの Body 要素を取得します。 |
GetFault | SOAP メッセージの Fault 要素を取得します。 |
SFXSOAPParser クラスの関数 ( 抜粋 1 )
関数名 | 解説 |
---|---|
GetBodyEntries | SOAP メッセージの Body 要素のすべての子要素を取得します。 |
GetHeaderEntries | SOAP メッセージの Header 要素のすべての子要素を取得します。 |
GetBodyEntry | SOAP メッセージの Body 要素の中で、指定した要素を取得します。 |
GetHeaderEntry | SOAP メッセージの Header 要素の中で、指定した要素を取得します。 |
GetRPCParameter | SOAP メッセージの Body 要素の中で、指定したパラメーターと一致する要素を取得します。 |
GetRPCResult | SOAP メッセージの Body 要素の第 1 子要素の第 1 子要素を取得します。 |
GetRPCStruct | SOAP メッセージの Body 要素の第 1 子要素を取得します。 |
SFXSOAPWriter クラスは SFXXMLDocument クラスを使って、SOAP メッセージの各要素を作成するクラスです。
SFXSOAPRPC クラスは SFXSOAPParser クラスと SFXSOAPWriter クラスを使って、 SOAP-RPC を実装するクラスです。
Web サービスの関数名、ターゲットとなる URI、パラメータ、サーバーの IP アドレス、Web サービスとその機能の soapAction 属性値、コールバック 関数を設定するだけで、Web サービスを呼び出せます。
SFXSOAPWriter クラスで作成した SOAP メッセージを SFXSOAPRPC::Invoke 関数に渡して、Web サービスを呼び出します。最短の場合、プログラミング コードは数行で済みます。
入力パラメーター
SFXSOAPRPC クラスでは、 SOAP メッセージに記された入力パラメーターを設定します。
戻り値
レスポンスとして返される SOAP メッセージはコールバック関数に渡されます。そのとき、Web サービスの戻り値は次のいずれかの方法で取得します。
- SFXSOAPRPC クラスの GetResultValueByName 関数でパラメーターを指定して戻り値を取得します。
- SFXSOAPParser クラスを使って SOAP メッセージを解析して戻り値を取得します。( WSDL 文書で maxOccurs="unbounded" と宣言した結果、同じ名前のパラメーターが複数存在する場合、最後のパラメーターの値だけが保存されます )
サーバーから、SOAP Fault 要素を含む SOAP メッセージが返信されたとき、コールバック関数の error 値は SFERR_SOAP_FAULT_MESSAGE になります。 具体的なエラー情報は、SFXSOAPRPC::FAULT から取得できます。
※ SFXSOAPRPC クラスでサーバーに接続するときは、HTTP または HTTPS が使われます。
制約事項
- エンコーディングは UTF-8、EUC-JP、EUC-CN、Shift_JIS に対応しています。文字コード変換も相互に可能です。UTF-16 ( B / L )、UTF-32 ( B / L )には対応していません。
- DOM パーサは多くのメモリを必要とします。特に、DTD、XMLSchema、WSDL を使う場合は、たくさんのヒープ メモリが必要になります。
- 将来的に、W3C ( World Wide Web Consortium ) の XML 標準仕様は変更される可能性があります。