2016-04-30 13 views
0

私はこのXMLドキュメントがあります。私はこのC#コードを使用して、それをロードする場合XMLのUnicode識別子/ .NETサポート

<test /> 

を:

var d = new XmlDocument(); 
d.LoadXml("<test />"); 

次の例外がスローされます。 なXmlExceptionを ' '文字は16進値0x28CD2で、名前に含めることはできません。行1、位置6

しかし、xml spec reads

NameStartChar :: = ":" | [A-Z] | "_" | [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-#xEFFFF]

NameChar :: = NameStartChar | " - " | "" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

""(コードポイントU + 28CD2)は、[#x10000-#xEFFFF]の区間にはっきりと入ります。これは.Netパーサーの不適合ですか、何か不足していますか?

ありがとうございます!

答えて

2

現在の.Netバージョンを使用すると運が悪い可能性があります。 documentation for XmlReader in .Net 4.5によれば

XMLReaderがadocumentまたはストリーム内のXMLデータへの順方向専用、読み取り専用アクセスを提供します。このクラスは、W3C Extensible Markup Language (XML) 1.0 (fourth edition)およびNamespaces in XML 1.0 (third edition)の推奨事項に準拠しています。

そしてこのエディションでは、basic multilingual planeyoursのような文字が要素名は有効ではありませんことが表示されます。あなたのキャラクターはUTF-16で0xD863 0xDCD2であり、Fouth edition requirements for valid element name charactersからは、コードポイント値が#xD7A3より大きい有効な名前文字はありません。これは#xD800の値よりも小さく、surrogate pair encodings beginです。文字よりもはるかに小さくなります#x28CD2

wikipedia article on XMLから、確認するには、次の

XML 1.0(第5版)とXML 1.1のサポート要素名のほぼすべてのUnicode文字を直接使用する、属性、コメント、文字データ、および処理を命令(小文字の記号「<」など、XML自体に特殊な意味を持つもの以外) 、中国のアルメニア語とキリル文字を含む整形式のXML文書は、次のとおりです。実際にあなたの例外をスロー

<?xml version="1.0" encoding="UTF-8"?> 
<俄语 լեզու="ռուսերեն">данные</俄语> 

フレームワーククラスがXmlTextReaderImplです。reference sourceを見#if XML10_FIFTH_EDITIONfor instanceのいくつかの用途があります

  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要素名がサポートされるだろうと思われます。マイクロソフトでは、これを新しいバージョンで有効にする予定ですか?