ホーム > 製品情報 > SophiaFramework UNIVERSE > SophiaFramework UNIVERSE XML ミドルウェア for BREW

SophiaFramework UNIVERSE XML ミドルウェア for BREW

目次

  1. はじめに
  2. DOM ツリー
    1. DOM ツリーの構築
    2. XML 文書の処理
  3. XML 文書の作成
    1. DOM ツリーの構築と保存
    2. 名前空間付き XML 文書の作成
  4. DOM ( Document Object Model ) と SAX ( The Simple API for XML )
  5. DTD と XMLSchema
    1. DTD 付き XML 文書の処理
    2. XML Schema 付き XML 文書の処理
  6. Web サービスの開発
    1. SOAP : Simple Object Access Protocol
    2. 入力パラメーター
    3. 戻り値
  7. 制約事項

はじめに

"SFXXML・・・・・・"で始まる SophiaFramework UNIVERSE の XML 関連クラスは、XML 文書の作成、解析、及び WSDL / SOAP の処理から構成されます。

XML パーサは DTD と XMLSchema をサポートし、 DOM パーサーと SAX パーサーが利用できます。

WSDL 1.1SOAP 1.1 / 1.2 に対応しています。

また、HTTPS を使ったセキュアな Web サービスにも利用可能です。

SOAP Attachment は実装されていません。また、SOAP Fault は SOAP 1.1 だけをサポートします。

DOM ツリー

XMLノード ツリーの構築

W3C で定義される 12 種類のノードに対応する、以下のクラスを使って DOM ツリーを構築します。これらのクラスは SFXXMLNode クラスを継承します。

[ SFXXMLNode クラスの継承関係 ]

SophiaFramework UNIVERSE DOM ツリー


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 文書の処理フロー ]

SophiaFramework UNIVERSE XML 処理の流れ

XML パーサー ( XML プロセッサ ) は、文法チェック ( DTD または XMLSchema ) された XML 文書を、ツリー構造としてメモリ上に展開して、アプリに渡します。

実際のアプリでは、DOM パーサー ( SFXXMLDOMParser / SFXXSDDOMParser ) を呼んで XML 文書を解析し、DOM ツリー ( SFXXMLDocument ) を取得します。

[ シーケンス図 ]

SophiaFramework UNIVERSE XML シーケンス図

イメージを拡大


SophiaFramework UNIVERSE 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 クラスを提供します。

SFXXMLDOMParserSFXXMLSAXParser の基本機能

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 サービスには SOAPWSDLUDDI の 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 サービスの戻り値は次のいずれかの方法で取得します。

  1. SFXSOAPRPC クラスの GetResultValueByName 関数でパラメーターを指定して戻り値を取得します。

  2. SFXSOAPParser クラスを使って SOAP メッセージを解析して戻り値を取得します。( WSDL 文書で maxOccurs="unbounded" と宣言した結果、同じ名前のパラメーターが複数存在する場合、最後のパラメーターの値だけが保存されます )

サーバーから、SOAP Fault 要素を含む SOAP メッセージが返信されたとき、コールバック関数の error 値は SFERR_SOAP_FAULT_MESSAGE になります。 具体的なエラー情報は、SFXSOAPRPC::FAULT から取得できます。

※ SFXSOAPRPC クラスでサーバーに接続するときは、HTTP または HTTPS が使われます。

制約事項

  1. エンコーディングは UTF-8、EUC-JP、EUC-CN、Shift_JIS に対応しています。文字コード変換も相互に可能です。UTF-16 ( B / L )、UTF-32 ( B / L )には対応していません。
  2. DOM パーサは多くのメモリを必要とします。特に、DTD、XMLSchema、WSDL を使う場合は、たくさんのヒープ メモリが必要になります。
  3. 将来的に、W3C ( World Wide Web Consortium ) の XML 標準仕様は変更される可能性があります。