2012-03-29 8 views
12

Tôi nhận được lỗi sau khi tôi thêm < trong xml của tôi,làm thế nào để phân tích cú pháp xml với ký tự đặc biệt trong máy chủ sql

Msg 9455, Level 16, State 1, Line 6 Phân tích XML: dòng 4, nhân vật 14, ký tự tên đủ điều kiện bất hợp pháp

Làm cách nào để phân tích xml với các loại ký tự đặc biệt này?

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) 

Trả lời

19

không hợp lệ ký tự đặc biệt & thay thế của nó trong xml

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

Bạn cần đảm bảo XML hợp lệ, vì vậy bạn cần đảm bảo mọi ký tự đặc biệt được mã hóa.

ví dụ:

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

bạn sẽ cung cấp cho tôi, có bao nhiêu speical nhân vật xml không phân tích, và thier subsitute –

10

< cần phải được quy định như &lt; trong 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> 

Cập nhật:

Các ký tự bạn cần để thoát khỏi các giá trị nút là < =>&lt;& =>&amp;.
Trong các giá trị thuộc tính, bạn cũng cần phải thoát khỏi " =>&quot; nếu bạn sử dụng " xung quanh giá trị thuộc tính của mình.

Đây là một XML hợp lệ:

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

Hãy thử nó trong một truy vấn:

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 

Kết quả:

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