2011-09-01 60 views
5

我想解析一個HTML表格,並在綁定列表框中使用XML解析LINQ中的內容。HTML敏捷性解析

我使用的HTML敏捷包和使用此代碼。

HtmlWeb web = new HtmlWeb(); 
    HtmlAgilityPack.HtmlDocument doc = web.Load("http://www.SourceURL"); 
    HtmlNode rateNode = doc.DocumentNode.SelectSingleNode("//div[@id='FlightInfo_FlightInfoUpdatePanel']"); 
    string rate = rateNode.InnerText; 
    this.richTextBox1.Text = rate; 

的HTML看起來像這樣..

<div id="FlightInfo_FlightInfoUpdatePanel"> 

    <table cellspacing="0" cellpadding="0"><tbody> 
    <tr class=""> 
    <td class="airline"><img src="/images/airline logos/NZ.gif" title="AIR NEW ZEALAND LIMITED. " alt="AIR NEW ZEALAND LIMITED. " /></td> 
    <td class="flight">NZ8</td> 
    <td class="codeshare">&nbsp;</td> 
    <td class="origin">San Francisco</td> 
    <td class="date">01 Sep</td> 
    <td class="time">17:15</td> 
    <td class="est">18:00</td> 
    <td class="status">DEPARTED</td> 
    </tr> 

但它返回這個

NZ8&nbsp;San Francisco01 Sep17:1518:00DEPARTEDAC6103NZ8San Francisco01 Sep17:1518:00DEPARTEDCO6754NZ8San Francisco01 Sep17:1518:00DEPARTEDLH7157NZ8San Francisco01 Sep17:1518:00DEPARTEDUA6754NZ8San Francisco01 Sep17:1518:00DEPARTEDUS5308NZ8San Francisco01 Sep17:1518:00DEPARTEDVS7408NZ8San Francisco01 Sep17:1518:00DEPARTEDEK407&nbsp;Melbourne/Dubai01 Sep17:5017:50DEPARTEDEK413&nbsp;Sydney/Dubai01 Sep18:0018:00DEPARTEDQF44&nbsp;Sydney01 

我想什麼是pasrse這對XML格式,然後使用LINQ到XML將XML解析爲綁定列表框項目源。

我想我需要爲每個班級使用下面的變體,但想要一些幫助。

HtmlNodeCollection cols = rows[i].SelectNodes(".//td[@class='flight']"); 

回答

5

您正在使用InnerText去掉HTML。

使用InnerHtml

string rate = rateNode.InnerHtml; 

您可以從該字符串的XML文檔(假設它是有效的XML)。

您還可以查詢rateNode在您檢索它以同樣的方式 - 選擇它的子節點:

var firstRow = rateNode.SelectSingleNode("./table/tbody/tr[0]"); 
string origin = firstRow.SelectSingleNode("./td[@class = 'origin']"); 
+0

任何示例代碼的機會?我無法讓我的頭解析該div中的多個類,然後到xml – Rhys

+0

謝謝你,我似乎有它的工作,雖然它只返回第一個結果,並有數百它需要返回 – Rhys

+0

@Rhys - 你可能需要一個節點集,而不是一個節點。例如:'var rows = rateNode.SelectNodes(「./ table/tbody/tr」);'並迭代結果。 – Oded

5

如果你想用的LINQ to XML來工作,你可以改變的HTMLDocument到XML字符串:

HtmlWeb web = new HtmlWeb(); 
HtmlAgilityPack.HtmlDocument doc = web.Load("http://www.SourceURL"); 
doc.OptionOutputAsXml = true; 
System.IO.StringWriter sw = new System.IO.StringWriter(); 
System.Xml.XmlTextWriter xw = new System.Xml.XmlTextWriter(sw); 
doc.Save(xw); 
string result = sw.ToString(); 

然後你只需要創建一個XDocument客體和負載與XML字符串:

System.Xml.Linq.XDocument xDoc = System.Xml.Linq.XDocument.Parse(result); 

現在你有一個XDocument和Linq一起玩。

+0

但是,只有當html是有效的xml時才能工作HtmlAgilityPack也可以用純html工作 –

+0

它可以輸出有效的XML我錯過了添加doc.OptionOutputAsXml = true;句子 –

+0

@alejandro謝謝你,但是,HTML不是XML,也非常混亂,所以HTML敏捷包可能是我的最佳選擇,儘管我給了你一個建議。 – Rhys