使用HtmlAgilityPack解析ASP元素

时间:2014-05-04 15:24:05

标签: c# asp.net parsing html-agility-pack

我有一个基本的ASPX页面:

<%@ Page Language="C#" MasterPageFile="SomeMasterPage.master" AutoEventWireup="true" %>
<h1>My ASPX Page</h1>
<div class="content">
    <p>Some content goes here.</p>
</div>

使用HtmlAgilityPack,我希望从ASPX页面获取第一行并访问其属性(LanguageMasterPageFileAutoEventWireup)。但是,当我尝试使用HtmlAgilityPack加载页面的HTML时,第一行将作为文本节点返回。

public static class Program
{
    public static void Main(string[] args)
    {
        var parser = new Parser();
        parser.Parse("some-page.aspx");
    }
}

public class Parser
{
    public void Parse(string path)
    {
        HtmlDocument document = new HtmlDocument();
        document.Load(path);

        HtmlNode childNode = document.DocumentNode.ChildNodes[0]; 
        // childNode is an HtmlTextNode
    }
}

我意识到开放的ASPX系列实际上并不是HTML,这很可能是HtmlAgilityPack将其作为文本节点返回的原因。现在,我可以使用此返回的文本手动解析属性中的值,但我宁愿将其视为标准HTML节点。有没有办法教HtmlAgilityPack将顶行视为HTML节点?

1 个答案:

答案 0 :(得分:2)

我认为没有办法让HtmlAgilityPack读取无效元素作为html元素。怎么样的小黑客:

//get the first line string
var firstNodeText = doc.DocumentNode.ChildNodes[0].InnerHtml;

//do simple string manipulation to change invalid element to become a valid html element
//in this example we change this : <%@ .... %> to become : <_asp .... />
HtmlNode firstNode = HtmlNode.CreateNode(firstNodeText.Replace("<%@", "<_asp").Replace("%>", "/>"));