【发布时间】:2025-12-04 23:55:01
【问题描述】:
这不是关于如何克服“XML 解析:...非法 xml 字符” 错误的问题,而是关于为什么会发生这种错误的问题? 我知道有修复(1、2、3),但在选择最佳解决方案之前需要知道问题出在哪里(是什么导致了引擎盖下的错误?)。
我们正在使用 C# 调用基于 Java 的 Web 服务。根据返回的强类型数据,我们正在创建一个将传递给 SQL Server 的 XML 文件。网络服务数据使用 UTF-8 编码,所以在 C# 中我们创建文件,并在适当的地方指定 UTF-8:
var encodingType = Encoding.UTF8;
// logic removed...
var xdoc = new XDocument();
xdoc.Declaration = new XDeclaration("1.0", encodingType.WebName, "yes");
// logic removed...
System.IO.File.WriteAllText(xmlFullPath, xdoc.Declaration.ToString() + xdoc.Document.ToString(), encodingType);
这会在磁盘上创建一个 XML 文件,其中包含以下(缩写)数据:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<records>
<r RecordName="Option - Foo" />
<r RecordName="Option – Bar" />
</records>
请注意,在第二条记录中,- 与 – 不同。我相信第二个实例是en-dash。
如果我在 Firefox/IE/VS2015 中打开该 XML 文件。它打开没有错误。 W3C XML validator 也可以正常工作。但是,SSMS 2012 不喜欢它:
declare @xml XML = '<?xml version="1.0" encoding="utf-8" standalone="yes"?><records>
<r RecordName="Option - Foo" />
<r RecordName="Option – Bar" />
</records>';
XML 解析:第 3 行,字符 25,非法 xml 字符
那么为什么 en-dash 会导致错误呢?从我的研究看来,
...只有少数需要转义的实体:,\,' 和 & 在 HTML 和 XML。 Source
...其中的破折号不是一个。编码版本(将– 替换为&#8211;)工作正常。
更新
根据输入,人们表示 en-dash 不被识别为 UTF-8,但它在此处列出 http://www.fileformat.info/info/unicode/char/2013/index.htm 那么,作为一个完全合法的字符,为什么 SSMS 在作为 XML 传递时不会读取它(使用 UTF-8 或 UTF-16)?
【问题讨论】:
-
在省略 XML 声明并仅提供
declare @xml XML = '<records> <r RecordName="Option - Foo" /> <r RecordName="Option – Bar" /> </records>';时,您是否得到相同的 SQL 错误? -
省略声明时有效。但是-这种不好的做法不会导致其他问题吗?它不是我所追求的修复,而是原因。
-
或尝试 encoding="utf-16" .NET 可能不是问题。它是 MSSQL。
-
这是为什么.....*.com/questions/3760788/…的背景
标签: c# sql-server xml tsql