XML Unicode标识符/ .Net支持

时间:2016-04-30 17:29:09

标签: c# .net xml unicode

我有这个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解析器的不合格还是我遗漏了什么?

谢谢!

1 个答案:

答案 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_EDITIONreference 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元素名称。也许微软计划在以后的版本中启用它?