Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Không đọc được XML từ trang mp3.zing.vn

  1. #1
    Ngày gia nhập
    05 2011
    Bài viết
    7

    Mặc định Không đọc được XML từ trang mp3.zing.vn

    Chào các bạn! Mình đang viết phần mềm tải một playlist trong trang mp3.zing.vn nhưng đang gặp rắc rối đoạn get XML chứa thông tin Playlist.
    Mình có 1 link list nhạc:
    http://mp3.zing.vn/album/Bang-Xep-Ha...6OW.html?st=21
    mò mẩm trong HTML thì tìm được link chứa XML:
    http://mp3.zing.vn/xml/album-xml/kmJ...NczQnyZFcybGkH
    Và rắc rối là dán link vào trình duyệt để xem hoặc dùng IDM để tải file về thì vẫn đọc được bình thường nhưng viết code để tải về lại bị lỗi. Mình đã tìm cách chuyển qua utf-8 rồi mà vẫn không được. Dùng luôn HttpWebRequest cũng không được.
    Xem bằng trình duyệt vẫn bình thường



    Khi get về thì nó như thế này



    CODE
    Code:
    protected string GetXmlString()
            {
                string sContents = string.Empty;
                System.Net.WebClient wc = new System.Net.WebClient();
                byte[] response = wc.DownloadData("http://mp3.zing.vn/xml/album-xml/LHJnTLGadJNJzWmtLbJTDGLm");
                sContents = System.Text.Encoding.UTF8.GetString(response);
                return sContents;
            }
    Mong các cao thủ chỉ bảo thêm.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Vì nội dung được nén bằng gzip nên bạn phải giải mã gzip trước.

    GZipStream
    Ctrl + Space is your friend!
    Exception is your teacher!

    Java: http://docs.oracle.com/javase/7/docs/api/overview-summary.html
    .NET: http://msdn.microsoft.com/en-us/library/gg145045(v=vs.110).aspx

  3. #3
    Ngày gia nhập
    05 2011
    Bài viết
    7

    Cám ơn bác rất nhiều. Em đã làm được! Code cho bạn nào gặp vấn đề tương tự như mình.
    Code:
    protected string GetXmlString()
            {
                string sContents = string.Empty;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://mp3.zing.vn/xml/album-xml/LHJnTLnsdcsJlpnyLvcyvHLm");
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
                GZipStream gzstream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
                System.IO.StreamReader reader = new StreamReader(gzstream);
                sContents = reader.ReadToEnd();
                return sContents;
            }

  4. #4
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Tuy thế một số trang không được nén bằng GZIP, nên nếu giải nén thì lại gây ra lỗi làm nội dung có thể bị thay đổi.

    Bạn nên kiểm tra xem trang đó có nén GZIP hay không. bằng thong tin từ Đầu trang phản hồi (Respone header)
    Visual C# Code:
    1. if (respone.GetResponseHeader("Content-Encoding").Contains("gzip")) { // Nếu có "gzip" thì được nén Gzip, ngược lại thì không.
    2.     // Giải nén.
    3. } else {
    4.     // Lấy bình thường không nén
    5. }
    Ctrl + Space is your friend!
    Exception is your teacher!

    Java: http://docs.oracle.com/javase/7/docs/api/overview-summary.html
    .NET: http://msdn.microsoft.com/en-us/library/gg145045(v=vs.110).aspx

  5. #5
    Ngày gia nhập
    05 2012
    Nơi ở
    Ho Chi Minh City, Vietnam, Vietnam
    Bài viết
    8

    Mình chỉnh sửa lại chút cho code bạn ở trên để ai tìm được thì dùng. Code này chạy bất đồng bộ (có từ VS 2012) và tự động delete resources để giải phóng RAM.

    Về lý do tại sao phải cast WebRequest sang HttpWebRequest thì đọc tại đây: http://stackoverflow.com/questions/896253/c-sharp-httpwebrequest-vs-webrequest. Thật ra google trên mạng thì thấy người ta làm hoài như vậy nên đi theo luôn mà ko cần thắc mắc nhiều.

    Code:
    private async Task<string> HttpGetAsync(string p_URL)
            {
                var request = (HttpWebRequest)WebRequest.Create(p_URL);
                using(var response = (HttpWebResponse)(await request.GetResponseAsync()))
                {
                    using(var gzstream = new System.IO.Compression.GZipStream(response.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress))
                    {
                        using(var reader = new StreamReader(gzstream))
                        {
                            return (await reader.ReadToEndAsync());
                        }
                    }
                }
            }
    Đã được chỉnh sửa lần cuối bởi thelemontree10 : 08-10-2015 lúc 05:53 PM.

  6. #6
    Ngày gia nhập
    03 2009
    Bài viết
    128

    Mặc định Không đọc được XML từ trang mp3.zing.vn

    Trích dẫn Nguyên bản được gửi bởi thelemontree10 Xem bài viết
    Mình chỉnh sửa lại chút cho code bạn ở trên để ai tìm được thì dùng. Code này chạy bất đồng bộ (có từ VS 2012) và tự động delete resources để giải phóng RAM.

    Về lý do tại sao phải cast WebRequest sang HttpWebRequest thì đọc tại đây: http://stackoverflow.com/questions/896253/c-sharp-httpwebrequest-vs-webrequest. Thật ra google trên mạng thì thấy người ta làm hoài như vậy nên đi theo luôn mà ko cần thắc mắc nhiều.

    Code:
    private async Task<string> HttpGetAsync(string p_URL)
            {
                var request = (HttpWebRequest)WebRequest.Create(p_URL);
                using(var response = (HttpWebResponse)(await request.GetResponseAsync()))
                {
                    using(var gzstream = new System.IO.Compression.GZipStream(response.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress))
                    {
                        using(var reader = new StreamReader(gzstream))
                        {
                            return (await reader.ReadToEndAsync());
                        }
                    }
                }
            }
    lý do nó trả về gzip là vì trong header khi bạn request bạn có yêu cầu nó gửi gzip
    kiểm tra lại xem có cái nào giống cái này ko
    'Accept-Encoding': 'gzip', còn nếu dùng webclient thì dùnng downloadstring thay vì download data
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn