2011-09-01 15 views
5

मैं एक HTML तालिका और एक बाध्य सूची बॉक्स में LINQ से XML का उपयोग करके सामग्री को अपमानित करना चाहता हूं।एचटीएमएल एजिलिटी पार्सिंग

मैं एचटीएमएल एजिलिटी पैक का उपयोग कर रहा हूं और इस कोड का उपयोग कर रहा हूं।

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; 

एचटीएमएल इस तरह दिखता है ..

<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 

लौटा रहा है मैं XML स्वरूप को यह pasrse है चाहते हैं और उसके बाद करने के लिए XML को LINQ का उपयोग क्या 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 पंक्तियां = दर नोड। चयन नोड्स (" ./ table/tbody/tr "); और परिणाम के आधार पर पुनरावृत्त करें। – Oded

5

आप एक्सएमएल के लिए LINQ साथ काम करना चाहते हैं, तो आप एक xml स्ट्रिंग के लिए HtmlDocument परिणत कर सकते हैं:

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

तो फिर तुम केवल एक XDocument objet व एक्सएमएल तार के साथ लोड बनाने की जरूरत है

और अब आपके पास लिंक के साथ खेलने के लिए XDocument है।

+0

लेकिन यह केवल तभी काम करेगा जब एचटीएमएल वैध xml है। HtmlAgilityPack भी सादे HTML के साथ काम करता है। –

+0

यह वैध XML आउटपुट कर सकता है। मैं बस doc.OptionOutputAsXml = true; वाक्य जोड़ने के लिए चूक गया –

+0

@alejandro इसके लिए धन्यवाद। लेकिन, एचटीएमएल एक्सएमएल नहीं है और बहुत गन्दा है, इसलिए एचटीएमएल चपलता पैक शायद मेरा सबसे अच्छा विकल्प है। मैंने आपको सुझाव के लिए तैयार किया है। – Rhys

संबंधित मुद्दे