XML 仮想ドキュメントのスキーマ依存パスの指定
ここでは、XML 仮想ドキュメントのスキーマ依存パスを指定する方法を説明します。
これらのパスを使用して、値にアクセスしたり値を設定したりすることができます。
このトピックの例では、前のトピックで示したスキーマが使用されています。
XML 要素の内容の取得または設定
要素の内容にアクセスするには、以下のスキーマ依存パスのいずれかを使用します。また、これらのパスは、より複雑なスキーマ依存パスを作成する場合にも使用します (これについては、後の項で説明します)。
構文 | 参照先 |
---|---|
element_name | 指定された要素の内容。element_name は、ルート要素の子である必要があります。 |
parent.element_name | 指定された要素の内容。parent は、要素への完全パス (つまり、このテーブルに示す任意の構文) です。この場合、element_name は、parent によって参照される要素の子となります。 |
parent.element_name(n) | 指定された親に含まれる、element_name という名前の n 番目の要素の内容。 |
parent.element_name(-) | 指定された親に含まれる、element_name という名前の最後の要素の内容。 |
以下の 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>
以下のテーブルに、このドキュメントのパスの例をいくつか示します。
パスの例 | 現在のパスの値 |
---|---|
名前 | Georgina Hampton |
FavoriteColors(1) | Red |
FavoriteColors(2) | Green |
FavoriteColors(-) | Green |
Address | 86 Bateson WayFall River |
Address.Street | 86 Bateson Way |
Doctor | Dr. Randolph |
XML 属性の値の取得または設定
属性の値にアクセスするには、以下のスキーマ依存パスのいずれかを使用します。この節の以降の部分では、上記のテーブルで説明したように、element_reference は完全なスキーマ依存パスです。
構文 | 参照先 |
---|---|
element_reference.attribute_name | element_reference によって示される要素の attribute_name 属性の値。 |
下の表に、前のドキュメントのパスの例を示します。
パスの例 | 現在のパスの値 |
---|---|
MRN | 000111222 |
コメントと説明
InterSystems IRIS® では、XML ファイルの読み取り時にコメントが削除されます。したがって、スキーマを記述するときにコメントを使用すべきではありません。コメントを使用する代わりに、ほとんどのスキーマ要素で利用できる description または altdesc 属性を使用できます。
多くの状況では使用できませんが、以下のいずれかのスキーマ依存パスを使用することでコメントにアクセスできます。
構文 | 参照先 |
---|---|
element_reference.# | 指定された要素の最初のコメントのテキスト。 |
element_reference.#(n) | 指定された要素の n 番目のコメントのテキスト。 |
element_reference.#(-) | 最後のコメントのテキスト。 |
InterSystems IRIS では、XML ファイル内の読み取り時にすべてのコメントが削除されます。存在する可能性のあるコメントは、XML ファイルの読み取り以降に追加されたコメントのみです。コメントを追加するには、SetValueAt() を前述の表に示されているパスなどと共に使用します。
スキーマ依存パス設定時の混合コンテンツの使用
要素とテキスト・ノードの両方を含む値へのパスを設定できます。以下に例を示します。
set mixed="SOME TEXT<HOMETOWN>BELMONT</HOMETOWN>"
set status=target.SetValueAt(mixed,"Address")
要素とテキスト・ノードの組み合わせは、混合コンテンツと呼ばれます。
スキーマ依存パスの場合、InterSystems IRIS は、左山括弧 (<) 文字に続いて以下の文字セットのいずれかを含んでいる場合に、値が混合コンテンツであると判断します。
-
スラッシュと右山括弧 (/>)
-
左山括弧とスラッシュ (</)
次のテーブルは、InterSystems IRIS が各種スキーマ依存パスの混合コンテンツを処理する方法を示しています。
パスの参照先 | InterSystems IRIS が混合コンテンツを処理する方法 |
---|---|
要素またはコメント | InterSystems IRIS は、要素またはコメントの現在のコンテンツを特定の混合コンテンツに置き換えます。 |
属性 | サポート対象外 |
DOM スタイル・パスの混合コンテンツの詳細は、"DOM スタイル・パス設定時の混合コンテンツの使用" を参照してください。
スキーマ依存パス設定時の文字のエスケープ
スキーマ依存パスを左山括弧 (<) を含む値に設定したものの、その値が混合コンテンツの条件に適合していない場合、InterSystems IRIS では、その文字が対応する文字エンティティ参照 (<) に置き換えられます。左山括弧を明示的にエスケープする必要はありません。例えば、スキーマ依存パスの値を "sample value < 20%" として指定する場合、パスは "sample value < 20%" に設定されます。
DOM スタイル・パスの設定時に、InterSystems IRIS によって、左山括弧文字が自動的にエスケープされることはありません。
繰り返し要素の特殊なバリエーション
この節では、繰り返し要素を参照するときに適用される仮想プロパティ・パスのバリエーションについて説明します。
繰り返し要素を通した繰り返し
パスで繰り返し要素が参照されている場合は、以下の構文を使用してその要素のすべてのインスタンスを通して繰り返すことができます。
構文 | 参照先 |
---|---|
element_name() | 指定されたコンテキスト内の指定された名前の要素を通して繰り返します。 |
ここで、以下のコードのみを含むデータ変換を使用するとします。
set status=target.SetValueAt("REPLACED COLOR","FavoriteColors()")
if 'status {do $system.Status.DisplayError(status) quit}
このコード行は、前述したドキュメントを次のように変換します。
<?xml version="1.0" ?>
<Patient MRN='000111222' xmlns='http://myapp.com'>
<Name>Georgina Hampton</Name>
<FavoriteColors>
<FavoriteColor>REPLACED COLOR</FavoriteColor>
<FavoriteColor>REPLACED COLOR</FavoriteColor>
</FavoriteColors>
<Address>
<Street>86 Bateson Way</Street>
<City>Fall River</City>
</Address>
<Doctor>
<Name>Dr. Randolph</Name>
</Doctor>
</Patient>
要素のカウント
パスで繰り返し要素が参照されている場合は、以下の構文を使用して要素の数を返すことができます。
構文 | 参照先 |
---|---|
element_name(*) | 指定されたコンテキスト内の指定された名前の要素の数。この構文は、スキーマで element_name が繰り返し要素として定義されている場合にのみ有効です。 |
element_name.* | 指定されたコンテキスト内の指定された名前の要素の数。この構文は、任意の element_name に対して有効です。 |
以下の表に、前述したドキュメント用のパスの例を示します。
パスの例 | 現在のパスの値 |
---|---|
FavoriteColors.* | 2 |
FavoriteColors(*) | 2 |
ターミナルでのスキーマ依存パスのテスト
特に、構文に精通している場合は、仮想ドキュメント・プロパティ・パスをビジネス・プロセスやデータ変換などで使用する前にターミナルでテストできると便利です。スキーマ依存 XML パスに対してこれを行うには、次の手順を実行します。
-
対応する 1 つまたは複数の XML スキーマを InterSystems IRIS にロードします。そのためには、[XML スキーマ構造] ページを使用します。
-
管理ポータルを使用して、テストするドキュメントのルート要素に関する DocType 値を探します。以下に例を示します。
"XML 仮想ドキュメントのパス・ユニットの表示" を参照してください。
-
ターミナルまたはテスト・コード内:
-
適切な XML ドキュメントのテキストを含む文字列を作成します。
-
EnsLib.EDI.XML.DocumentOpens in a new tab の ImportFromString() メソッドを使用してこの文字列から XML 仮想ドキュメントのインスタンスを作成します。
-
このインスタンスの DocType プロパティを設定します。
-
このインスタンスの GetValueAt() および SetValueAt() メソッドを使用します。
-
下のメソッドはステップ 3 を実行します。
ClassMethod TestSchemaPath()
{
set string="<Patient xmlns='http://myapp.com'>"
_"<Name>Jack Brown</Name>"
_"<Address><Street>233 Main St</Street></Address>"
_"</Patient>"
set target=##class(EnsLib.EDI.XML.Document).ImportFromString(string,.status)
if 'status {do $system.Status.DisplayError(status) quit}
//Use the DocType displayed in the Management Portal
set target.DocType="MyApp:Patient"
set pathvalue=target.GetValueAt("Address.Street",,.status)
if 'status {do $system.Status.DisplayError(status) quit}
write pathvalue
}
このメソッドの出力を以下に示します。
SAMPLES>d ##class(Demo.CheckPaths).TestSchemaPath()
233 Main St
GetValueAt() のその他のオプションは、"pFormat 引数" を参照してください。