创建Linq XML文档时,“非空白字符无法添加到内容”

时间:2012-07-03 16:29:21

标签: c# xml linq

好的,我这样做是通过

来缓存内存中的文件
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

任何帮助都非常感激。

由于

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

大家好,感谢大家的意见,我的问题中的二进制转储只是从'file'变量的VS内存转储窗口转储。

@Jon Skeet你实际上回答了这个问题,但事件是二进制8字节标题(或11字节与3字节UTF标题)完全没问题。

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