Análisis de agilidad HTML

c# html-agility-pack linq xml

Pregunta

Me gustaría analizar una tabla HTML y deshabilitar el contenido utilizando XML a LINQ en un cuadro de lista enlazado.

Estoy usando HTML Agility Pack y usando este código.

    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;

El HTML se ve así ...

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

Pero está volviendo esto.

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 

Lo que me gustaría es pasar esto al formato XML y luego usar LINQ to XML para analizar el XML a un elemento de cuadro de lista enlazado.

Estoy pensando que necesito usar una variación de lo siguiente para cada clase, pero me gustaría algo de ayuda.

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

Respuesta aceptada

Está utilizando texto InnerText que elimina el HTML.

Utilice InnerHtml :

string rate = rateNode.InnerHtml;

Puede crear un documento XML a partir de esta cadena (suponiendo que sea un XML válido).

También puede consultar el rateNode de la misma manera que lo recuperó, seleccionando sus nodos secundarios:

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

Respuesta popular

Si desea trabajar con linq to xml, puede transformar el HtmlDocument en una cadena 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();

Entonces solo necesita crear un objeto XDocument y cargar con la cadena xml:

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

Y ahora tienes un XDocument para jugar con Linq.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué