为什么我在有效的XML上获得XmlException?

时间:2013-01-17 17:25:23

标签: c# xml linq-to-xml

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

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

我是否在有效字符上遇到此异常,或者我误解了规范?

1 个答案:

答案 0 :(得分:3)

.NET Framework 4和.NET Framework 4.5中的AFAIR Xml堆栈基于Xml规范的第4版,而不是第5版。当您查看此规范时,您会注意到名称中不允许所有有效字符。请特别注意this并查看Letter是什么,您会看到范围[0x02C2-0x0385]中的字符被排除在外。

此外,.NET Framework 4和4.5中的Xml堆栈尚未移至第5版的原因是,由于字符范围的更改,相同的Xml文档可能有效或无效(这实际上是您遇到的问题)取决于处理器而不是文档本身(符合第5版的Xml文档仍然可以具有版本1.0)。因此,有效的文档(符合第5版)将被旧解析器拒绝为无效。它也没有相反的方式。如果具有第5版能力的Xml解析器收到的文件的名称中的字符在之前无效但在第5版中生效,则无法判断该文档是否应该被拒绝为本应该在5之前的文档。版本和格式不正确或它是第5版文件,应该被接受。