为什么T-SQL OpenXML会破坏某些字符?

时间:2009-03-17 20:43:32

标签: xml tsql openxml

我有以下XML,我在SQL Server中运行,它打破了,为什么?

 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

2 个答案:

答案 0 :(得分:1)

XML中的值包含无效字符。对于XML,一般来说,你必须转义少于符号和&符号,如下所示:&amp; lt;和&amp; amp;

 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时,某些值通常不起作用,特别是卷曲撇号。我不确定哪些值无效,但我知道这是其中之一。因此,解决方案是在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)

答案 1 :(得分:0)

如果可能,请在应用程序中组装XML文档。框架(.Net,Java,...?)将为您执行正确的编码,并将生成有效的XML。