0

サイトマップのリストを含むサイトマップ インデックスを解析しようとしています。

sitemapindex.xml の解析に成功し、.gz リンクのリストを取得しました。しかし、それらを xml として開く最良の方法は何でしょうか?

        String sitemap = "http://www.site.com/siteindex.xml";
        XmlDocument xml = new XmlDocument();
        xml.Load(sitemap);
        XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable);
        manager.AddNamespace("s", xml.DocumentElement.NamespaceURI); //Using xml's properties instead of hard-coded URI 
        XmlNodeList xnList = xml.SelectNodes("/s:sitemapindex/s:sitemap", manager);

        var parallelLoop1 = xnList.Count;
        Parallel.For(0, parallelLoop1, parOptions, index =>
        {
            String NAME = xnList[index]["loc"].InnerText;
            System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(NAME);
            req.Timeout = 1000 * 60 * 60; // milliseconds 
            System.Net.WebResponse res = req.GetResponse();
            Stream responseStream = res.GetResponseStream();
            XmlDocument xml2 = new XmlDocument();
            xml2.Load(responseStream); //this is the part where it fails- file is .gz, but xml expected
            responseStream.Close();
    ......... more code
        }
4

1 に答える 1

0

これが私がそれを解決した方法です:

            GZipStream zip = new GZipStream(responseStream, CompressionMode.Decompress);
            XmlDocument xml2 = new XmlDocument();
            xml2.Load(zip);

これが私の最終的なコードです:

    String sitemap = "http://www.site.com/siteindex.xml"; 
    XmlDocument xml = new XmlDocument(); 
    xml.Load(sitemap); 
    XmlNamespaceManager manager = new XmlNamespaceManager(xml.NameTable); 
    manager.AddNamespace("s", xml.DocumentElement.NamespaceURI); //Using xml's properties instead of hard-coded URI  
    XmlNodeList xnList = xml.SelectNodes("/s:sitemapindex/s:sitemap", manager); 

    var parallelLoop1 = xnList.Count; 
    Parallel.For(0, parallelLoop1, parOptions, index => 
    { 
        String NAME = xnList[index]["loc"].InnerText; 
        System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(NAME); 
        req.Timeout = 1000 * 60 * 60; // milliseconds  
        System.Net.WebResponse res = req.GetResponse(); 
        Stream responseStream = res.GetResponseStream(); 
            GZipStream zip = new GZipStream(responseStream, CompressionMode.Decompress);
            XmlDocument xml2 = new XmlDocument();
            xml2.Load(zip);
        responseStream.Close(); 
......... more code 
    } 
于 2012-07-25T17:09:43.433 に答える