我有这个xml文档:
<test />
如果我使用这个C#代码加载它:
var d = new XmlDocument();
d.LoadXml("<test />");
抛出以下异常: XmlException:&#39;&#39;字符,十六进制值0x28CD2,不能包含在名称中。第1行,第6位。
然而,xml spec reads:
NameStartChar :: =&#34;:&#34; | [A-Z] | &#34; _&#34; | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xFFFF]
NameChar :: = NameStartChar | &#34; - &#34; | &#34;&#34; | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
&#34;&#34; (其代码点为U + 28CD2)明显属于[#x10000-#xFFFF]区间。这是.Net解析器的不合格还是我遗漏了什么?
谢谢!
答案 0 :(得分:2)
使用当前的.Net版本可能会运气不佳。
根据documentation for XmlReader
in .Net 4.5:
XmlReader在adocument或stream中提供对XML数据的只进,只读访问。此类符合W3C Extensible Markup Language (XML) 1.0 (fourth edition)和Namespaces in XML 1.0 (third edition)建议。
在此版本中,yours之外的basic multilingual plane字符似乎对元素名称无效。您的字符为0xD863 0xDCD2
,格式为UTF-16,而Fouth edition requirements for valid element name characters中没有有效的名称字符,其代码点值大于#xD7A3
。这小于#xD800
的{{1}} - 并且比你的角色#x28CD2
小得多。
从surrogate pair encodings begin
确认XML 1.0(第五版)和XML 1.1支持在元素名称,属性,注释,字符数据和处理指令中直接使用几乎任何Unicode字符(除了具有特殊功能的那些) XML本身的符号含义,例如小于号,&#34;&lt;&#34;)。以下是格式良好的XML文档,包括中文,亚美尼亚和西里尔字符:
<?xml version="1.0" encoding="UTF-8"?> <俄语 լեզու="ռուսերեն">данные</俄语>
实际抛出异常的框架类是XmlTextReaderImpl
。通过wikipedia article on XML查看#if XML10_FIFTH_EDITION
,reference source的几种用法:
unsafe {
#if SILVERLIGHT
if ( xmlCharType.IsStartNCNameSingleChar( chars[pos] ) ) {
#else // Optimization due to the lack of inlining when a method uses byte*
if ( ( xmlCharType.charProperties[chars[pos]] & XmlCharType.fNCStartNameSC ) != 0 ) {
#endif
pos++;
}
#if XML10_FIFTH_EDITION
else if ( pos + 1 < ps.charsUsed && xmlCharType.IsNCNameSurrogateChar(chars[pos + 1], chars[pos])) {
pos += 2;
}
#endif
else {
goto ParseQNameSlow;
}
}
如果定义了XML10_FIFTH_EDITION
,则支持包含代理项对的XML元素名称。也许微软计划在以后的版本中启用它?