Получить XML из Интернета, используя C # - PullRequest
2 голосов
/ 11 октября 2010

Проблема: XML-файл, который я хочу получить, содержит ссылку на XSLT, поэтому ответ содержит только преобразованное содержимое XHTML.

Например: URL: http://armory.wow -europe.com / arena-ladder.xml? ts = 2 & b = Blackout Если вы откроете этот URL-адрес в Firefox, вы фактически сможете увидеть исходный XML-код, полученный с веб-сервера.И вы можете увидеть преобразованный XHTML, если взгляните на исходный код через firebug или другой браузер (например, Opera).

Я хотел бы получить исходный XML с помощью C # и проанализировать его.(Я делал несколько разборов с jdom в java, что-то подобное было бы очень приятно)

Спасибо за вашу помощь:)

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Вы можете использовать переопределенный XmlUrlResolver, чтобы обойти перенаправление на стороне сервера, например ::10000

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
using System.Xml.XPath;
using System.Net;

class Program
{
    static void Main(string[] args)
    {
        var html = GetHtml(@"http://armory.wow-europe.com/arena-ladder.xml?ts=2&b=Blackout");
        Console.WriteLine(html);
    }

    public static string GetHtml(string url)
    {
        NonRedirectingXmlUrlResolver resolver = new NonRedirectingXmlUrlResolver();
        XmlReaderSettings pagesettings = new XmlReaderSettings();
        pagesettings.XmlResolver = resolver;

        XmlReader page = XmlReader.Create(url, pagesettings);
        XmlDocument doc = new XmlDocument();
        doc.Load(page);
        string xslhref = resolver.ResolveUri(new Uri(url), GetXsltHref(doc)).OriginalString;

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        XmlWriter writer = XmlWriter.Create(sw);
        XslCompiledTransform transform = new XslCompiledTransform();

        page = XmlReader.Create(url, pagesettings);
        transform.Load(xslhref, new XsltSettings(true, true), new XmlUrlResolver());
        transform.Transform(page, null, writer, new NonRedirectingXmlUrlResolver());
        return sb.ToString();
    }

    public static string GetXsltHref(XmlDocument doc)
    {
        XmlProcessingInstruction styleSheet = doc.SelectSingleNode("processing-instruction('xml-stylesheet')") as XmlProcessingInstruction;
        if (styleSheet == null)
            return null;
        XmlDocument pidoc = new XmlDocument();
        pidoc.LoadXml(string.Format("<xsl {0}/>", styleSheet.Data));
        return pidoc.DocumentElement.GetAttribute("href");
    }
}

public class NonRedirectingXmlUrlResolver : XmlUrlResolver
{
    public NonRedirectingXmlUrlResolver() {}

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(absoluteUri);
        httpRequest.UserAgent = @"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
            return httpResponse.GetResponseStream();
    }
}
1 голос
/ 11 октября 2010

Этот сайт, по-видимому, проверяет пользовательский агент в заголовке запроса и обслуживает XML только для Firefox.Так что если вы установите заголовок User-agent в запросе на Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11, ответ будет содержать XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...