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 が発行されます。
<Employee>
<EmpNo>10</EmpNo>
<Name>Smith</Name>
</Employee>
Record Employee {XMLStructure = xmlStructureKind.sequence}
EmpNo INT;
Name STRING;
end
ほとんどの場合、 レコード・パーツには、XML 文字列の要素と属性の名前に (文字および大/小文字の区別に関して) 一致する、フィールド名のセットが含まれます。 名前が一致しない場合は、 EGL のプロパティーを使用して XML の要素名または属性名を指定します。
- レコードからの XML 文字列割り当て。レコードを XML 文字列に変換する場合、 文字列の作成時にデフォルトを受け入れることも、 EGL ランタイムにより XML 文字列の要素または属性に割り当てられる 名前などの詳細を明示的に指定することもできます。
- レコードに書き込まれる XML 文字列の検査。XML 文字列をレコードに書き込もうとすると、
以下のケースでは、
EGL ランタイムにより RuntimeException が発行されます。
- 要素名または属性名が、等価なレコード・フィールド名と 一致しない (または、プロパティー・フィールドに指定したオーバーライドと一致しない)。 または、
- XML 文字列および関係するレコードの構造に 不一致がある。
XML 文字列の割り当てに使用する場合と、検査に使用する場合の、 この 2 つの使用法に留意してください。
<Sample color="green"></Sample>
Record root
Sample Sample? {@XMLElement {nillable = true}};
end
Record Sample {@XMlStructure = xmlStructureKind.simpleContent}
color STRING {@XMLAttribute{}};
value STRING;
end
- root.Sample が空ストリング ("") の場合は、
書き込まれる出力は次のとおりです。
<root><Sample color="green"></Sample></root> - root.Sample が NULL で、
後述するように、プロパティー・フィールド nillable が設定されている場合は、
書き込まれる出力は次のとおりです。
<root><Sample xsi:nil="true></Sample></root>
<Employee>
<EmpNo department="Sales">10</EmpNo>
<Name>Smith</Name>
</Employee>
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 可能フィールド
Record Employee
EmpNo INT;
Name STRING?;
end
- フィールド (例えば、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 に関する追加情報
- W3 スクールでは、XML および XSD のチュートリアルを提供しています。 これらのチュートリアルへは、次のサイトで「XML」または「XSD」を検索することにより、アクセスできます。
- XML および XSD はともに、Margolis 氏と Sharpe 氏による 『SOA for the Business Developer』(MC Press、2007 年 5 月) で説明されています。 この内容は、次のサイトで参照できます。
- XML スキーマの詳細な概要は、次の URL の World Wide Web Consortium から 入手できます。
EGL で入手できる、これらに代わる情報を完全に理解するには、 XML に関係するプロパティーに関するトピックを確認してください。さらに、EGL ランタイムは XMLProcessingException を発行する場合があることに注意してください。これについては『XML の例外レコード』で説明しています。