2011-09-01 7 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> 

보이는 그러나 나는 XML 형식으로이 pasrse처럼 다음에 XML에 LINQ를 사용하는 것이 무엇이

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 

을 반환 바운드리스트 박스 itemsource에 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에 여러 클래스를 구문 분석하고 주위에 내 머리를 얻는 데 어려움을 겪고있다. – Rhys

+0

그 덕분에, 그것은 단지 첫 번째 결과를 반환하고 그것이 반환 해야하는 수백이 있지만 작동하는 것 같습니다 – Rhys

+0

@Rhys - 당신은 아마 단일 노드가 아니라 노드 세트가 필요합니다. 뭔가 : var rows = rateNode.SelectNodes ("./ table/tbody/tr");'와 같은 결과를 반복합니다. – Oded

5

당신이 LINQ to XML을 작업 할 경우, 당신은 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(); 

그런 다음 당신은 단지 XML 문자열을 가진하여 XDocument의 오브제와 부하를 만들 필요

이제 Linq와 함께 플레이 할 XDocument가 있습니다.

+0

그러나 html이 유효한 XML 인 경우에만 작동하며 HtmlAgilityPack은 일반 html로도 작동합니다. –

+0

유효한 XML을 출력 할 수 있습니다 .doc.OptionOutputAsXml = true; 문장을 추가하지 못했습니다. –

+0

@alejandro 그 점에 대해 감사드립니다 .HTML은 XML이 아니며 매우 복잡하기 때문에 HTML 민첩성 팩이 가장 좋은 방법 일 것입니다. 제안을 드렸습니다. – Rhys