阅读ISO 8859 1编码,使用webclient下载xml流

时间:2012-01-14 17:54:49

标签: c# xml windows-phone-7 encoding webclient

我正在尝试进行基本的webclient调用,以获取WP7的跟踪应用程序的xml流。它确实有效,我确实得到了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和第二个是否有任何区别?在我看来,也许我看不到嵌套在节点中的特殊包机,这可能是问题吗?

    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"); 
    }  

1 个答案:

答案 0 :(得分:4)

根据此MSDN page,Silverlight仅支持这四种编码:

  
      
  • utf-8 UTF8Encoding

  •   
  • utf-16 UnicodeEncoding(little-endian)

  •   
  • utf-16BE UnicodeEncoding(big-endian)

  •   
  • utf-16LE UnicodeEncoding(little-endian)

  •   

根据您链接中的一个答案,用户已设法通过稍微调整字符的上半部分来使其工作。我认为这对你不起作用?

您可以下载原始字节(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);
}