9

次の文字列をSQL xmlフィールドに挿入しようとしています

<?xml version="1.0" encoding="UTF-8"?>
<Response> 
    <Ip>x.x.x.x</Ip>
    <CountryCode>CA</CountryCode> 
    <CountryName>Canada</CountryName>
    <RegionCode>QC</RegionCode> 
    <RegionName>Québec</RegionName> 
    <City>Dorval</City> 
    <ZipCode>h9p1j3</ZipCode> 
    <Latitude>45.45000076293945</Latitude> 
    <Longitude>-73.75</Longitude> 
    <MetroCode></MetroCode> 
    <AreaCode></AreaCode> 
</Response>

挿入コードは次のようになります。

INSERT 
    INTO Traffic(... , xmlGeoLocation, ...)
    VALUES (
        ...
        <!--- 
        <cfqueryparam CFSQLType="cf_sql_varchar" value="#xmlGeoLocation#">, 
        --->
        '#xmlGeoLocation#',

        ...
        )

2 つの悪いことが起こります。

  1. ケベックはケベックに変わります

  2. というエラーが表示されます [Macromedia][SQLServer JDBC Driver][SQLServer]XML parsing: line 8, character 16, illegal xml character

アップデート:

着信テスト ストリームは、ほとんどが 1 バイト文字です。

é は 2 バイト文字です。特にC3A9

また、着信 xml ストリームを制御することもできません

4

3 に答える 3

1

w3のこのリンクを見てください。次のことがわかります。

HTML には&eacute;é などの組み込み文字名のリストがありますが、XML にはこれがありません。XML には、5 つの組み込み文字エンティティしかありません。<、> &lt;、 & &gt;、 " &amp;&quot;および&apos;' には、それぞれ、、、、およびです。ドキュメント タイプ定義で独自のエンティティを定義することも、任意の Unicode 文字を使用することもできます (次の項目)。

&#38;HTML には、&などの数字参照もあります。任意の Unicode 文字を参照できますが、数字は 10 進数ですが、Unicode テーブルでは通常、数字は 16 進数です。XML では、16 進数の参照も使用できます&#x26;。たとえば、次のようになります。

&#xE9;これは、é キャラクターに有効かもしれないと私に信じさせます。

また、Microsoft からのこのリンクの情報には、次のように記載されています。

SQLXML 4.0 は、SQL Server で提供される DTD の限定的なサポートに依存しています。SQL Server では、xml データ型のデータで内部 DTD を使用できます。これを使用して、既定値を指定し、エンティティ参照を展開されたコンテンツに置き換えることができます。SQLXML は、XML データを "そのまま" (内部 DTD を含む) サーバーに渡します。サードパーティ ツールを使用して DTD を XML スキーマ (XSD) ドキュメントに変換し、インライン XSD スキーマを含むデータをデータベースにロードできます。

しかし、着信 XML ストリームを制御できない場合、これらすべてが役に立ちません。DTD を追加したり、その文字を対応する 16 進数参照。どちらの場合も、データベースに入る前に XML を変更できる必要があります。

「DTD の追加」ルートをたどりたい人のための簡単な例です。

é 文字のエンティティを宣言する xml ファイルに内部 DTD を追加する方法は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY eacute "&#233;">]>
<root>
  <RegionName>Qu&eacute;bec</RegionName>
</root>

ここに移動してページ「Ctrl+F」で「eacute」を検索すると、他の文字の例を含むリストが表示されます。これをコピーして、独自の内部 DTD に貼り付けることができます。

編集

もちろん、上記のリンクで指定されているすべてのエンティティを追加することも、このファイル<!ENTITY eacute "&#233;"><!ENTITY .. // Next entity>からすべてをコピーすることもできます。データベースに追加するすべての XML ファイルに内部 DTD を追加することが、あまり良い考えではないことは理解しています。ただし、1つのファイルに追加すると問題が解決するかどうか知りたいです。

于 2013-04-14T04:13:02.543 に答える
0

これを変更してみてください:

<RegionName>Québec</RegionName> 

に:

<RegionName><![CDATA[Québec
]]></RegionName> 
于 2013-04-14T03:40:16.347 に答える