2013-11-21 83 views
0

我收到的時候我試圖將字符串轉換爲XML MS SQL Server中非常奇怪的錯誤結束非法字符:XML解析,在串

Msg 9420, Level 16, State 1, Line 5
XML parsing: line 1, character 8071, illegal xml character

如果我檢查字符串中的一些文字編輯,我可以看到,它的長度是8070.爲什麼抱怨字符8071,如果它不存在?

這是我如何將字符串轉換爲XML:

CAST(REPLACE(SUBSTRING(
REPLACE(REPLACE(REPLACE(ResponseData,'ä','a'),'ö','o'),'å','a'), 
PATINDEX('%<?xml%',ResponseData), PATINDEX('%sonType>', ResponseData)+6), 
'<?xml version="1.0" encoding="utf-16"?>', 
'<?xml version="1.0" encoding="utf-8"?>')as XML) as ResponseData 

是否有任何引起的問題取代了?

UPD:問題還在於,在ResponseData列中的XML字符串與一些其它數據一起存儲。例如:

Error from service: <Some error description>. Sent request: <?xml version="1.0" encoding="utf-16"?><Contents of the XML> 

所以我需要從該列中獲取該XML字符串,然後將其轉換爲XML。

+0

你爲什麼用'編碼=「UTF-16」替換頭'和'編碼=「utf-8」'?這可能會導致這個問題 - 你可以在沒有做這個替換步驟的情況下嘗試嗎?另外:什麼是你的表格中'ResponseData'列的數據類型? –

+0

@marc_s而沒有更換,我得到'無法切換encoding'錯誤。 「ResponseData」列的類型是'varchar(max)'。 – Azimuth

+0

您需要使用'CONVERT'並在轉換列時執行**兩個步驟:'CAST(CAST(ResponseData as NVARCHAR(max))AS XML)' - 首先需要將'ResponseData'轉換爲* * ** NVARCHAR因爲你定義它是'UTF-16'(= Unicode)的編碼,其次,你需要使用'CAST'再次到該結果'XML'轉換。這樣,你**不需要**從你的內容中刪除該標題 –

回答

0

你可以嘗試原始編碼改變從UTF-16ISO-8859-1,或爲你的角色更精確的編碼:

DECLARE @data varchar(max) = '<?xml version="1.0" encoding="utf-16"?><...>' 
SELECT CAST(REPLACE(@data, 
      '<?xml version="1.0" encoding="utf-16"?>', 
      '<?xml version="1.0" encoding="iso-8859-1"?>') AS XML) ResponseData