2012-01-14 47 views
4

我正在嘗試進行基本的webclient調用,以便爲WP7的帖子跟蹤應用程序獲取xml流。它工作,我得到的XML,但問題是,因爲我住在瑞典我們有特殊字符作爲åää等等,對於這些人物,我只收到一個帶有問號的盒子。閱讀ISO 8859 1編碼,使用webclient下載xml流

的XML文件,我想看起來像這樣:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> 
<pactrack version="2.0" date="Sat Jan 14 18:29:26 CET 2012" size="2125" lang="SE"> 
    <header> 
     <noofparcelentries>1</noofparcelentries> 

... 

所以編碼是ISO-8859-1,我想這是我的問題。一直試圖在這裏在論壇上的解決方案讀取和一些說,雖然有些不是格式支持: Reading iso-8859-1 rss feed C# WP7

我一直在嘗試不同的充編碼添加到客戶端,但似乎沒有任何幫助,我的XML是失蹤特殊符號總是。然而,有一個奇怪的行爲,有點讓我感到厭煩,如果我添加一個錯誤的跟蹤號碼,而不是數字放入特殊字符,我可以突然讀取一些特殊字符,我從服務器獲得的XML是一個錯誤消息,其中包含跟蹤號碼見下文,但xml的定義是一樣的。

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<pactrack version="2.0" date="Sat Jan 14 18:34:43 CET 2012" size="389" lang="SE" > 
<header> 
<noofparcelentries>1</noofparcelentries> 
<noofuniqueparcels>1</noofuniqueparcels> 
</header> 
<body> 
<parcel id="8538öööåå54248SE"> //I can read this road of xml suddenly 
    <customerref></customerref> 
    <internalstatus>0</internalstatus> 

人有什麼想法?我是一個初學者,完全失去了這個問題,所以任何幫助將不勝感激!第一個xml和第二個xml是否有區別?在我看來,也許我不能看到嵌套在節點中的特殊章程,這可能是問題嗎?

WebClient client = new WebClient(); 

    public MainPage() 
    { 
     InitializeComponent(); 
     client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
     client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
    } 

    void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     if (e.UserState as string == "mobiforge") 
     { 
      txtStatus.Text = e.BytesReceived.ToString() + "bytes received."; 
     } 
    } 

    public void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error == null && !e.Cancelled) 
     { 
      MessageBox.Show(e.Result); 
     } 
    } 

    private void btnDownload_Click(object sender, RoutedEventArgs e) 
    {   
     client.DownloadStringAsync(new Uri("http://server.logistik.posten.se/servlet/PacTrack?lang=SE&kolliid=85380954248SE"), "posten"); 
    } 

回答

4

根據該MSDN page,只有這四個編碼被支撐在Silverlight:

  • UTF-8 UTF8Encoding

  • UTF-16 UnicodeEncoding(小端)

  • utf-16BE UnicodeEncoding(big-endian)

  • UTF-16LE UnicodeEncoding(小端)

根據您的鏈接的答案之一,用戶已設法得到它有輕微的調整工作,上半的人物。我認爲這不適合你?

而不是DownloadStringAsync,您可以下載原始字節(OpenReadAsync)並在原始字節上執行您自己的編碼。 This program可能會幫助您開始這方面的工作。

編輯 - 在箱底有註釋的MSDN網頁指出ISO-8859-1支持。當您嘗試此操作時會發生什麼:

client.OpenReadAsync(new Uri("http://server.logistik.posten.se/servlet/PacTrack?lang=SE&kolliid=85380954248SE"), "posten"); 

然後,在您的回調中,使用編碼器讀取數據。

var enc = Encoding.GetEncoding("iso-8859-1"); 
using (var reader = new StreamReader(e.Result, enc)) 
{ 
    var result = reader.ReadToEnd(); 
    Debug.WriteLine(result); 
} 
+0

是的,現在支持Latin-1。它不是最初(我曾經有一個自定義的編碼類)。我認爲這是beta SDK,不支持它。 – 2012-01-14 19:00:01

+0

您好,非常感謝您的幫助,試過這個,但是當我打電話給client.OpenReadAsync它似乎沒有得到任何結果,並給client_DownloadProgressChanged什麼都沒有?任何建議爲什麼?克勞斯,因爲我猜你是來自北歐國家,你有沒有經歷過這個?我仍然對xml感到困惑,因爲我收到爲什麼當我收到錯誤消息時我實際上可以讀取特殊字符... – Krst 2012-01-14 20:06:22

+0

有可能是服務器沒有發送'content-length'屬性。您可以使用Fiddler來監控流量,以查看請求/響應的內容。此外,而不是'DownloadProgressChanged',處理'OpenReadCompleted'事件,看看流是否返回。 – keyboardP 2012-01-14 20:11:51