2012-03-29 250 views
12

我收到的时候我在XML中添加<以下错误,如何解析XML在SQL Server中的特殊字符

消息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) 

回答

19

无效的特殊字符&它在XML替代

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

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

例如在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>' 
+0

你会为我提供多少调校妥当,性格XML没有解析,并他们是替补 – 2012-03-29 07:29:13

10

<需求&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> 

更新:

字符您需要在节点值逃避是< =>&lt;& =>&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 
-------------------- -------------------- 
< > & ' "   < > & ' "