2012-03-29 15 views
12

estoy consiguiendo error siguiente cuando agrego < en mi xml,cómo analizar XML con carácter especial en el servidor SQL

Msg 9455, nivel 16, estado 1, línea de análisis 6 XML: línea 4, carácter 14, carácter de nombre calificado ilegal

¿Cómo puedo analizar xml con este tipo de caracteres especiales?

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) 

Respuesta

19

caracteres especiales no válidos & su sustituto en XML

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

Debe asegurarse de que el XML sea válido, por lo que debe asegurarse de que los caracteres especiales estén codificados.

p. Ej.

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

le proporcionarme, cuántos xml carácter vales para sesión no analizaba, y su sustituto –

10

< debe especificarse como &lt; en el XML

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

Actualizar:

Los caracteres que necesidad escapar en valores de nodo son < =>&lt; y & =>&amp;.
En valores de atributo también necesita escapar " =>&quot; si usa " alrededor de los valores de sus atributos.

Este es un XML válido:

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

Pruébalo en una consulta:

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 

Resultado:

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