2013-08-28 34 views
6

有誰知道爲什麼這個XML文本在SQL Server 2008中拋出非法名稱字符錯誤?XML解析:第1行,第23個字符,非法名稱字符

'<cs><c a="2" b="CITY & STATE TX" c="CITY & STATE TX"/></cs>' 

異常消息是

Msg 9421, Level 16, State 1, Line 2 
XML parsing: line 1, character 23, illegal name character 

以下是用於解析該XML

DECLARE @CaptionsDescriptions XML = '<cs><c a="2" b="CITY & STATE TX" c="CITY & STATE TX"/></cs>' 

DECLARE @DocHandle int 
DECLARE @CaptionsDescriptionsTable TABLE 
( 
ID INT IDENTITY(1,1), 
languageID INT, 
Caption VARCHAR(50), 
Description VARCHAR(2000) 
) 

EXEC sp_xml_preparedocument @DocHandle OUTPUT,@CaptionsDescriptions  
INSERT INTO @CaptionsDescriptionsTable SELECT a,b,c 
FROM OPENXML(@DocHandle,'cs/c') 
WITH ( 
    a int, -- language id 
    b varchar(50), -- caption 
    c varchar(2000) -- description 
    ) 

-- remove document handler 
EXEC sp_xml_removedocument @DocHandle 

由於該查詢。

+0

這個錯誤告訴你到底哪裏無效字符。另外,爲什麼用C#標記? – leppie

+2

很好的例子來說明爲什麼人們不應該手動形成XML。 – I4V

+0

如果您嘗試將該字符串轉換爲SqlString,該怎麼辦?它會自動將&轉換爲&嗎? – Fandango68

回答

15

&是XML中的保留/特殊字符。它應該是&amp;

我甚至會補充說XML parsing: line 1, character 23, illegal name character很清楚。如果您認爲SQL從1開始計數,那麼第23個字符是&

+0

這不是很清楚,除非你知道在XML語法中'&'只能跟着'#'或一個名字......但是設計錯誤信息對於那些不瞭解規則的人來說總是很困難。 –

4

您需要更改&&amp;

務必閱讀this

0

把你的價值觀CDATA掩護下,像這樣

DECLARE @CaptionsDescriptions XML = '<cs><c a="2" b="<![CDATA[CITY & STATE TX]>" c="CITY & STATE TX"/></cs>' 
相關問題