2

わかりましたので、次のようにしてファイルをメモリにキャッシュしています

byte[] file = System.IO.File.ReadAllBytes("test.xml");

その後、次のようにそのバッファから xml ドキュメントを作成しようとしています。

System.IO.MemoryStream stream = new System.IO.MemoryStream(file);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(stream);
System.Xml.Linq.XDocument xPartDocument = new System.Xml.Linq.XDocument(reader); 

ただし、これは次の例外を除いてドキュメントの作成に失敗します:

A first chance exception of type 'System.ArgumentException' occurred in System.Xml.Linq.dll

Additional information: Non white space characters cannot be added to content.

ただし、「リーダー」は間違っているように見えます。つまり、ローカルでは値として「なし」になっています。

  • リーダー {なし} System.Xml.XmlTextReader

また、「ファイル」バイト配列変数には、ヘッダーのように見えるものが 11 バイトあります (これは単なる txt ファイル ヘッダーだと思いますか?)。

0x0393B148  58 35 59 71  X5Yq 
0x0393B14C  dc 67 01 00  Üg.. 
0x0393B150  ef bb bf 3c  < 
0x0393B154  3f 78 6d 6c  ?xml 
0x0393B158  20 76 65 72   ver

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

6

コメントに記載されているように、最初の 8 バイトは XML ファイルの先頭に属していないように見えます。次の 3 バイトは UTF-8 BOM ですが、これで問題ありません。それらの 8 バイトがどこから来たのか、そしてそれらが常にそこにあると期待すべきかどうかを調べるべきです。

それらが常にそこにあり、そこにあるようにしたい場合、これを修正する最も簡単な方法は、読む前にストリームを移動することです:

MemoryStream stream = new MemoryStream(file);
stream.Position = 8;
XDocument doc = XDocument.Load(stream);

または、最初にすべてのデータをロードせずに:

XDocument doc;
using (Stream input = File.OpenRead("test.xml"))
{
    input.Position = 8;
    doc = XDocument.Load(input);
}
于 2012-07-03T16:39:47.403 に答える
2

みなさん、こんにちは。皆さんの入力に感謝します。私の質問のバイナリダンプは、VSの「ファイル」変数のメモリダンプウィンドウからのダンプです。

@Jon Skeetは実際に質問に答えましたが、偶然にも、バイナリの8バイトヘッダー(または3バイトのUTFヘッダーの場合は11バイト)は完全に問題ありません。

私の問題に対する簡単な答えは、静的なLoad関数を呼び出すのではなく、テキストリーダーからXDocumentを作成していたことです。ドー!

于 2012-07-04T11:15:30.843 に答える