【问题标题】:how to parse xml with special character in sql server如何在sql server中解析带有特殊字符的xml
【发布时间】:2012-04-12 19:54:07
【问题描述】:

当我在我的 xml 中添加 < 时出现以下错误,

Msg 9455,级别 16,状态 1,第 6 行 XML 解析:第 4 行,字符 14, 非法限定名字符

我怎样才能用这些特殊字符解析xml?

DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
<Colors>
<Color1>W < hite</Color1>
<Color2>Blue</Color2>
<Color3>Black</Color3>
<Color4 Special="Light">Green</Color4>
<Color5>Red</Color5>
</Colors>
<Fruits>
<Fruits1>Apple</Fruits1>
<Fruits2>Pineapple</Fruits2>
<Fruits3>Grapes</Fruits3>
<Fruits4>Melon</Fruits4>
</Fruits>
</SampleXML>'

SELECT
a.b.value('Colors[1]/Color1[1]','varchar(10)') AS Color1,
a.b.value('Colors[1]/Color2[1]','varchar(10)') AS Color2,
a.b.value('Colors[1]/Color3[1]','varchar(10)') AS Color3,
a.b.value('Colors[1]/Color4[1]/@Special','varchar(10)')+' '+
+a.b.value('Colors[1]/Color4[1]','varchar(10)') AS Color4,
a.b.value('Colors[1]/Color5[1]','varchar(10)') AS Color5,
a.b.value('Fruits[1]/Fruits1[1]','varchar(10)') AS Fruits1,
a.b.value('Fruits[1]/Fruits2[1]','varchar(10)') AS Fruits2,
a.b.value('Fruits[1]/Fruits3[1]','varchar(10)') AS Fruits3,
a.b.value('Fruits[1]/Fruits4[1]','varchar(10)') AS Fruits4
FROM @MyXML.nodes('SampleXML') a(b)

【问题讨论】:

    标签: sql-server-2005 xml-parsing


    【解决方案1】:

    无效的特殊字符及其在 xml 中的替代品

    1. & - &amp;amp;
    2. &lt;
    3. > - &amp;gt;
    4. " - &amp;quot;
    5. ' - &amp;#39;

    【讨论】:

      【解决方案2】:

      &amp;lt;需要在XML中指定为&amp;lt;

      <SampleXML>
      <Colors>
      <Color1>W &lt; hite</Color1>
      <Color2>Blue</Color2>
      <Color3>Black</Color3>
      <Color4 Special="Light">Green</Color4>
      <Color5>Red</Color5>
      </Colors>
      <Fruits>
      <Fruits1>Apple</Fruits1>
      <Fruits2>Pineapple</Fruits2>
      <Fruits3>Grapes</Fruits3>
      <Fruits4>Melon</Fruits4>
      </Fruits>
      </SampleXML>
      

      更新:

      需要在节点值中转义的字符是&amp;lt; => &amp;lt;&amp;amp; => &amp;amp;
      在属性值中,如果您在属性值周围使用",还需要转义" => &amp;quot;

      这是一个有效的 XML:

      <root>
        <item> &lt; > &amp; ' "</item>
        <item att=" &lt; > &amp; ' &quot;" />
      </root>
      

      在查询中尝试:

      declare @xml xml =
      '
      <root>
        <item> &lt; > &amp; '' "</item>
        <item att=" &lt; > &amp; '' &quot;" />
      </root>
      '
      
      select @xml.value('(root/item)[1]', 'varchar(20)') as NodeValue,
             @xml.value('(root/item/@att)[1]', 'varchar(20)') as AttValue
      

      结果:

      NodeValue            AttValue
      -------------------- --------------------
       < > & ' "            < > & ' "
      

      【讨论】:

        【解决方案3】:

        您需要确保 XML 有效,因此您需要确保对任何特殊字符进行编码。

        例如

        DECLARE @MyXML XML
        SET @MyXML = '<SampleXML>
        <Colors>
        <Color1>W &lt; hite</Color1>
        <Color2>Blue</Color2>
        <Color3>Black</Color3>
        <Color4 Special="Light">Green</Color4>
        <Color5>Red</Color5>
        </Colors>
        <Fruits>
        <Fruits1>Apple</Fruits1>
        <Fruits2>Pineapple</Fruits2>
        <Fruits3>Grapes</Fruits3>
        <Fruits4>Melon</Fruits4>
        </Fruits>
        </SampleXML>'
        

        【讨论】:

        • 你能提供我,有多少特殊字符 xml 没有解析,以及他们的替代品
        猜你喜欢
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        相关资源
        最近更新 更多