Skip to Content

目的

このドキュメントは、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

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply