2013-07-31 48 views
0

我想將字節[]數組轉換爲WP中的XDocument。我有以下代碼將字節[]數組轉換爲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; 
    } 

我已經創建了一個下載文件的Web服務。我的代碼工作正常。它將byte []轉換爲XDocument對象。我不確定這種方式是否正確。爲什麼需要使用MemoryStream?將字節[]轉換爲XDocument是否正確?或者有任何其他方式轉換?

+0

爲什麼你需要'NullRemover'呢?這意味着別的東西已經被破壞 - 而且只是把數據提交到第一個0字節,你是否真的很高興並不清楚。但是使用'MemoryStream'很好。 –

+0

它給出錯誤「'。」,十六進制值0x00,是一個無效字符,第51行,第12位。這就是爲什麼我使用這個 –

+3

但這只是表明傳輸數據時出現了問題 - 或者是服務器上的XML被破壞了。無論哪種方式,解決方案是確保您得到正確的數據,而不是隨便移除壞字節。你不知道數據有哪些*其他*錯誤。 –

回答

0

考慮直接通過它的Uri加載XDocument的可能性。

XDocument.Load("localFile.xml")

XDocument.Load("http://example.com/remote.xml")

如果異步下載是強制性的你 - 這是絕對沒有問題的,只是使用線程池的任務來組織專用線程下載:

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(); 
} 
+0

這對我來說是強制性的。 XML文件在Web服務器上,所以它是強制性的 –

+0

@Ajay,這完全沒有問題。我用代碼示例更新了我的答案,再看一遍。 –

+0

@Ajay,順便說一句,你可以用下面的表達式替換你的NullRemover:array.TakeWhile(b => b!= 0x00) –