2016-03-04 55 views
0

我得到了一種特殊的XML格式。使用xquery後我得到了奇怪的結果。結果不是一個XML字符串。如何解析這種XML格式?如何使用Xquery來解析<![CDATA [<DATA>;收到奇怪的結果

declare @xml xml 

set @xml='<Data> 
<![CDATA[ <DATA> 
<NVPAIRS> 
<PAIR><NAME>status</NAME><VALUE>100</VALUE></PAIR> 
<PAIR><NAME>date</NAME><VALUE>20001224</VALUE></PAIR> 
<PAIR><NAME>name</NAME><VALUE>Tom</VALUE></PAIR> 

</NVPAIRS> 
</DATA> 
]]> 
</Data> 
' 



select x.query('.') 
from @xml.nodes('//Data') as T(X) 

結果我得到:

<Data> 
&lt;DATA&gt; 
&lt;NVPAIRS&gt; 
&lt;PAIR&gt;&lt;NAME&gt;status&lt;/NAME&gt;&lt;VALUE&gt;a&lt;/VALUE&gt;&lt;/ PAIR&gt; 
&lt;PAIR&gt;&lt;NAME&gt;date&lt;/NAME&gt;&lt;VALUE&gt;20001224&lt;/VALUE&gt; &lt;/PAIR&gt; 
&lt;PAIR&gt;&lt;NAME&gt;&lt;/NAME&gt;&lt;VALUE&gt;12%3A30&lt;/VALUE&gt;&lt;/ PAIR&gt; 

&lt;/NVPAIRS&gt; 
&lt;/DATA&gt; 

</Data> 
+3

這是預期的結果 - CDATA標記中的內容不是XML內容,而是文本,因此所有尖括號都被引用。你必須提取文本內容並再次解析它。更好的選擇是解釋這個破碎的XML的作者,他最好發佈適當的XML。 –

+0

如何提取文本內容並使用Xquery解析它? – Mike

回答

2

正如已經提到的,你必須去除從一開始就和你的字符串的結尾非XML,然後才能開始解析。以下是您如何使用您提供的樣本來做到這一點的一個例子。您可能需要根據您的實際XML數據進行相應的調整。

DECLARE @String VARCHAR(MAX) 
DECLARE @XML XML 

SET @String='<Data> 
<![CDATA[ <DATA> 
<NVPAIRS> 
<PAIR><NAME>status</NAME><VALUE>100</VALUE></PAIR> 
<PAIR><NAME>date</NAME><VALUE>20001224</VALUE></PAIR> 
<PAIR><NAME>name</NAME><VALUE>Tom</VALUE></PAIR> 
</NVPAIRS> 
</DATA> 
]]> 
</Data> 
' 

SET @XML = LEFT(RIGHT(@String, LEN(@String) - 17), CHARINDEX(']]>', RIGHT(@String, LEN(@String) - 17)) - 1) 

SELECT @XML.query('/DATA') 

您會注意到您現在有一個可用於查詢的有效XML對象。