4

在测试接受字符串并将该字符串作为属性添加到 XElement(以当前时间作为值)的方法的过程中。要使用XElement.SetAttributeValue(XName name, object value)(我知道添加/更新 XElement 的属性的唯一方法),我使用XName.Get将提供的字符串转换为 XName。

我遇到的问题是XName.Get(堆栈跟踪显示它来自System.Xml.XmlConvert.VerifyNCName)在某些情况下抛出 XmlException,声称某些字符是不允许的。一个例子是 0x02FF (˱)。我没想到这个字符是允许的,但XML 规范似乎说 0x00F8 到 0x02FF 的整个范围都是有效的。

我是在有效字符上得到这个例外,还是我误解了规范?

4

1 回答 1

3

.NET Framework 4 和 .NET Framework 4.5 中的 AFAIR Xml 堆栈基于 Xml 规范的第 4 版而不是第 5 版。当您查看此规范时,您会注意到并非所有有效字符都可以在名称中使用。尤其是看看这个,看看什么,你会发现 [0x02C2-0x0385] 范围内的字符被排除在外。

此外,.NET Framework 4 和 4.5 中的 Xml 堆栈未移至第 5 版的原因是,由于字符范围的变化,相同的 Xml 文档可能有效或无效(这实际上是您遇到的问题),具体取决于处理器而不是文档本身(符合第 5 版的 Xml 文档仍然可以有 1.0 版)。所以有效的文档(符合第 5 版)将被旧的解析器视为无效而拒绝。它也没有反过来工作。如果支持第 5 版的 Xml 解析器收到一个文件,其名称中的字符在以前无效但在第 5 版中有效,则无法判断该文件是否应该被拒绝为应该是第 5 版之前的文件版本并且格式错误,或者它是第 5 版文件,应该被接受。

于 2013-01-18T05:29:10.150 回答