C# 将字节[]数组转换为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

我正在尝试将byte[]数组转换为WP中的XDocument。我有以下代码

 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)