为什么在有效的XML上我会遇到XmlException异常?

4
在测试一个接受字符串并将该字符串作为属性添加到XElement(值为当前时间)的方法时,使用XName.Get将提供的字符串转换为XName,并使用XElement.SetAttributeValue(XName name, object value)(我知道的唯一一种添加/更新XElement属性的方式)。
问题是,XName.Get(堆栈跟踪显示来自System.Xml.XmlConvert.VerifyNCName)在某些情况下会抛出XmlException,声称某些字符不允许。一个例子是0x02FF(˱)。我原本不希望这个字符被允许,但是XML规范似乎表明0x00F8至0x02FF的整个范围都是有效的。
我是否在有效字符上遇到了此异常,还是我对规范有误解?

Xml解析器实际上符合W3C规范,因此它会抛出异常。请参阅下面的答案以了解更多详细信息。 - Pawel
1
@ryan请列举其他不符合规范的情况。 - John Saunders
1个回答

3
据我所知,.NET Framework 4和.NET Framework 4.5中的Xml堆栈基于第四版Xml规范而非第五版。当您查看此规范时,您会注意到并非所有有效字符都允许在名称中使用。特别是要查看,并查看Letter是什么,您会发现范围[0x02C2-0x0385]的字符被排除在外。
此外,.NET Framework 4和4.5中的Xml堆栈之所以没有转移到第五版,是因为由于字符范围的更改,同一Xml文档可能是有效的或无效的(这实际上就是您遇到的问题),这取决于处理器而不是文档本身(符合第五版的Xml文档仍可以具有版本1.0)。因此,旧解析器将拒绝符合第五版的有效文档。反过来也不行。如果第五版能力的Xml解析器收到一个名称中包含先前无效但在第五版中变为有效的字符的文档,则无法判断该文档应该被拒绝为预第五版的格式错误文档,还是一个第五版文档并应接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接