HRESULT:0xC00CE556 - 装载字符串XML [英] HRESULT: 0xC00CE556 - Loading string to XML

查看:577
本文介绍了HRESULT:0xC00CE556 - 装载字符串XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图加载包含从SkyDrive中下载XML字符串。

 的XmlDocument与myXML =新的XmlDocument(); 
myXML.LoadXml(importXMLDocument);

当我把上面的代码中,我得到以下错误:




从HRESULT异常:0xC00CE556




这是我想要的XML从字符串并加载到XML文档转换:



<预类=郎咸平的XML prettyprint-覆盖> < XML版本= 1.0编码=UTF-8>?;
< ArrayOfVehicle的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =htt​​p://www.w3.org/2001/XMLSchema>
<车辆GT;
< VehicleName>&塔霍LT; / VehicleName>
< VehicleYear> 2004年< / VehicleYear>
<里程表> 97742< /里程表>
< LicensePlate>< / LicensePlate>
< OilWeight> 5W-30℃/ OilWeight>
< OilBrand>< / OilBrand>
< OilQuantity> 6≤/ OilQuantity>
< OilFilterModelNumber>< / OilFilterModelNumber>
< AirFilterModelNumber>< / AirFilterModelNumber>
将; TirePressureAll大于0&下; / TirePressureAll>
将; TirePressureFrontRight大于0&下; / TirePressureFrontRight>
将; TirePressureFrontLeft大于0&下; / TirePressureFrontLeft>
将; TirePressureBackRight大于0&下; / TirePressureBackRight>
将; TirePressureBackLeft大于0&下; / TirePressureBackLeft>
< OilChangedOdometer> 97742< / OilChangedOdometer>
< OilChangedDate> 2012-05-04T19:53:53.358-06:00< / OilChangedDate>
< NextOilChangeDate> 2012-08-04T19:53:53.358-06:00< / NextOilChangeDate>
< NextOilChangeOdometer>&100742 LT; / NextOilChangeOdometer>
< TiresRotated>假LT; / TiresRotated>
< AirFilterChanged>假LT; / AirFilterChanged>
< SettingDistance> 3000 LT; / SettingDistance>
将; SettingMonths→3&下; / SettingMonths>
< SettingReminder>真< / SettingReminder>
< SettingLiveTile>真< / SettingLiveTile>
< IsTrial>真< / IsTrial>
将; VehicleId→2&下; / VehicleId>
< /车辆GT;
<车辆GT;
< VehicleName>马自达3< / VehicleName>
< VehicleYear> 2011< / VehicleYear>
<里程表> 21504< /里程表>
< LicensePlate> ABCDEFG< / LicensePlate>
< OilWeight> 0W-20℃/ OilWeight>
< OilBrand>< / OilBrand>
将; OilQuantity大于0&下; / OilQuantity>
< OilFilterModelNumber>< / OilFilterModelNumber>
< AirFilterModelNumber>< / AirFilterModelNumber>
将; TirePressureAll大于0&下; / TirePressureAll>
将; TirePressureFrontRight大于0&下; / TirePressureFrontRight>
将; TirePressureFrontLeft大于0&下; / TirePressureFrontLeft>
将; TirePressureBackRight大于0&下; / TirePressureBackRight>
将; TirePressureBackLeft大于0&下; / TirePressureBackLeft>
< OilChangedOdometer> 21504< / OilChangedOdometer>
< OilChangedDate> 2012-09-14T18:05:02.298-06:00< / OilChangedDate>
< NextOilChangeDate> 2013-02-14T18:05:02.298-07:00< / NextOilChangeDate>
< NextOilChangeOdometer> 26504< / NextOilChangeOdometer>
< TiresRotated>假LT; / TiresRotated>
< AirFilterChanged>假LT; / AirFilterChanged>
< OilChangeCost>及64.75 LT; / OilChangeCost>
< OilChangeNotes>需要新的轮胎 - $ 500 +< / OilChangeNotes>
< SettingDistance> 5000< / SettingDistance>
将; SettingMonths> 5℃/ SettingMonths>
< SettingReminder>真< / SettingReminder>
< SettingLiveTile>真< / SettingLiveTile>
< IsTrial>假LT; / IsTrial>
将; VehicleId→2&下; / VehicleId>
< /车辆GT;
< / ArrayOfVehicle>



更​​新:



这是代码在这里我从下载SkyDrive上的XML文件(使用API​​):
经确认,昨晚,这个过程当文件被从SkyDrive中,一个额外的下载?是被添加。以下是我的全部功能,做下载和loadXML的电话。任何帮助表示赞赏。

 专用异步无效readFileInfo(字符串folderId)
{
LiveOperationResult operationResultFile =
等待client.GetAsync(folderId +/文件);

动态resultFile = operationResultFile.Result;
IDictionary的<字符串对象> FILEDATA =(IDictionary的<字符串对象>)resultFile;
名单,LT;对象>文件=(列表<对象>)FILEDATA [数据];

的foreach(在文件对象的项目)
{
IDictionary的<字符串对象>文件=(IDictionary的<字符串对象>)的项目;

如果(文件[名称]。的ToString()==ocha.txt)
{
LiveDownloadOperationResult DLFile =
等待client.BackgroundDownloadAsync(文件[源]的ToString();


VAR流=等待DLFile.GetRandomAccessStreamAsync();
VAR readStream = stream.GetInputStreamAt(0);


DataReader的读者=新的DataReader(readStream);
UINT文件长度=等待reader.LoadAsync((UINT)stream.Size);


串内容= reader.ReadString(文件长度);


的XmlDocument与myXML =新的XmlDocument();
myXML.LoadXml(content.ToString());


VM.importVehicles(内容);


断点;
}
}
}


解决方案

我能够重现错误,即使读本地文件。究其原因,错误是把DataReader的一些额外的字节内容之前。你没有看到他们在调试器,但把读取的内容时,在记事本+ +例如,你会得到一个额外的问号:

 <?XML版本=1.0编码=UTF-8>?; 

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



我想明确地设置编码DataReader按UTF8但这并没有改变任何东西。似乎是在DataReader的一个bug。 B.T.W ..你会读取来自DataReader的字节时,得到同样的错误,并尝试使用Encoding.UTF8.GetString对其进行转换。即使是方法不识别BOM。



好吧。两种解决方法:



1)使用FileIO.ReadTextAsync:

 字符串内容=等待FileIO.ReadTextAsync(文件); 



2)使用一个StreamReader:

 使用(VAR流=等待file.OpenReadAsync())
{
使用(VAR readStream = stream.AsStreamForRead())
{
使用(StreamReader的StreamReader的=新的StreamReader(readStream))
{
字符串内容= streamReader.ReadToEnd();
XmlDocument的DOC =新的XmlDocument();
doc.LoadXml(内容);
}
}
}



更新:



该方法ReadFileInfo是这样的,以避免BOM问题。需要注意的是AsStreamForRead在System.IO提供一个扩展方法(把使用System.IO;在你的代码中)。

 专用异步任务ReadFileInfo(字符串folderId)
{
LiveOperationResult operationResultFile =
等待client.GetAsync(folderId +/文件);

动态resultFile = operationResultFile.Result;
IDictionary的<字符串对象> FILEDATA =(IDictionary的<字符串对象>)resultFile;
名单,LT;对象>文件=(列表<对象>)FILEDATA [数据];

的foreach(在文件对象的项目)
{
IDictionary的<字符串对象>文件=(IDictionary的<字符串对象>)的项目;

如果(文件[名称]。的ToString()==ocha.txt)
{
LiveDownloadOperationResult DLFile =
等待client.BackgroundDownloadAsync(文件[源]的ToString());使用

使用(VAR readStream = stream.AsStreamForRead())
{
使用(VAR流=等待DLFile.GetRandomAccessStreamAsync())
{
(StreamReader的StreamReader的=新的StreamReader(readStream))
{
字符串内容= streamReader.ReadToEnd();
XmlDocument的DOC =新的XmlDocument();
doc.LoadXml(内容);

VM.importVehicles(内容);

中断;
}
}
}
}
}
}


I'm trying to load a string that contains XML that is downloaded from SkyDrive.

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

When I call the above code I get the following error:

Exception from HRESULT: 0xC00CE556

This is the XML that I'm trying to convert from a string and load to the XML Document:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfVehicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <vehicle>
    <VehicleName>Tahoe</VehicleName>
    <VehicleYear>2004</VehicleYear>
    <Odometer>97742</Odometer>
    <LicensePlate></LicensePlate>
    <OilWeight>5w-30</OilWeight>
    <OilBrand></OilBrand>
    <OilQuantity>6</OilQuantity>
    <OilFilterModelNumber></OilFilterModelNumber>
    <AirFilterModelNumber></AirFilterModelNumber>
    <TirePressureAll>0</TirePressureAll>
    <TirePressureFrontRight>0</TirePressureFrontRight>
    <TirePressureFrontLeft>0</TirePressureFrontLeft>
    <TirePressureBackRight>0</TirePressureBackRight>
    <TirePressureBackLeft>0</TirePressureBackLeft>
    <OilChangedOdometer>97742</OilChangedOdometer>
    <OilChangedDate>2012-05-04T19:53:53.358-06:00</OilChangedDate>
    <NextOilChangeDate>2012-08-04T19:53:53.358-06:00</NextOilChangeDate>
    <NextOilChangeOdometer>100742</NextOilChangeOdometer>
    <TiresRotated>false</TiresRotated>
    <AirFilterChanged>false</AirFilterChanged>
    <SettingDistance>3000</SettingDistance>
    <SettingMonths>3</SettingMonths>
    <SettingReminder>true</SettingReminder>
    <SettingLiveTile>true</SettingLiveTile>
    <IsTrial>true</IsTrial>
    <VehicleId>2</VehicleId>
  </vehicle>
  <vehicle>
    <VehicleName>Mazda3</VehicleName>
    <VehicleYear>2011</VehicleYear>
    <Odometer>21504</Odometer>
    <LicensePlate>abcdefg</LicensePlate>
    <OilWeight>0w-20</OilWeight>
    <OilBrand></OilBrand>
    <OilQuantity>0</OilQuantity>
    <OilFilterModelNumber></OilFilterModelNumber>
    <AirFilterModelNumber></AirFilterModelNumber>
    <TirePressureAll>0</TirePressureAll>
    <TirePressureFrontRight>0</TirePressureFrontRight>
    <TirePressureFrontLeft>0</TirePressureFrontLeft>
    <TirePressureBackRight>0</TirePressureBackRight>
    <TirePressureBackLeft>0</TirePressureBackLeft>
    <OilChangedOdometer>21504</OilChangedOdometer>
    <OilChangedDate>2012-09-14T18:05:02.298-06:00</OilChangedDate>
    <NextOilChangeDate>2013-02-14T18:05:02.298-07:00</NextOilChangeDate>
    <NextOilChangeOdometer>26504</NextOilChangeOdometer>
    <TiresRotated>false</TiresRotated>
    <AirFilterChanged>false</AirFilterChanged>
    <OilChangeCost>64.75</OilChangeCost>
    <OilChangeNotes>need new tires - $500+</OilChangeNotes>
    <SettingDistance>5000</SettingDistance>
    <SettingMonths>5</SettingMonths>
    <SettingReminder>true</SettingReminder>
    <SettingLiveTile>true</SettingLiveTile>
    <IsTrial>false</IsTrial>
    <VehicleId>2</VehicleId>
  </vehicle>
</ArrayOfVehicle>

Update:

This is the code where I download the XML file from SkyDrive (using the API): It was confirmed last night that this process when the file is being downloaded from SKYDrive that an extra "?" is being add. The following is my entire function that does the downloading and the "LoadXml" call. Any help is appreciated.

private async void readFileInfo(string folderId)
{
     LiveOperationResult operationResultFile =
     await client.GetAsync(folderId + "/files");

     dynamic resultFile = operationResultFile.Result;
     IDictionary<string, object> fileData = (IDictionary<string, object>)resultFile;
     List<object> files = (List<object>)fileData["data"];

     foreach (object item in files)
     {
          IDictionary<string, object> file = (IDictionary<string, object>)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;
            }
      }
}

解决方案

I was able to reproduce the error even with reading a local file. The reason for the error is that the DataReader puts some extra Bytes before the content. You don't see them in the debugger, but when putting the read content in Notepad++ for example, you get an extra question mark:

?<?xml version="1.0" encoding="utf-8"?>

As I suspected the extra bytes were the Byte Order Mark (BOM) bytes (0xEF 0xBB 0xBF (239 187 191)).

I tried to set the encoding for the DataReader explicitly to UTF8 but that did not change anything. Seems to be a bug in the DataReader. B.T.W.. You would get the same error when reading the bytes from the DataReader and try to convert them using Encoding.UTF8.GetString. Even that method does not recognize the BOM.

Okay. Two workarounds:

1) Use FileIO.ReadTextAsync:

string content = await FileIO.ReadTextAsync(file);

2) Use a 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);
      }
   }
}

Update:

The method ReadFileInfo would look like this to avoid the BOM problem. Note that AsStreamForRead is an extension method available in System.IO (put using System.IO; in your code).

private async Task ReadFileInfo(string folderId)
{
   LiveOperationResult operationResultFile =
   await client.GetAsync(folderId + "/files");    

   dynamic resultFile = operationResultFile.Result;
   IDictionary<string, object> fileData = (IDictionary<string, object>)resultFile;
   List<object> files = (List<object>)fileData["data"];

   foreach (object item in files)
   {
      IDictionary<string, object> file = (IDictionary<string, object>)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;
               }
            }
         }
      }
   }
}

这篇关于HRESULT:0xC00CE556 - 装载字符串XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆