我有以下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
答案 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 &World" />
<item itemId="3" value="Hello <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 &World" />
<item itemId="3" value="Hello <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。