Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member186998
Contributor


目的

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