我正在尝试加载包含从SkyDrive下载的XML的字符串。
XmlDocument myXML = new XmlDocument();
myXML.LoadXml(importXMLDocument);
当我调用上面的代码时,我收到以下错误:
HRESULT的异常:0xC00CE556
这是我正在尝试从字符串和加载转换为XML文档的XML:
<?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>
更新
这是我从SkyDrive下载XML文件的代码(使用API): 昨晚确认这个过程是从SKYDrive下载文件的另一个“?”正在补充。以下是我执行下载和“LoadXml”调用的整个函数。任何帮助表示赞赏。
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;
}
}
}
答案 0 :(得分:3)
即使阅读本地文件,我也能够重现错误。出错的原因是DataReader在内容之前放置了一些额外的字节。您没有在调试器中看到它们,但是当将读取的内容放在Notepad ++中时,您会得到一个额外的问号:
?<?xml version="1.0" encoding="utf-8"?>
我怀疑额外的字节是字节顺序标记(BOM)字节(0xEF 0xBB 0xBF(239 187 191))。
我尝试将DataReader的编码显式设置为UTF8,但这并未改变任何内容。似乎是DataReader中的一个错误。 B.T.W ..从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<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;
}
}
}
}
}
}