【问题标题】:XML parsing: line 1, character 23, illegal name characterXML 解析:第 1 行,字符 23,非法名称字符
【发布时间】:2013-08-28 06:57:11
【问题描述】:

有人知道为什么这个 XML 文本会在 SQL Server 2008 中引发非法名称字符错误吗?

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

【问题讨论】:

  • 错误告诉你无效字符的确切位置。另外,为什么用 C# 标记?
  • 很好的例子来说明为什么人们不应该手动形成 xml。
  • 如果尝试将字符串转换为 SqlString 会怎样?它会将 & 转换为 &自动?

标签: xml sql-server-2008


【解决方案1】:

&amp;amp; 是 XML 中的保留/特殊字符。应该是&amp;amp;

我还要补充一点,XML parsing: line 1, character 23, illegal name character 很清楚如果你知道 SQL 从 1 开始计数:那么第 23 个字符是&amp;amp;

【讨论】:

  • 除非您知道在 XML 语法中 &amp;amp; 后面只能跟 '#' 或名称,否则这不是很清楚...不懂规矩。
【解决方案2】:

你需要把&改成&amp;amp;

请阅读this

【讨论】:

    【解决方案3】:

    像这样把你的价值观放在 cdata 的封面下

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

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多