【问题标题】:Retrieve XML from web using C#使用 C# 从 Web 检索 XML
【发布时间】:2010-10-11 15:30:27
【问题描述】:

问题: 我要检索的 XML 文件具有对 XSLT 的引用,因此响应仅包含转换后的 XHTML 内容。

例如: 网址:http://armory.wow-europe.com/arena-ladder.xml?ts=2&b=Blackout 如果您使用 Firefox 打开此 URL,您实际上可以看到从 Web 服务器检索到的原始 XML。如果您通过 firebug 或其他浏览器(例如 Opera)查看源代码,您可以看到转换后的 XHTML。

我想用 C# 检索原始 XML 并解析它。 (我之前在java中用jdom做了一些解析,类似的会很好)

感谢您的帮助:)

【问题讨论】:

    标签: c# xml parsing


    【解决方案1】:

    该站点显然在检查请求标头中的用户代理并仅向 Firefox 提供 XML。所以如果你将请求中的User-agent标头设置为Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11,响应就会包含XML。

    【讨论】:

      【解决方案2】:

      您可以使用覆盖的 XmlUrlResolver 来绕过服务器端重定向,例如:

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

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        相关资源
        最近更新 更多