2011-09-01 13 views
5

Bir HTML tablosunu ayrıştırmak ve HTML'yi LINQ kullanarak bir bağlanan liste kutusunda içeriğini saklıyorum.HTML Çeviklik Ayrıştırma

HTML Çeviklik paketi kullanıyorum ve bu kodu kullanıyorum.

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 .. Böyle

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

görünüyor Ama ben XML biçimine bu pasrse olduğunu gibi ve daha sonra XML LINQ kullanmak hangi bu

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 

dönüyor XML'yi bir bağlı liste kutusu öğeleri kaynağına ayrıştırın.

Her sınıf için aşağıda bir varyasyon kullanmam gerektiğini düşünüyorum, ancak bazı yardımlar istiyorum.

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

cevap

5

HTML'yi kesen InnerText kullanıyorsunuz.

Kullanım InnerHtml:

string rate = rateNode.InnerHtml; 

Bu dizeden bir XML belgesi oluşturabilir (Bu geçerli XML olduğunu varsayarak).

Ayrıca, tekrar yerine aynı şekilde rateNode sorgulayabilir - onun alt düğümlerin seçimi:

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

Örnek kodlama şansınız var mı? Ben bu div ve sonra xml – Rhys

+0

için ayrıştırma etrafında kafamı alma konusunda sorun yaşıyorum, bunun için sadece ilk sonuçları verir ve bu – Rhys

+0

@Rhys - dönmek zorunda yüzlerce vardır çalışıyor gibi görünüyor Tek bir düğüm değil, bir düğüm kümesine ihtiyaç duyar. Bir şey gibi: 'var satırlar = rateNode.SelectNodes (" ./ table/tbody/tr ");' ve sonuç üzerinde yineleyin. – Oded

5

Eğer xml linq ile çalışmak istiyorsanız, bir xml dizesine HtmlDocument dönüştürebilir:

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

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(); 

Sonra sadece xml dizesi ile bir XDocument Nesneyi ve yükü oluşturmak gerek

Ve şimdi Linq ile oynamak için bir XDocument var.

+0

Ama bu sadece html geçerli bir xml ise çalışır HtmlAgilityPack de düz html ile çalışır. –

+0

Geçerli bir XML çıkışı olabilir.O sadece doc.OptionOutputAsXml = true; cümlesini ekledim –

+0

@alejandro Bunun için teşekkürler.Ancak, HTML XML ve çok dağınık değildir, bu yüzden HTML çeviklik paketi muhtemelen en iyi seçeneğimdir. – Rhys

İlgili konular