要素と属性に対するネームスペースの指定
XML の要素と属性は、異なるネームスペースに属すことができ、XML スキーマの仕様により、ネームスペースの割り当ての制御および表示には複数の方法が提供されています。%XML.AdaptorOpens in a new tab クラスは、該当するサポートを XML ドキュメントに提供します。
"タイプのネームスペースの指定" も参照してください。
このトピックの XML 例はリテラル形式になります。
このページで説明されているクラスとプロパティのパラメータ |
---|
|
概要
ここでは、XML ネームスペースの更新処理について説明します。また、InterSystems IRIS® データ・プラットフォーム・オブジェクトが XML ネームスペースに割り当てられる方法の概要も説明します。
ネームスペース更新処理
このドキュメントでは全般的に、読者が XML に精通していると想定しています。ただし、XML ドキュメントで要素や属性に割り当てられるネームスペースがある場合には、そのネームスペースを決定する方法を見直すことが重要な場合があります。
まず、XML ドキュメントが既定のネームスペースもしくはネームスペースの接頭語を、XML ドキュメントが持つあらゆる要素や属性に対して含まない限り、対応する XML スキーマの確認が必要です。インポートされた要素や属性を除いて、どの要素や属性も次の内のいずれかとなります。
-
Qualified (修飾された) はスキーマのターゲット・ネームスペース内にある要素または属性を意味します。
-
Unqualified (無修飾) は要素と属性では意味が異なります。無修飾の要素とはネームスペースにない要素を意味します。無修飾の属性とは、要素を含んだ既定のネームスペースがある場合に、そこに存在する属性を意味します。
定義する各要素や属性について、スキーマは、その項目が修飾されたものか、もしくは無修飾のものかを示します。スキーマはこれを以下の組み合わせにより行います。
-
<schema> 要素は elementFormDefault および attributeFormDefault 属性を指定できます。これにより、スキーマの任意の要素および属性の既定ネームスペース割り当てを制御します。指定できる値は "qualified" および "unqualified" になります。
これらの属性はオプションです。既定値は両項目とも "unqualified" です。つまり、既定では要素もしくは属性が接頭語なしで使用される場合、それはネームスペースにはないことになります。
-
次に、要素もしくは属性の定義で form 属性の指定ができます。これはその項目をどのようにネームスペースに割り当てるかを示すものです。指定できる値は "qualified" および "unqualified" になります。
以下の XML ドキュメントについて考えてみます。
<?xml version="1.0" encoding="UTF-8"?>
<ClassA xmlns="mynamespace" xmlns:s01="mynamespace" s01:String1="abcdef">
<s01:ClassB xmlns="">
<String3>qrstuv</String3>
<String4>wxyz</String4>
</s01:ClassB>
<String2>ghijkl</String2>
</ClassA>
ここでは、わかりやすくするために、対応するスキーマ・ドキュメントが elementFormDefault および attributeFormDefault の既定値を使用し、form 属性は定義するどの項目に対しても指定しないことを想定しています。さらに、このドキュメントの項目は、以下のようにネームスペースにあります。
-
以下の 2 つの項目により、<ClassA> 要素は mynamespace にあります。
-
これは、この要素とその直接の子 (xmlns="mynamespace") の既定のネームスペース宣言で指定されたネームスペースです。
-
<ClassA> 要素には、他のネームスペースを示すネームスペース接頭語がありません。
-
-
String1 属性は mynamespace にあります。この属性では s01 接頭語を使用しているからです。xmlns:s01 ネームスペース宣言は、s01 で mynamespace ネームスペースを参照することを示しています。
スキーマは attributeFormDefault ("unqualified") を既定で使用しているので、String1 属性はネームスペースの接頭語を使用しなくても、mynamespace にあることになります。
-
<ClassB> 要素は mynamespace にあります。この属性では s01 接頭語を使用しているからです。
-
以下の 2 つの項目により、<String3> 要素と <String4> 要素は、いずれのネームスペースにもありません。
-
親要素のネームスペース宣言は、ここでの既定のネームスペースが NULL (xmlns="") であることを示します。
-
これらの要素には、他のネームスペースを示すネームスペース接頭語がありません。
-
-
<String2> 要素は mynamespace ネームスペースになります。これが、その親要素で指定された既定のネームスペースだからです。
XML のネームスペースとクラス
InterSystems IRIS XML サポートでは、クラスごとにネームスペースを指定します。NAMESPACE クラス・パラメータを使用して、そのクラスおよびその直接の子オブジェクトのインスタンスのネームスペースを指定します。また、ELEMENTQUALIFIED パラメータと ATTRIBUTEQUALIFIED パラメータを使用して、そのオブジェクト値プロパティのプロパティがグローバル (親と同じネームスペースに属している) かローカルかを指定します。
プロパティ パラメータとして、ELEMENTQUALIFIED を指定することもできます (このドキュメントでは説明していない、特殊なシナリオで必要とされる場合)。
ネームスペースとコンテキスト
特にネームスペースでは、XML 対応オブジェクトがコンテキストに応じて処理が異なることに注意することが重要です。例えば、Address オブジェクトを最上位レベルでエクスポートすると、そのオブジェクトはグローバル要素となります。Address オブジェクトへの参照を含む Person オブジェクトをエクスポートすると、Address はローカル要素 (Person のその他すべてのプロパティとして) となります。グローバル要素とローカル要素は異なる方法でネームスペースに割り当てられます。
グローバル要素として扱われるオブジェクトのネームスペースの指定
XML 対応のオブジェクトを最上位レベルでインポートまたはエクスポートすると、そのオブジェクトは、グローバル要素になり、以下のようにネームスペースに割り当てられます。
-
クラスの NAMESPACE パラメータを指定した場合は、要素はそのネームスペースに割り当てられます。
-
クラスの NAMESPACE パラメータを指定しない場合は、要素はどのネームスペースにも属しません。ただし、エクスポート中にネームスペースを指定することができます。"オブジェクトからの XML 出力の記述" を参照してください。
例えば、以下のクラス定義について考えてみます。
Class MyApp.Person Extends (%Persistent, %XML.Adaptor)
{
Parameter NAMESPACE = "http://www.person.org";
Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
}
このクラスのオブジェクトをエクスポートまたはインポートする場合、プロジェクションは以下のようになります。
<Person xmlns="http://www.person.org">
<Name>Isaacs,Rob G.</Name>
<DOB>1981-01-29</DOB>
</Person>
要素として投影されるプロパティのネームスペースの指定
このセクションでは、要素として投影されるプロパティのネームスペースを指定する方法について説明します。
ケース 1 : プロパティがローカル要素として扱われる場合
XML 対応のオブジェクトを最上位レベルでインポートまたはエクスポートすると、要素として投影されるすべてのプロパティは、既定でローカル要素になります。これらのローカル要素には、以下の 2 つのネームスペースを割り当てることができます。
-
親クラスの ELEMENTQUALIFIED クラス・パラメータが 1 の場合、ローカル要素は修飾されており、親要素のネームスペースに明示的に含まれます。
-
親クラスの ELEMENTQUALIFIED クラス・パラメータが 0 の場合、ローカル要素は修飾されず、どのネームスペースにも属しません。(ただし、エクスポート中にネームスペースを指定することができます。"オブジェクトからの XML 出力の記述" を参照してください。
いずれの場合も、子クラスのネームスペースは無視されます。
ELEMENTQUALIFIED の既定は、入力または出力がリテラル形式かエンコード形式かによって異なります。リテラル形式は既定値で、最も一般的です。
リテラル形式では、ELEMENTQUALIFIED の既定は 1 です。エンコード形式では、ELEMENTQUALIFIED の既定は 0 です。
これらの形式の詳細は、"XML ドキュメントのフォーマット・オプションの指定" を参照してください。
ケース 2 : プロパティがグローバル要素として扱われる場合
プロパティをグローバル要素に入れ、それをネームスペースに割り当てることもできます。そのためには、XMLREF プロパティ・パラメータを 1 に設定します。以下では、対応する要素がどのようにネームスペースに割り当てられるのかについて説明します。
-
REFNAMESPACE プロパティ・パラメータを指定した場合、要素はそのネームスペースに入ります。
-
それ以外の場合、要素は、以下のようにネームスペースに割り当てられます。
-
プロパティが任意のタイプで、かつ XSDTYPE クラス・パラメータを指定する場合、要素は親クラスのネームスペースに入ります。
-
それ以外で、プロパティ・クラスが NAMESPACE クラス・パラメータを定義する場合は、要素はプロパティ・クラスのネームスペースに入ります。
-
プロパティ・クラスがこれらのどのクラス・パラメータも定義しない場合は、要素はどのネームスペースにも入りません。
-
XMLREF プロパティ・パラメータは XMLELEMENTREF プロパティ・パラメータを置換します。ただし、XMLELEMENTREF パラメータは永久にサポートされます。
属性として投影されるプロパティのネームスペースの指定
このセクションでは、属性として投影されるプロパティのネームスペースを指定する方法について説明します。ATTRIBUTEQUALIFIED パラメータにより、属性がネームスペース接頭語で修飾されるかどうかを指定します。指定可能な値は以下のとおりです。
-
0 (既定値) : これはネームスペース接頭語がないことを示します。
-
1 : これはネームスペース接頭語があることを示します。
XMLREF および REFNAMESPACE プロパティ・パラメータも、属性として投影するプロパティでサポートされています。
属性として投影されたプロパティでは、XMLREF プロパティ・パラメータを 1 に設定すると、対応する属性は以下のようにネームスペースに割り当てられます。
-
REFNAMESPACE プロパティ・パラメータを指定した場合、属性はそのネームスペースに入ります。
-
それ以外の場合
-
プロパティが任意のタイプで、かつ XSDTYPE クラス・パラメータを指定する場合、属性は親クラスのネームスペースに入ります。
-
それ以外の場合で、プロパティ・クラスが NAMESPACE クラス・パラメータを定義する場合は、属性はプロパティ・クラスのネームスペースに入ります。
-
プロパティ・クラスがこれらのどのクラス・パラメータも定義しない場合は、属性はどのネームスペースにも入りません。
-
ネームスペースのカスタム接頭語の指定
オブジェクトの XML 出力を生成する場合、システムは必要に応じてネームスペース接頭語を生成します。最初のネームスペースの接頭語は s01、次は s02、のように付与されます。別の接頭語を指定することもできます。そのためには、XML 対応オブジェクト自体のクラス定義で XMLPREFIX パラメータを設定します。このパラメータには以下の 2 つの効果があります。
-
指定した接頭語が XML 出力で宣言されるようになります。つまり、不要な場合でも宣言されます。
-
自動生成の接頭語 (このパラメータを設定しない場合はこれが使用される) でない接頭語が使用されます。
例えば、以下のようなクラス定義があるとします。
Class GXML.Person Extends (%Persistent, %XML.Adaptor)
{
Parameter XMLPREFIX = "p";
Parameter NAMESPACE = "http://www.person.com";
Parameter XMLNAME = "Person";
Property Name As %Name;
}
このクラスの場合、XML 出力は以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<Person xmlns="http://www.person.com" xmlns:p="http://www.person.com">
<Name>Umansky,Jocelyn O.</Name>
</Person>
XML へのエクスポートの詳細は、"XML ツールの使用法" を参照してください。
推奨事項
開発、デバッグ、およびトラブルシューティングを簡素化するには、以下の方法をお勧めします。
-
ネームスペースを指定する必要がある場合は、すべての XML 対応クラスで NAMESPACE を指定します。そうでない場合、既定値の設定ルールが複雑になります。
-
ローカル要素が修飾されるかどうかを制御する必要がある場合は、すべての XML 対応クラスで ELEMENTQUALIFIED パラメータも指定します。