2013-07-31 3 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; 
    } 

나는 파일을 다운로드하는 웹 서비스를 만들었다. 내 코드가 잘 작동합니다. 그것은 byte []를 XDocument 객체로 변환합니다. 이 방법이 옳은지 확실하지 않습니다. 왜 MemoryStream을 사용해야합니까? 바이트 []XDocument으로 변환하는 올바른 방법입니까? 아니면 다른 방법으로 변환 할 수 있습니까?

+0

왜 당신은'NullRemover'를 전혀 필요로합니까? 이는 다른 것이 깨 졌음을 의미합니다. 데이터를 처음 0 바이트까지 가져 오는 것이 정말 행복한지 여부는 명확하지 않습니다. 그러나'MemoryStream'의 사용은 괜찮습니다. –

+0

16 진수 값 0x00, "."오류가 발생합니다. 줄 51, 위치 12입니다. " 그래서 내가 이것을 사용하고 있습니다. –

+3

하지만 이는 데이터를 전송할 때 문제가 있음을 나타냅니다. 즉, 서버에서 XML이 손상되었거나 데이터가 전송되지 않습니다. 어느 쪽이든, 해결책은 잘못된 데이터를 제거하는 것이 아니라 올바른 데이터를 시작하도록하는 것입니다. * 그 밖의 * 데이터에 어떤 오류가 있는지 전혀 알 수 없습니다. –

답변

0

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

그것은 나를 위해 필수입니다. XML 파일은 웹 서버에 있으므로 필수 항목입니다. –

+0

@Ajay, 전혀 문제가되지 않습니다. 코드 샘플로 내 대답을 업데이트했습니다. 다시 살펴보십시오. –

+0

@Ajay, 그런데 NullRemover를 다음 표현식으로 바꿀 수 있습니다 : array.TakeWhile (b => b! = 0x00) –

관련 문제