2014-05-04 105 views
1

我有一個基本的ASPX頁面:解析ASP元素與HtmlAgilityPack

<%@ 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

我不認爲有一種方法可以讓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("%>", "/>"));