OPENXML() 関数で使われる特殊文字_SQL Anywhere
目的
このドキュメントは、SQL Anywhere OPENXML 関数を使用して、特殊文字が含まれている可能性のある文字列ノード要素を扱っているユーザを対象としています。
概要
SQL Anywhere の OPENXML 関数で使用される XML 解析メカニズムは、いくつかの特殊文字を文字列ノード内のリテラル文字として処理しませんが、代わりに、そのノードを分割します。これらの文字は、"(引用符)、&(アンパサンド)、<(< 文字)と >(> 文字)が含まれます。
例1
SELECT * FROM OPENXML( ‘<products>
<prod_type id=”301″>Tee Shirt</prod_type>
<prod_type id=”401″>Baseball Cap</prod_type>
</products>’,
‘/products/prod_type’ )
WITH ( prod_name LONG VARCHAR ‘text()’, prod_id CHAR(3) ‘@id’)
このクエリは以下の結果セットを提供します。
結果セット1
Prod_name | Prod_id |
---|---|
Tee Shirt | 301 |
Baseball Cap | 401 |
以下の例2に示すように、これらのアンパサンドや引用符などの特殊文字を追加する場合:
例2
SELECT * FROM OPENXML( ‘<products>
<prod_type id=”301″>Tee & Shirt</prod_type>
<prod_type id=”401″>Baseball < Cap</prod_type>
</products>’,
‘/products/prod_type’ )
WITH ( prod_name LONG VARCHAR ‘text()’, prod_id CHAR(3) ‘@id’)
この意図は、結果セットを以下の通りに示させることです:
結果セット2
Prod_name | Prod_id |
---|---|
Tee & Shirt | 301 |
Baseball < Cap | 401 |
問題は、XML が 3 つの子を持つ要素ノードとして解析されることです。
例えば、”301″ ローでは、最初の子はテキスト・ノード “Tee”、2 番目はエンティティ・リファレンス・ノード、3 番目はテキスト・ノード “Shirt” です。
エンティティ・リファレンス・ノードは、1 つのテキスト・ノード ‘”‘ を子として持っています。一方、text() は単に最初のノードを返します。その結果ユーザは、結果セット2 ではなく、最初のノードの終わりで Prod_name がトランケートされている予想外の結果セットを得ます:
結果セット3
Prod_name | Prod_id |
---|---|
Tee | 301 |
Baseball | 401 |
完全な文字列が必要な場合は、サブツリー内の 3 つのテキスト・ノードを連結する必要があります。例2 のように表示される結果セットを実現するには、’text()’ を ‘.’ に置き換える必要があります。
例3
SELECT * FROM OPENXML( ‘<products>
<prod_type id=”301″>Tee & Shirt</prod_type>
<prod_type id=”401″>Baseball < Cap</prod_type>
</products>’,
‘/products/prod_type’ )
WITH ( prod_name LONG VARCHAR ‘.’, prod_id CHAR(3) ‘@id’)
このページは、以下の英語ページの抄訳です。
https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=380667448