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