HRESULT:0xC00CE556 – 将字符串加载到XML

我正在尝试加载包含从SkyDrive下载的XML的字符串。

XmlDocument myXML = new XmlDocument(); myXML.LoadXml(importXMLDocument); 

当我调用上面的代码时,我收到以下错误:

来自HRESULT的exception:0xC00CE556

这是我试图从字符串和加载转换为XML文档的XML:

    Tahoe 2004 97742  5w-30  6   0 0 0 0 0 97742 2012-05-04T19:53:53.358-06:00 2012-08-04T19:53:53.358-06:00 100742 false false 3000 3 true true true 2   Mazda3 2011 21504 abcdefg 0w-20  0   0 0 0 0 0 21504 2012-09-14T18:05:02.298-06:00 2013-02-14T18:05:02.298-07:00 26504 false false 64.75 need new tires - $500+ 5000 5 true true false 2   

更新:

这是我从SkyDrive下载XML文件的代码(使用API​​):昨晚确认这个过程是从SKYDrive下载文件的另一个“?” 正在补充。 以下是我执行下载和“LoadXml”调用的整个函数。 任何帮助表示赞赏。

 private async void readFileInfo(string folderId) { LiveOperationResult operationResultFile = await client.GetAsync(folderId + "/files"); dynamic resultFile = operationResultFile.Result; IDictionary fileData = (IDictionary)resultFile; List files = (List)fileData["data"]; foreach (object item in files) { IDictionary file = (IDictionary)item; if (file["name"].ToString() == "ocha.txt") { LiveDownloadOperationResult DLFile = await client.BackgroundDownloadAsync(file["source"].ToString(); var stream = await DLFile.GetRandomAccessStreamAsync(); var readStream = stream.GetInputStreamAt(0); DataReader reader = new DataReader(readStream); uint fileLength = await reader.LoadAsync((uint)stream.Size); string content = reader.ReadString(fileLength); XmlDocument myXML = new XmlDocument(); myXML.LoadXml(content.ToString()); VM.importVehicles(content); break; } } } 

即使阅读本地文件,我也能够重现错误。 出错的原因是DataReader在内容之前放置了一些额外的字节。 您没有在调试器中看到它们,但是在将读取的内容放入Notepad ++时,您会得到一个额外的问号:

 ? 

我怀疑额外的字节是字节顺序标记(BOM)字节(0xEF 0xBB 0xBF(239 187 191))。

我试图将DataReader的编码显式设置为UTF8,但这并没有改变任何东西。 似乎是DataReader中的一个错误。 BTW。 从DataReader读取字节时会遇到相同的错误,并尝试使用Encoding.UTF8.GetString转换它们。 即使该方法也无法识别BOM。

好的。 两个解决方法:

1)使用FileIO.ReadTextAsync:

 string content = await FileIO.ReadTextAsync(file); 

2)使用StreamReader:

 using (var stream = await file.OpenReadAsync()) { using (var readStream = stream.AsStreamForRead()) { using (StreamReader streamReader = new StreamReader(readStream)) { string content = streamReader.ReadToEnd(); XmlDocument doc = new XmlDocument(); doc.LoadXml(content); } } } 

更新:

ReadFileInfo方法看起来像这样可以避免BOM问题。 请注意,AsStreamForRead是System.IO中可用的扩展方法(使用System.IO;在您的代码中)。

 private async Task ReadFileInfo(string folderId) { LiveOperationResult operationResultFile = await client.GetAsync(folderId + "/files"); dynamic resultFile = operationResultFile.Result; IDictionary fileData = (IDictionary)resultFile; List files = (List)fileData["data"]; foreach (object item in files) { IDictionary file = (IDictionary)item; if (file["name"].ToString() == "ocha.txt") { LiveDownloadOperationResult DLFile = await client.BackgroundDownloadAsync(file["source"].ToString()); using (var stream = await DLFile.GetRandomAccessStreamAsync()) { using (var readStream = stream.AsStreamForRead()) { using (StreamReader streamReader = new StreamReader(readStream)) { string content = streamReader.ReadToEnd(); XmlDocument doc = new XmlDocument(); doc.LoadXml(content); VM.importVehicles(content); break; } } } } } }