XML 文字列と EGL 変数の間の対応

このトピックでは、Extensible Markup Language (XML) 文字列に対応する EGL レコードについて説明します。 その他のトピックでは、サード・パーティー REST サービスにアクセスする場合などに 必要とされる、XML データと変数の間の変換のために Rich UI 開発者が使用する serviceLib.convertFromXML 関数および serviceLib.convertToXML 関数について 説明します。

XML と EGL レコード

XML 文字列の処理で使用される レコード (または、レコードの配列) の基礎となる EGL レコード・パーツを定義できます。 このレコード・パーツには、XML 文字列を検査するための言語である、 XML スキーマ内の記述の詳細が含まれます。

関数 XMLLib.convertToXML を使用すると、 EGL レコードの内容が XML 文字列に書き込まれます。関数 XMLLib.convertFromXML を使用すると、 XML 文字列が EGL レコードに書き込まれます。 文字列が、レコード内で指定されている妥当性検査規則を満たさない場合は、 EGL ランタイムにより RuntimeException が発行されます。

次は、XML 文字列の例です。明確にするために、複数行に分けて示しています。
<Employee>
   <EmpNo>10</EmpNo>
   <Name>Smith</Name> 
</Employee>
次は、 この例の XML 文字列に一致するレコード・パーツです。
Record Employee {XMLStructure = xmlStructureKind.sequence}
   EmpNo INT;
   Name STRING;
end

ほとんどの場合、 レコード・パーツには、XML 文字列の要素と属性の名前に (文字および大/小文字の区別に関して) 一致する、フィールド名のセットが含まれます。 名前が一致しない場合は、 EGL のプロパティーを使用して XML の要素名または属性名を指定します。

EGL の XML サポートには、以下の 2 つの側面があります。
  • レコードからの XML 文字列割り当て。レコードを XML 文字列に変換する場合、 文字列の作成時にデフォルトを受け入れることも、 EGL ランタイムにより XML 文字列の要素または属性に割り当てられる 名前などの詳細を明示的に指定することもできます。
  • レコードに書き込まれる XML 文字列の検査。XML 文字列をレコードに書き込もうとすると、 以下のケースでは、 EGL ランタイムにより RuntimeException が発行されます。
    • 要素名または属性名が、等価なレコード・フィールド名と 一致しない (または、プロパティー・フィールドに指定したオーバーライドと一致しない)。 または、
    • XML 文字列および関係するレコードの構造に 不一致がある。

XML 文字列の割り当てに使用する場合と、検査に使用する場合の、 この 2 つの使用法に留意してください。

次は、 属性を含む XML 文字列の例です。
<Sample color="green"></Sample>
color の属性値は 2 番目のレコードに格納されています。 2 つのレコード・パーツは以下のとおりです。
   Record root 
    		Sample Sample? {@XMLElement {nillable = true}};
   end
   
   Record Sample {@XMlStructure = xmlStructureKind.simpleContent}
      color STRING {@XMLAttribute{}};
      value STRING;
	 	end
EGL ランタイムは、XML ショートカット (<Sample color="green"/>) を読み込むことはできますが、書き込みができるのは次の長いほうの形式のみです。
  • root.Sample が空ストリング ("") の場合は、 書き込まれる出力は次のとおりです。
    	<root><Sample color="green"></Sample></root>
  • root.Sample が NULL で、 後述するように、プロパティー・フィールド nillable が設定されている場合は、 書き込まれる出力は次のとおりです。
    <root><Sample xsi:nil="true></Sample></root>
次は、XML 文字列の 3 つ目の例です。
<Employee>
   <EmpNo department="Sales">10</EmpNo>
   <Name>Smith</Name>
</Employee>
以下は 2 つのレコード・パーツです。
Record Employee{XMLStructure = xmlStructureKind.sequence}
   EmpNo EmpNumber;
   LastName STRING;
end

Record EmpNumber {XMLStructure = xmlStructureKind.simpleContent}
  	department STRING {@XMLAttribute{}};
   	value INT;
end
以下のデータ型はいずれも、レコード・フィールドに対して有効です。
  • STRING、または STRING と代入互換性がある FLOAT または BIN のいずれかのデータ型、 もしくは BIN に等価な整数 (INT、SMALLINT、 または BIGINT) のいずれか。
  • 上述のプリミティブ型のいずれかに基づくデータ項目。
  • 他の非構造化レコード・パーツ。このパーツのフィールドは、 上述のデータ型または他の非構造化レコード・パーツに制限されています。 レコード・パーツ内で参照されるレコード・パーツには、 ここにリストされているデータ型のフィールドのみを含めることができます。
  • 前述のデータ型の配列。

ANY 型のフィールドはサポートされていません。

レコード・パーツは、 ネストの任意のレベルにある他のレコード・パーツから参照できます。

NULL 可能フィールド

XML 要素に関係するレコード・フィールドは、 疑問符 (?) で示されるように NULL 可能です。例えば、 次の EmpNo フィールドは NULL 不可ですが、 name フィールドは NULL 可能です。
Record Employee
   EmpNo INT;
   Name STRING?;
end
EGL ランタイムが XML 文字列をレコードに読み込むときに、 以下の 2 つの規則が適用されます。
  • フィールド (例えば、EmpNo) が NULL 不可の場合、 不明な要素または値がない要素を読み込もうとすると、 EGL ランタイムにより RuntimeException がスローされます。
  • フィールド (例えば、Name) が NULL 可能な場合、 不明な要素または値がない要素を読み込もうとしても、EGL ランタイムにより例外がスローされることはありません。 後者のケースでは、値のない要素のすべての属性が保持されます。

レコードを XML 文字列に書き込むときの EGL ランタイムによる NULL の取り扱いに関するさまざまな方法について詳しくは、 プロパティー @XMLElement (または、 @XMLRootElement)、およびプロパティー・フィールド nillable を参照してください。

レコード・パーツのプロパティー

レコード・パーツを定義するときは、 以下のプロパティーを使用できます。
  • 複合プロパティー @XMLRootElement は、 ルート XML 要素に関する命名とデータ型の詳細を提供します。 ルート XML 要素は、XML 文字列内で最上位の、最も包括的な要素です。
  • シンプル・プロパティー XMLStructure は、XML 要素のセットの特性を指定します。

これらのプロパティーについての詳細は、『@RootElement』および『XMLStructure』で説明しています。

レコード・パーツに基づいたレコードを宣言するときに、 これらのプロパティーをオーバーライドすることはできません。

レコード・フィールドのプロパティー

レコード・パーツのフィールドを定義するとき、 またはレコード・パーツに基づいたレコードを宣言するとき、 以下のプロパティーを使用できます。
  • 複合プロパティー @XMLElement は、 XML 要素を表すレコード・フィールドに関する詳細を提供します。 デフォルトでは、このプロパティーは有効です。
  • 複合プロパティー @XMLAttribute は、XML 属性を表すレコード・フィールドに関する詳細を提供します。

これらのプロパティーについての詳細は、『@XMLElement』および『@XMLAttribute』で説明しています。

名前空間

Rich UI では、 名前空間を含む XML 文字列の読み込みと書き込みをサポートしています。プロパティー @RootElement@XMLElement、 および @XMLAttribute で名前空間を参照できます。

XML にデフォルトの名前空間が含まれている場合は、その名前空間の各 XML 要素のレコード・フィールドを定義するときに、その名前空間を参照する必要があります。XML 属性がデフォルトの名前空間に含まれることは ありません。属性は、名前空間接頭部を含むか、名前空間に含まれないかのいずれかです。

XML に関する追加情報

XML および最も一般的な XML 検証形式、 および XML スキーマ (XSD) に関する詳細な背景情報が、多くの Web サイトで提供されています。 以下は、本ヘルプ作成時に存在した、いくかの推奨情報です。
  • W3 スクールでは、XML および XSD のチュートリアルを提供しています。 これらのチュートリアルへは、次のサイトで「XML」または「XSD」を検索することにより、アクセスできます。

                 http://www.w3schools.com

  • XML および XSD はともに、Margolis 氏と Sharpe 氏による 『SOA for the Business Developer』(MC Press、2007 年 5 月) で説明されています。 この内容は、次のサイトで参照できます。

                 http://www.mc-store.com/5079.html

  • XML スキーマの詳細な概要は、次の URL の World Wide Web Consortium から 入手できます。

                 http://www.w3.org/TR/xmlschema-0/

EGL で入手できる、これらに代わる情報を完全に理解するには、 XML に関係するプロパティーに関するトピックを確認してください。さらに、EGL ランタイムは XMLProcessingException を発行する場合があることに注意してください。これについては『XML の例外レコード』で説明しています。


フィードバック