OpenXML 関数で使われる特殊文字

 

最新の情報はSCN日本語コミュニティのこちらの記事をご参照ください。

本書は、SQL Anywhere OpenXMLfunction を使用して、特殊文字が含まれている可能性のある文字列ノード要素を扱っているユーザを対象としています。

SQL Anywhere の OPENXML 関数で使用される XML 解析メカニズムは、いくつかの特殊文字を文字列ノード内のリテラル文字として処理しませんが、代わりに、そのノードを分割します。これらの文字には以下のものが含まれます (ただし、これらに限定されるわけではありません)。" (引用符), & (アンパサンド), < (<) and > (>)

これを示すために、マニュアルに記載されている以下の例を使用します。

例1

このクエリは以下の結果セットを提供します。

結果セット1

以下の例 2 に示すように、これらのアンパサンドや引用符などの特殊文字を追加する場合:

例2

問題は、XML が 3 つの子を持つ要素ノードとして解析されることです。たとえば、”301″ ローでは、最初の子はテキスト・ノード “Tee”、2 番目はエンティティ・リファレンス・ノード、3 番目はテキスト・ノード “Shirt” です。エンティティ・リファレンス・ノードは、1 つのテキスト・ノード ‘”‘ を子として持っています。一方、text() は単に最初のノードを返します。その結果ユーザは、結果セット 2 ではなく、最初のノードの終わりで prod_name がトランケートされている予想外の結果セットを得ます。

結果セット3

完全な文字列が必要な場合は、サブツリー内の 3 つのテキスト・ノードを連結する必要があります。例 2 のように表示される結果セットを実現するには、‘text() ‘ を ‘.’ に置き換える必要があります。

例3