代码之家  ›  专栏  ›  技术社区  ›  Tom Ritter

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

  •  0
  • Tom Ritter  · 技术社区  · 16 年前

    我有以下在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
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Tom Ritter    16 年前

    XML中的值包含无效字符。对于XML,通常必须避开小于号和与号,例如:<和&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时,某些值一般不起作用,特别是那个卷曲的撇号。我不确定哪些值无效,但我知道这是其中之一。因此,解决方案是在SQLServer2005中使用本机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)
    
        2
  •  0
  •   cdonner    16 年前

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