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

本文关键字:XmlException XML 有效 为什么 | 更新日期: 2023-09-27 17:54:27

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

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

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

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

。net Framework 4和。net Framework 4.5中的AFAIR Xml栈是基于第4版的Xml规范,而不是第5版。当您查看此规范时,您会注意到名称中不允许使用所有有效字符。特别是看看这个,看看字母是什么,你会发现[0x02C2-0x0385]范围内的字符被排除在外。

另外,. net Framework 4和4.5中的Xml堆栈没有移动到第5版的原因是,由于字符范围的变化,相同的Xml文档可能是有效的或无效的(这实际上是您遇到的问题),这取决于处理器而不是文档本身(符合第5版的Xml文档仍然可能有1.0版本)。因此,有效的文档(符合第5版)将被旧的解析器视为无效而拒绝。反之亦然。如果支持第5版的Xml解析器接收到一个文档,该文档的名称中有一个字符以前是无效的,但在第5版中是有效的,那么就不可能判断该文档是否应该被拒绝,因为它应该是第5版之前的文档,并且是畸形的,或者它是第5版文档,应该接受。