为什么破折号(–)会触发非法的XML字符错误(C#/ SSMS)?

邪恶博士

这不是关于如何克服“ XML解析:...非法xml字符”错误的问题,而是有关为什么会发生的问题?我知道有修复(123),但需要知道问题出在哪里,从选择最佳的解决方案之前出现(是什么原因导致引擎盖下的错误?)。

我们正在使用C#调用基于Java的Web服务。根据返回的强类型数据,我们正在创建一个XML文件,该文件将传递给SQL Server。Web服务数据是使用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>

请注意,第二条记录-中的不同于我相信第二个例子是破折号

如果我在Firefox / IE / VS2015中打开该XML文件。它打开没有错误。W3C XML验证程序也能正常工作。但是,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字符

那么,为什么破折号会导致错误?根据我的研究,

...只有少数需要转义的实体:HTML和XML中的<,>,\,'和&。资源

...其中一个不是破折号。编码的版本(替换&#8211;)工作正常。

更新

根据输入,人状态短破折号不会被识别为UTF-8,但但它是列在这里http://www.fileformat.info/info/unicode/char/2013/index.htm所以,一个完全合法的字符,为什么SSMS以XML形式(使用UTF-8或UTF-16)传递时不读取它?

亚历克斯·K

您可以修改XML编码声明吗?如果是这样;

declare @xml XML = N'<?xml version="1.0" encoding="utf-16" standalone="yes"?><records>
  <r RecordName="Option - Foo" />
  <r RecordName="Option – Bar" />
</records>';

select @xml

(No column name)
<records><r RecordName="Option - Foo" /><r RecordName="Option – Bar" /></records>

投机编辑

这两个都失败,并带有非法的xml字符

set @xml = '<?xml version="1.0" encoding="utf-8"?><x> – </x>'
set @xml = '<?xml version="1.0" encoding="utf-16"?><x> – </x>'

因为它们将非unicodevarchar传递给XML解析器;字符串包含Unicode,因此必须这样处理,即nvarchar(utf-16)(否则,包含的3个字节将被误解为多个字符,并且一个或多个不在XML可接受的范围内)

这确实将nvarchar字符串传递给解析器,但是由于无法切换编码而失败

set @xml = N'<?xml version="1.0" encoding="utf-8"?><x> – </x>'

这是因为nvarchar(utf-16)字符串传递到XML解析器,但XML文档声明了其utf-8,并且在两种编码中不等效

这一切正常,因为它是utf-16

set @xml = N'<?xml version="1.0" encoding="utf-16"?><x> – </x>'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在SSMS中禁用了通过登录将用户类型更改为SQL用户?

SSMS 2012:DATETIME转换到Excel序列号

为什么打开SSMS会影响控制台应用程序

为什么SSMS会更改我的存储过程(重新格式化,将exec更改为EXECUTE等)

在SSMS中,登录名右侧显示的数字是什么?

SSMS批量插入=错误+这是哪一行?

为什么没有使用ssms将数据导入Azure数据库的选项?

SQL查询可在SSMS中使用,但不能在C#中使用:SELECT拒绝

为什么Microsoft SSMS语法突出显示“配置”一词?

SSMS ::从OSM导入XML文件并解析节点

C#.NET Core EF或ADO.NET查询需要几分钟,而SSMS只需30秒,为什么?

SQL超链接-SSMS出现多个错误

为什么SSMS中的“查询”窗格无法完全识别我的表?

为什么SSMS将两个t视为一个字符

在SSMS中正常运行时,为什么在c#中调用存储过程会给出InvalidOperationException?

SSMS对DateTimeOffset(7)显示什么?

为什么在SSMS结果列表中看不到全名?

为业务数据的高级用户安装SSMS?为什么不?

SSMS 2016 16.3(13.0.15700.28)Visual Studio 2015 Shell错误

用SSMS远程运行SSIS包失败,为什么?

为什么SSMS中缺少localdb表?

如何通过 ssms 或 c# 在 SQL Server 2016 数据库中保存 Excel 文件?

在 SSMS 中打印出框绘图字符(extended-ascii)

如何从 SSMS 获取我的 JSON?(解析 EntityName 时发生错误)

查询在 pyodbc 中返回错误但在 SSMS 中没有

在 SSMS 中使用子查询进行更新时收到错误

如何在 SSMS 中成功运行递归触发器

查询在 SSMS 中有效,但在 C# 中无效?

我们可以连接并替换 SQL Server (SSMS) 中的字符串值吗?