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.

然而,'reader' 看起来是错误的,即在本地人中它的值是 'None':

  • 阅读器 {无} 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 文件的开头。接下来的三个字节是 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 字节标头(或 11 字节带有 3 字节 UTF 标头)非常好。

对我的问题的简单回答是,我是从文本阅读器构建 XDocument,而不是在其上调用静态 Load 函数。嗬!

于 2012-07-04T11:15:30.843 回答