3

私は Oracle の XDB、特にそれを使用してデータベース テーブルから XML 出力を生成するのはまったく初めてで、9i (Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production) から 11g (Oracle) に移行するアプリケーションに取り組んでいます。データベース 11g Enterprise Edition リリース 11.2.0.2.0 - 64 ビット プロダクション)。これは、私が抱えている問題を示す小さなテストケースです。

select xmlelement("test", test) from (select 'a' test from dual);

これは機能し、私に与えます:

<test>a</test>

ただし、11g では、「a」を U+0013 などの無効な文字に置き換えると、次のエラーが発生します。

ORA-31061: XDB error: special char to escaped char conversion failed.

9i では、同じことがエラーなしで正常に機能します。

明らかに理想的な答えは、制御文字が XML に変換しようとしている単純な文字データに入るのを防ぐために、何らかの検証を行うことですが、残念ながらそれは私がやっていることの範囲外です。

これは他の誰かが経験したことですか? もしそうなら、XML 生成スクリプトに加えることができる簡単な変更はありますか、それとも他の種類のクレンジングを行う必要がありますか? または、まれに問題が発生した場合に手動で問題を修正します (これは、私のニーズにとって完全に合理的なオプションです)。

4

4 に答える 4

8

常にソースでデータを修正することが最善の解決策ですが、ソースでデータを制御できない場合にもこれが役立つことがわかりました。

select xmlelement("test", test) 
  from (select regexp_replace(unistr('a\0013b'), '[[:cntrl:]]', '') test from dual);

重要なのはregexp_replace(your_field, '[[:cntrl::]]', '')、データから制御文字を削除することです。

于 2013-01-08T21:57:01.527 に答える
4

U + 0013は、XMLの有効なUnicodeコードポイントではありません。たとえば、XMLの有効な文字を参照してください。したがって、11gは正しく例外を発生させます。

SQL> select xmlelement("test", unistr('a\0013b')) from dual;
ERROR:
ORA-31061: XDB error: special char to escaped char conversion failed.

no rows selected

SQL> select xmlelement("test", unistr('a\00aeb')) from dual;

XMLELEMENT("TEST",UNISTR('A\00AEB'))
--------------------------------------------------------------------------------
<test>a®b</test>

SQL> 

なぜこれが9iに合格するのかわかりませんが(私はそれを利用できません)、それはおそらくOracleの実装がより標準に準拠するように進化したか、標準が進化したためです。

修正は正しいです。

于 2011-09-29T11:24:35.197 に答える
1

興味のある人のために、これをフォローアップするだけです。私の知る限り、9i は無効な文字を通過しただけで、無効な XML が生成されました。11g はエラーをスローします。これは、私の場合は面倒ですが、おそらくより正しい動作です。

私が見つけた唯一の合理的な解決策は、コンテンツをソースで修正することでした。

于 2011-09-02T11:11:28.710 に答える
0

改行を保持したい場合は、次のようにしてみてください。

select xmlelement("test", regexp_replace(test, '[^[:print:]|[:space:]]', '#')) from  
    (select '-   <- to keep line break after weird char
-' test from dual ) 
  • ^=> がセットに含まれていないものをすべて置き換えます (印刷[:print:]またはスペース|[:space:]文字の)
于 2020-04-16T07:18:29.137 に答える