0

SQL Server で実行している次の XML がありますが、壊れます。なぜですか?

 declare @xml varchar(max)
 declare @hDoc int

 set @xml = '<transaction>
 <item itemId="1" value="Hello World" />
 <item itemId="2" value="Hello &World" />
 <item itemId="3" value="Hello <World" />
 <item itemId="4" value="Hello >World" />
 <item itemId="5" value="Hello ’World" />
 </transaction>'

 exec sp_xml_preparedocument @hDoc OUTPUT, @xml

 select
        itemId
 ,      value
 from
     openxml(@hDoc, '/transaction/item')
    with (
         itemId int,
         value varchar(max)
     ) item
4

2 に答える 2

1

XML の値に無効な文字が含まれています。一般に XML では、次のように小なり記号とアンパサンドをエスケープする必要があります。と &

 declare @xml varchar(max)
 declare @hDoc int

 set @xml = '<transaction>
 <item itemId="1" value="Hello World" />
 <item itemId="2" value="Hello &amp;World" />
 <item itemId="3" value="Hello &lt;World" />
 <item itemId="4" value="Hello >World" />
 </transaction>'

 exec sp_xml_preparedocument @hDoc OUTPUT, @xml

 select
        itemId
 ,      value
 from
     openxml(@hDoc, '/transaction/item')
    with (
         itemId int,
         value varchar(max)
     ) item

ただし、openxml を使用する場合、特定の値が一般的に機能しません。具体的には、カーリー アポストロフィです。どの値が無効かはわかりませんが、それがその 1 つであることはわかっています。したがって、解決策は、SQL Server 2005 でネイティブの XML 型を使用することです。

 declare @xml xml
 set @xml = '<transaction>
 <item itemId="1" value="Hello World" />
 <item itemId="2" value="Hello &amp;World" />
 <item itemId="3" value="Hello &lt;World" />
 <item itemId="4" value="Hello >World" />
 <item itemId="5" value="Hello ’World" />
 </transaction>'

 select
       item.value('@itemId', 'int')
     , item.value('@value', 'varchar(max)')
 from @xml.nodes('/transaction/item') [transaction](item)
于 2009-03-17T20:43:41.130 に答える
0

可能であれば、アプリケーションで XML ドキュメントを組み立てます。フレームワーク (.Net、Java、...?) が適切なオンコーディングを行い、有効な XML を生成します。

于 2009-03-17T20:55:30.727 に答える