XML 仮想ドキュメントのプロパティ・パスの概要
このトピックでは、XML 仮想ドキュメントのプロパティ・パスの概要を示します。
次の 2 つのトピックでは、プロパティ・パスの作成方法について詳しく説明します。
データ変換では通常、ルール・セットや検索テーブルよりもより多くのプロパティ・パスのセットを使用するため、このトピックで示すコード例はデータ変換の一部です。また、DOM スタイル・パスは手動で作成する必要のあるパスなので、ここでは DOM スタイル・パスに重点を置いています (一方、使用するスキーマを指定する場合、InterSystems IRIS にドキュメントの構造が表示されるので、ドラッグ・アンド・ドロップを行うか、自動完了機能を使用すると、スキーマ依存パスが自動的に生成されます)。
XML 仮想ドキュメントの仮想プロパティ・パスの手引き
ここでは、XML 仮想ドキュメントの仮想プロパティ・パスについて簡単に説明します。
前述のとおり、スキーマ依存パスを使用できるのは、該当する XML スキーマをロード済みの場合のみです。一方、DOM スタイル・パスは、使用可能なスキーマがない場合でも常に使用できます。
スキーマ依存パスの基本構文
XML 仮想ドキュメントでは、スキーマ依存パスは以下の例のようにピリオドで区切られた一連のパス・ユニットで構成されます。
unit1.unit2.unit3
ここで、unit1 はドキュメント内の子 XML 要素の名前、unit2 は unit1 内の子要素の名前、というように続きます。リーフ・ユニットは、子 XML 要素と XML 属性のどちらかの名前です。
以下に例を示します。
HomeAddress.City
詳細は、"スキーマ依存パスの指定" を参照してください。
DOM スタイル・パスの基本構文
DOM スタイル・パスは、常にスラッシュで始まり、以下の例のような基本構造を持ちます。
/root_unit/unit1/unit2/unit3
各パス・ユニットのフォームは以下のとおりです。
namespace_identifier:name
namespace_identifier は XML ネームスペースを示します。これは、InterSystems IRIS によって実際のネームスペースの URI で置換されるトークンです (詳細は、後の項で説明します)。このトークンは、その要素または属性がネームスペースに含まれている場合にのみ必要です。
name は、XML 要素または属性の名前です。
以下に例を示します。
/$2:Patient/$2:HomeAddress/$2:City
詳細は、"DOM スタイル・パスの指定" を参照してください。
XML ネームスペース・トークン
スキーマを InterSystems IRIS にロードすると、そのスキーマで使用されるネームスペースの一連のトークンが確立され、あらゆる DOM スタイル・パスで使用できるようになります。
トークン $1 はスキーマで宣言された最初のネームスペースで使用され、これは通常、XML スキーマのネームスペース (http://www.w3.org/2001/XMLSchema) と一致します。トークン $2 はスキーマで宣言された次のネームスペースで使用され、$3 は 3 番目のネームスペースで使用される、というように続きます。
InterSystems IRIS では、スキーマで宣言されたすべてのネームスペースに対してネームスペース・トークンが割り当てられます。それらのネームスペースが実際に使用されるかどうかは関係ありません。そのため、スキーマで追加のネームスペースが宣言された場合、対象の項目に対して $2 ではなく $3 以上の値が使用される可能性があります。次の節で説明するように、特定のパス・ユニットに正しいトークンを使用していることを確認するには、管理ポータルを使用して個々のパス・ユニットを表示するのが実際に便利です。
ネームスペース・トークンを使用できるのは、該当するスキーマもロード済みの場合 (また、そのスキーマを使用するための適切なビジネス・ホストが構成済みの場合) です。それ以外の場合は、XML ドキュメントで指定されているとおりのネームスペース接頭語を使用する必要があります。
XML 仮想ドキュメントのパス・ユニットの表示
XML 仮想ドキュメントのプロパティ・パスを十分に理解するまでは、管理ポータルを使用して個々のパス・ユニットを表示すると便利です。そのためには、該当するスキーマをロードしておく必要があります。
スキーマ内の要素および属性のパス・ユニットを表示するには、以下の操作を行います。
-
前述の説明に従って、スキーマをロードします。
例えば、以下の参照用の XML スキーマを考えてみましょう。これは、XML スキーマに精通した読者に役立ちます。
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://myapp.com" xmlns:myapp="http://myapp.com"> <element name="Patient" type="myapp:Patient"/> <complexType name="Patient"> <sequence> <element minOccurs="0" name="Name" type="string"/> <element minOccurs="0" name="FavoriteColors" type="myapp:ArrayOfFavoriteColorString" /> <element minOccurs="0" name="Address" type="myapp:Address" /> <element minOccurs="0" name="Doctor" type="myapp:Doctor" /> </sequence> <attribute name="MRN" type="string"/> <attribute name="DL" type="string"/> </complexType> <complexType name="ArrayOfFavoriteColorString"> <sequence> <element maxOccurs="unbounded" minOccurs="0" name="FavoriteColor" nillable="true" type="string"/> </sequence> </complexType> <complexType name="Address"> <sequence> <element minOccurs="0" name="Street" type="string"/> <element minOccurs="0" name="City" type="string"/> <element minOccurs="0" name="State" type="string"/> <element minOccurs="0" name="ZIP" type="string"/> </sequence> </complexType> <complexType name="Doctor"> <sequence> <element minOccurs="0" name="Name" type="string"/> </sequence> </complexType> </schema>
以下に、この節で示すスキーマに従った XML ドキュメントの例を紹介します。
<?xml version="1.0" ?> <Patient MRN='000111222' xmlns='http://myapp.com'> <Name>Georgina Hampton</Name> <FavoriteColors> <FavoriteColor>Red</FavoriteColor> <FavoriteColor>Green</FavoriteColor> </FavoriteColors> <Address> <Street>86 Bateson Way</Street> <City>Fall River</City> </Address> <Doctor> <Name>Dr. Randolph</Name> </Doctor> </Patient>
-
[Interoperability]→[相互運用]→[XML]→[XML スキーマ構造] ページを選択します。左の列には、このネームスペースにロードされた XML スキーマがリストされます。
-
目的の XML スキーマに対応する行内の [カテゴリ] リンクを選択します。
上記の XML スキーマに対応する行のリンクをクリックした場合、以下のように表示されます。
-
目的のドキュメント・タイプのリンクを選択します。
[Patient] を選択した場合、以下のように表示されます。
このページでは、以下の操作を実行できます。
-
上の表で、大文字フォントの値はこの XML 要素の DocType 値を表しています。この場合の DocType は MyApp:Patient です。
-
[名前] 列には、スキーマ依存パスで必要な形式のパス・ユニットが表示されています。
この場合は、スキーマ依存パス内のパス・ユニットとして、Name、FavoriteColors、Address、Doctor、MRN、DL を使用できることがこのページからわかります。
-
[要素] 列には、DOM スタイル・プロパティ・パスで必要な形式のパス・ユニットが表示されています。
この場合は、DOM スタイル・パス内のパス・ユニットとして、$3:Name、$2:FavoriteColors/$2:FavoriteColor、$2:Address、$2:Doctor/$2:Name、@MRN、@DL を使用できることがこのページからわかります。@MRN と @DL にはネームスペース接頭語が含まれていないことに注意してください。これらの属性はどのネームスペースにも含まれていません。
-
-
必要に応じて、追加のサブ項目をクリックします。
[名前] 列の [アドレス] をクリックすると、以下のように表示されます。
このページには、Address 内のすべての追加パス・ユニットが表示されています。
この場合は、このページを表示するために使用したパス・ユニットとの組み合わせでこれらの追加パス・ユニットが使用できることがこのページからわかります。以下に例を示します。
パス・タイプ 例 スキーマ依存パス (部分) ...Address.Street DOM スタイル・パス (部分) /.../$2:Address/$2:Street
以下の節では、スキーマの変動による特定の変動に注目しています。
スキーマ依存パスの冗長な内部要素
スキーマ依存パスに対して、InterSystems IRIS では冗長な内部要素が縮小されます。これについては、以下の例で最もよく説明しています。
-
<FavoriteColors> 要素には、複数の <FavoriteColor> 要素のシーケンスが含まれています。スキーマ・ビューワ・ページの (スキーマ依存パスのパス・ユニットが表示される) [名前] 列には、<FavoriteColors> が FavoriteColors() とだけ表示されます。この列は以下の図では青で表示されています。
これに対して、右側の [要素] 列には、同じ要素が $2:FavoriteColors/$2:FavoriteColorsItem として表示されます。この列には、DOM スタイル・パスのパス・ユニットが表示されます。
同じタイプを持つ複数の項目のシーケンスの場合、スキーマ依存パスでは内部要素の名前は使用されません (一方、DOM スタイル・パスではすべての要素名が使用されます)。多くの場合、スキーマに含まれる冗長な内部レベルはすべて、スキーマ依存パスでは無視されます。以下の項目で別の例を示します。
-
<Doctor> 要素には、単一の <Name> 要素が含まれています。前の図で示したように、スキーマ・ビューワ・ページの [名前] 列には、<Doctor> 項目が Doctor として表示されます。
<Doctor> 内のデータへのスキーマ依存パスでは内部要素の名前が使用されないことに注意してください。
これに対して、右側の [要素] 列には、同じ項目が $3:Doctor/$3:Name として表示されます。この列には、DOM スタイル・パスのパス・ユニットが表示されます。
単一の繰り返されない外側要素があると、それはたたんで表示されます。これにより、プロパティ・パスが短くなるので内側要素のみを使用できます。外側要素が繰り返されている場合、このパスは短くならないので、すべての内側要素にアクセスできます。
ただし、外側要素のタイプを参照で定義していると、このパスが短くなるという制限があります。その場合、スキーマ依存のパスを使用すると、外側要素の先頭ノードよりも後の内側要素にはアクセスできません。DOM スタイルのパスを使用すれば、すべての内側要素にアクセスできます。この状態を防止するには、唯一の外側要素が繰り返されている場合、そのタイプを参照で定義しないようにします。
繰り返しフィールド
指定された要素が複数回生じる場合、[名前] 列には要素名の末尾に括弧 () が表示されます。例えば、前の図の FavoriteColors() 行を参照してください。
[タイプ] 列と [要素] 列には、要素の繰り返し可能な回数が指定されます。この例の場合、要素は 5 回繰り返すことができます。[タイプ] 列の括弧に数字が表示されていない場合、要素は何回でも繰り返すことができます。
繰り返しシーケンス
構造の中でのみ繰り返され、周囲の要素から区別するための要素名を持たない繰り返しシーケンスを XML スキーマで使用できます。 これにより、VDoc プロパティ・パスに sequence(rep) が記述されますが、DOM パスには同等の記述はありません。この場合は、このプロパティ・パスを使用して、シーケンスの繰り返し全体の値 (People(1).sequence(2) など) またはシーケンス内部の値 (People(1).sequence(2).Color.Tint など) を取得できます。このプロパティ・パスを使用すると、シーケンス内部にある要素の値を設定することもできます。
シーケンス全体には値を設定できないことに注意します。 例えば、以下のように指定するとエラーが返され、どの値も変更されません。
SetValueAt("<Color><ColorName>pink</ColorName><Tint>bright</Tint></Color><Value>001</Value>","People(1).sequence(4)")
重複名
XML スキーマに含まれる同じレベルの複数の要素が同じ名前を持ち、かつそれぞれのタイプが異なる場合は、そのレベルで一意の名前にする必要があるため、_2 や _3 (以下同様) が InterSystems IRIS によって付加されます。この処理は、スキーマ依存パスにのみ適用されます。例えば、<Contact> という名前の 2 つの要素を含む <Person> 要素を定義するスキーマについて考えてみましょう。1 つは <Phone> タイプ、もう 1 つは <Assistant> タイプとします。InterSystems IRIS では、<Person> 要素のスキーマが以下のように表示されます。
同様に、このスキーマに含まれる同じレベルの複数の要素が同じ名前を持ち、かつそれぞれが異なるネームスペースに含まれる場合は、そのレベルで一意の名前にする必要があるため、_2 や _3 (以下同様) が InterSystems IRIS によって付加されます。この処理は、スキーマ依存パスにのみ適用されます。
Choice 構造
一部のスキーマには、下の例のように、<choice> 構造が含まれています。
<xsd:choice>
<xsd:element name="OptionA" type="my:OptionType"/>
<xsd:element name="OptionB" type="my:OptionType"/>
<xsd:element name="OptionC" type="my:OptionType"/>
</xsd:choice>
InterSystems IRIS は、この構造を 2 種類のパスとして別々に表現します。以下に例を示します。
スキーマ依存パスの場合は、[名前] に <choice> 構造の一般名が、[タイプ] 列に数値プレースホルダが表示されます。[要素] 列には何も表示されません。
choice をクリックすると、以下のように表示されます。
この場合は、これらのページから、以下のパスを使用して OptionB にアクセスできることがわかります。
パス・タイプ | 例 |
---|---|
スキーマ依存パス (部分) | ...Parent.choice.OptionB |
DOM スタイル・パス (部分) | /.../Parent/OptionB |
参照によって追加されたグループ
スキーマには、ref 属性経由で追加された <group> を含めることができます。以下に例を示します。
<s01:complexType name="Patient">
<s01:sequence>
<s01:element name="Name" type="s01:string" minOccurs="0"/>
<s01:element name="Gender" type="s01:string" minOccurs="0"/>
<s01:element name="BirthDate" type="s01:date" minOccurs="0"/>
<s01:element name="HomeAddress" type="s02:Address" minOccurs="0"/>
<s01:element name="FavoriteColors"
type="s02:ArrayOfFavoriteColorsItemString" minOccurs="0"/>
<s01:element name="Container" type="s02:ContainerType" minOccurs="0"/>
<s01:element name="LatestImmunization" type="s02:Immunization" minOccurs="0"/>
<s01:element ref="s02:Insurance" minOccurs="0"/>
<s01:group ref="s02:BoilerPlate" minOccurs="1" maxOccurs="1"/>
</s01:sequence>
...
<s01:group name="BoilerPlate">
<s01:sequence>
<s01:element name="One" type="s01:string"/>
<s01:element name="Two" type="s01:string"/>
<s01:element name="Three" type="s01:string"/>
</s01:sequence>
</s01:group>
InterSystems IRIS は、この構造を 2 種類のパスとして別々に表現します。以下に例を示します。
スキーマ依存パスの場合は、[名前] にグループの名前が、[タイプ] 列に数値プレースホルダが表示されます。[要素] 列にもグループの名前が表示されます。
BoilerPlate をクリックすると、以下のように表示されます。
この場合は、これらのページから、以下のパスを使用して Two にアクセスできることがわかります。
パス・タイプ | 例 |
---|---|
スキーマ依存パス (部分) | ...Patient.BoilerPlate.Two |
DOM スタイル・パス (部分) | /.../$2:Patient/$2:Two |