C# 将字节[]数组转换为XDocument
我正在尝试将byte[]数组转换为WP中的XDocument。我有以下代码C# 将字节[]数组转换为XDocument,c#,windows-phone-7,windows-phone-8,linq-to-xml,C#,Windows Phone 7,Windows Phone 8,Linq To Xml,我正在尝试将byte[]数组转换为WP中的XDocument。我有以下代码 private void btnDownload_Click(object sender, RoutedEventArgs e) { svc.DownloadFileCompleted += new EventHandler<DownloadFileCompletedEventArgs>(svc_DownloadFileCompleted); svc.Download
private void btnDownload_Click(object sender, RoutedEventArgs e)
{
svc.DownloadFileCompleted += new EventHandler<DownloadFileCompletedEventArgs>(svc_DownloadFileCompleted);
svc.DownloadFileAsync("XMLFile1.xml");
}
void svc_DownloadFileCompleted(object sender, DownloadFileCompletedEventArgs e)
{
byte[] bytes = e.Result;
//string responseText = Encoding.UTF8.GetString(bytes,0,2048); // ASCII assumed
//XDocument respnseXml = XDocument.Load(responseText);
bytes = NullRemover(bytes);
using (MemoryStream stream = new MemoryStream(bytes))
{
XDocument document = XDocument.Load(stream);
}
}
private byte[] NullRemover(byte[] DataStream)
{
int i;
byte[] temp = new byte[DataStream.Length];
for (i = 0; i < DataStream.Length - 1; i++)
{
if (DataStream[i] == 0x00) break;
temp[i] = DataStream[i];
}
byte[] NullLessDataStream = new byte[i];
for (i = 0; i < NullLessDataStream.Length; i++)
{
NullLessDataStream[i] = temp[i];
}
return NullLessDataStream;
}
private void btnDownload\u单击(对象发送方,路由目标)
{
svc.DownloadFileCompleted+=新事件处理程序(svc_DownloadFileCompleted);
DownloadFileAsync(“XMLFile1.xml”);
}
void svc_DownloadFileCompleted(对象发送方,DownloadFileCompletedEventArgs e)
{
字节[]字节=e.结果;
//string responseText=Encoding.UTF8.GetString(字节,02048);//假定为ASCII
//XDocument responsexml=XDocument.Load(responseText);
字节=零清除器(字节);
使用(内存流=新内存流(字节))
{
XDocument document=XDocument.Load(流);
}
}
专用字节[]NullRemover(字节[]数据流)
{
int i;
byte[]temp=新字节[DataStream.Length];
对于(i=0;i
我已经创建了一个web服务来下载文件。我的代码运行良好。它将字节[]转换为XDocument对象。我不确定这种方式是否正确。为什么需要使用MemoryStream?将字节[]转换为XDocument是否正确?或者有没有其他方法可以转换 考虑直接通过其Uri加载XDocument的可能性
XDocument.Load(“localFile.xml”)
或
XDocument.Load(“http://example.com/remote.xml“”
如果异步下载对您来说是强制性的-这绝对没有问题,只需使用ThreadPool作为任务在专用线程中组织下载:
static void Main(string[] args)
{
XDocument document = null;
Task.Factory
.StartNew(() => document = XDocument.Load("https://dl.dropboxusercontent.com/u/1323651/xml_test.txt"))
.ContinueWith(t => Console.WriteLine(document.ToString()))
.Wait();
}
为什么您需要
NullRemover
?这意味着还有一些东西被破坏了——现在还不清楚您是否真的很高兴只获取第一个0字节的数据。但是使用MemoryStream
是可以的。它给出了一个错误“.”,十六进制值0x00,是一个无效字符。第51行,位置12。“这就是我使用它的原因,但这只是表明在传输数据时出现了问题——或者是,或者XML在服务器上被破坏。无论哪种方式,解决方案都是确保从正确的数据开始,而不是在运行时删除坏字节。你不会知道这些数据还有什么问题。这是我必须做的。XML文件位于web服务器上,因此mandatory@Ajay,没问题。我已经用代码示例更新了我的答案,请再看一次。@Ajay,顺便说一下,您的weired NullRemover可以替换为以下表达式:array.TakeWhile(b=>b!=0x00)