Data at the root level is invalidエラーの解決方法について

2877 ワード

Xml Dockment.LoadXML()メソッドを使用すると、Data at the root level is invalidエラーが発生することがあります.
ネット上では、xmlファイルのフォーマットが間違っているためだという話が多いですが、もしXmlファイルのフォーマットをよく調べても問題が見つからないなら、UTF 8符号化フォーマットのBOMヘッダに起因する可能性が高いです.
ここで探している答え:http://www.codeproject.com/Questions/572872/Dataplusatplustheplusrootpluslevelplusisplusinvali
BOMとは
BOM:Byte Order Mark
UTF-8 BOMはUTF-8の署名とも言われていますが、UTF-8のBOMはUFT-8には機能していません.UTF-16をサポートするためにUTF-32を追加したのです.
BOM、BOM署名の意味はエディタに現在のファイルはどのようなコードを採用しているかを教えて、エディタの識別に便利ですが、BOMはエディタでは表示されませんが、出力が発生します.
Byte Order Marks are special characters at the beginning of a Uniode file to indicate whether it is big or litle endian,in other words does the higlow order byte first.The coderst also Telstrol the the dinese 8.and by the way Uniode-16 files are half zroes and Unicoode-32 files are-three-quarters zros.Uniode Edian Markers
Byte-order mark Description
EF BB BF UTF-8
FF FE UTF-16 aka UCS-2,little endian
FE FF UTF-16 aka UCS-2,big endian
00 FF FE UTF-32 aka UCS-4,little endian.
00 FE FF UTF-32 aka UCS-4,big-endian.
UTFのバイト順とBOM
UTF-8はバイトをエンコーディングユニットとしており、バイト順の問題はない.UTF−16は、2バイトを符号化ユニットとし、1つのUTF−16テキストを説明する前に、まず各符号化ユニットのバイト順を明らかにする.例えば、「奎」を受信したUnicodeコードは594 Eで、「乙」のUnicodeコードは4 E 59です.UTF-16バイトストリーム「594 E」を受信したら、これは「奎」ですか?それとも「乙」ですか?
Unicode仕様で推奨されているバイト順の表記方法はBOMです.BOMは「ビルOf Material」のBOM表ではなく、Byte Order Markです.BOMは少し小利口な考えです.
UCSコードには「ZERO WIDHI NO-BREAK SPACE」という文字があります.コードはFEFFです.FFFEはUCSには存在しない文字ですので、実際の転送には現れないはずです.UCS仕様は、バイトフローを送信する前に、まず文字「ゼロWIDHI NO-BREAK SPACE」を転送することを提案しています.
このように受信者がFEFFを受信すると、このバイトフローはBig-Endanであることを示す.FFFEを受信すると、このバイトストリームはLittle-Endanであることが分かります.そのため、「ZERO WIDHI NO-BREAK SPACE」はBOMとも呼ばれています.
UTF−8は、BOMを必要とせずにバイト順序を示すが、符号化方式をBOMで示すことができる.文字「ZERO WIDHI NO-BREAK SPACE」のUTF-8コードはEF BB BFです.したがって、受信者がEF BB BFで始まるバイトストリームを受信すると、UTF-8コードであることが分かります.
Windowsは、BOMを使ってテキストファイルの符号化方式を表記しています.
もともとBOMはファイルの開始にいくつかのバイトをマークしていました.このマークがあれば、いくつかのプロトコルとシステムが識別できます.
 
ソースドキュメント;http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html>
上のはbomだけです.下のBOMに対するこのエラーは普通以下の二つの方法で解決できます.
1.xmlファイルの符号化フォーマットを変更する
notepad++のエディタでxmlファイルを開いて、そのコードフォーマットをBOMのないUTF 8に変えて保存します.
2.コードの中で強く識別してBOMヘッドを取り除く.
//      UTF-8  bom
                    byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };
                    if (cache[0] == bomBuffer[0]
                        && cache[1] == bomBuffer[1]
                        && cache[2] == bomBuffer[2])
                    {

                        xmlStr = System.Text.Encoding.UTF8.GetString(cache, 3, cache.Length - 3);

                    }
                    else 
                    {
                        xmlStr = System.Text.Encoding.UTF8.GetString(cache);
                    }
                    doc.LoadXml(xmlStr);