如何在sql server中解析带有特殊字符的xml

时间:2012-03-29 07:21:49

标签: sql-server-2005 xml-parsing

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

  

Msg 9455,Level 16,State 1,Line 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)

3 个答案:

答案 0 :(得分:19)

无效的特殊字符&amp;它在xml中的替代品

  1. &安培; - &amp;
  2. &LT; - &lt;
  3. &GT; - &gt;
  4. “ -​​ &quot;
  5. ' - &#39;

答案 1 :(得分:10)

<需要在XML

中指定为&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>

<强>更新

需要在节点值中转义的字符为< =&gt; &lt;& =&gt; &amp;
在属性值中,您还需要转义" =&gt; &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
-------------------- --------------------
 < > & ' "            < > & ' "

答案 2 :(得分:4)

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

e.g。

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>'