Почему T-SQL OpenXML разрушается определенными символами? - PullRequest
0 голосов
/ 17 марта 2009

У меня есть следующий 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 ]

1 голос
/ 17 марта 2009

Значения в XML содержат недопустимые символы. Для XML в общем случае вы должны избегать знака «меньше» и амперсанда, например: & lt; и & 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 некоторые значения не будут работать вообще, особенно этот фигурный апостроф. Я не уверен, какие значения являются недействительными, но я знаю, что это одно из них. Поэтому решение состоит в том, чтобы использовать собственный тип XML в SQL Server 2005.

 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)
0 голосов
/ 17 марта 2009

Если возможно, соберите свой XML-документ в приложении. Фреймворк (.Net, Java, ...?) Сделает правильное кодирование для вас и даст правильный XML.

...