2010-10-11 54 views
2

問題: 我想要檢索的XML文件具有對XSLT的引用,因此響應只包含轉換後的XHTML內容。使用C#從網上檢索XML

例如: 的URL:http://armory.wow-europe.com/arena-ladder.xml TS = 2 & B =停電 如果你打開這個網址與Firefox你可以看到原來的?從Web服務器檢索到的XML。如果您通過螢火蟲或其他瀏覽器(f.e. Opera)查看源代碼,您可以看到轉換後的XHTML。

我想用C#檢索原始XML並解析它。 (我做了JDOM在Java之前的一些分析,類似的將是非常好的東西)對你的幫助:)

回答

1

本網站的顯然是檢查請求頭中的用戶代理和XML服務只佔到Firefox

謝謝。因此,如果您將請求中的User-agent標頭設置爲Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11,則響應將包含XML。

1

您可以使用被覆蓋的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(); 
    } 
}