HtmlAgilityPack은 html을 렌더링하기 위해 xsl 파일과 함께 제공되는 xml 파일을 처리 할 수 ​​있습니까?

c# html-agility-pack

문제

HtmlAgilityPack이 html을 렌더링하는 xsl 파일을 포함하는 xml 파일을 읽는 가장 좋은 방법은 궁금합니다. HtmlDocument 클래스에서이 설정을 지원하는 설정이 있습니까? 아니면 HtmlAgiliyPack을로드하기 전에 변환을 실행할 수있는 방법을 찾아야합니까? 후자의 경우 그렇다면 누구나 그러한 변형을위한 훌륭한 라이브러리 또는 방법을 알고 있습니까? 다음은 xls 파일과 함께 사용할 XML 코드를 반환하는 웹 사이트의 예입니다.

var uri = new Uri("http://www.skechers.com/");
var request = (HttpWebRequest)WebRequest.Create(url);
var cookieContainer = new CookieContainer();

request.CookieContainer = cookieContainer;
request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5";
request.Method = "GET";
request.AllowAutoRedirect = true;
request.Timeout = 15000;

var response = (HttpWebResponse)request.GetResponse();
var page = new HtmlDocument();
page.OptionReadEncoding = false;
var stream = response.GetResponseStream();
page.Load(stream); 

이 코드는 오류를 던지지 않지만 xml은 파싱 된 것이고 변환은 아니며 원하는 결과입니다.

수락 된 답변

Html Agility Pack은 두 가지 점에서 여기서 당신을 도울 수 있습니다 :

1) PI 데이터를 Html로 구문 분석 할 때 Xml 처리 명령을 얻는 것이 더 쉽습니다. 따라서 PI 데이터를 특성으로 변환합니다.

2) HtmlDocument는 .NET Xslt 변환 엔진으로 직접 변환 할 수 있도록 IXPathNavigable을 구현합니다.

다음은 작동하는 코드 조각입니다. Xslt 변환을 적절히 처리하기 위해 특정 XmlResover를 추가해야했지만이 skechers 경우에만 해당됩니다.

public static void DownloadAndProcessXml(string url, string userAgent, string outputFilePath)
{
    using (XmlTextWriter writer = new XmlTextWriter(outputFilePath, Encoding.UTF8))
    {
        DownloadAndProcessXml(url, userAgent, writer);
    }
}

public static void DownloadAndProcessXml(string url, string userAgent, XmlWriter output)
{
    UserAgentXmlUrlResolver resolver = new UserAgentXmlUrlResolver(url, userAgent);

    // WebClient is an easy to use class.
    using (WebClient client = new WebClient())
    {
        // download Xml doc. set User-Agent header or the site won't answer us...
        client.Headers[HttpRequestHeader.UserAgent] = resolver.UserAgent;
        HtmlDocument xmlDoc = new HtmlDocument();
        xmlDoc.Load(client.OpenRead(url));

        // determine xslt (note the xpath trick as Html Agility Pack does not support xml processing instructions)
        string xsltUrl = xmlDoc.DocumentNode.SelectSingleNode("//*[name()='?xml-stylesheet']").GetAttributeValue("href", null);

        // download Xslt doc
        client.Headers[HttpRequestHeader.UserAgent] = resolver.UserAgent;
        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(new XmlTextReader(client.OpenRead(url + xsltUrl)), new XsltSettings(true, false), null);

        // transform Html/Xml doc into new Xml doc, easy as HtmlDocument implements IXPathNavigable
        // note the use of a custom resolver to overcome this Xslt resolve requests
        xslt.Transform(xmlDoc, null, output, resolver);
    }
}

// This class is needed during transformation otherwise there are errors.
// This is probably due to this very specific Xslt file that needs to go back to the root document itself.
public class UserAgentXmlUrlResolver : XmlUrlResolver
{
    public UserAgentXmlUrlResolver(string rootUrl, string userAgent)
    {
        RootUrl = rootUrl;
        UserAgent = userAgent;
    }

    public string RootUrl { get; set; }
    public string UserAgent { get; set; }

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        WebClient client = new WebClient();
        if (!string.IsNullOrEmpty(UserAgent))
        {
            client.Headers[HttpRequestHeader.UserAgent] = UserAgent;
        }
        return client.OpenRead(absoluteUri);
    }

    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        if ((relativeUri == "/") && (!string.IsNullOrEmpty(RootUrl)))
            return new Uri(RootUrl);

        return base.ResolveUri(baseUri, relativeUri);
    }
}

그리고 당신은 이것을 다음과 같이 부릅니다 :

    string url = "http://www.skechers.com/";
    string ua = @"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5";
    DownloadAndProcessXml(url, ua, "skechers.html");

인기 답변

XML 및 XSLT의 출력을 렌더링해야합니다. 이렇게하려면 XML을 다운로드해야하며 이미 완료해야합니다. 그런 다음 XML을 구문 분석하여 XSL 참조를 식별합니다. 그런 다음 XSL을 다운로드하여 XML 문서에 적용해야합니다.

이 링크는 유용 할 수 있습니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.