HTML敏捷解析

5
我想用XML to LINQ在一个绑定的列表框中解析HTML表格并显示内容。
我正在使用HTML Agility包,并使用以下代码:
    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>

但是它返回了这个 <\p>
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格式,然后使用LINQ to XML将XML解析为绑定listbox的itemsource。
我认为我需要针对每个类使用以下变体,但需要一些帮助。
HtmlNodeCollection cols = rows[i].SelectNodes(".//td[@class='flight']");
2个回答

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']");

有示例代码的机会吗?我在尝试解析那个 div 中的多个类并将其转换为 XML 时遇到了麻烦。 - Rhys
谢谢,似乎我已经让它能够工作了,不过它只返回了第一个结果,而需要返回数百个结果。 - Rhys
@Rhys - 你可能需要一个节点集,而不是单个节点。类似这样:var rows = rateNode.SelectNodes("./table/tbody/tr"); 然后遍历结果。 - Oded
谢谢你的帮助,我刚意识到我使用的是VS 2010而不是用于Windows手机的VS 2010。我不得不从头开始 :( - Rhys
我的另一个问题是[http://stackoverflow.com/questions/7267961/html-agilty-for-wp7-silverlight-c],如果你愿意再帮我一下的话。 - Rhys
显示剩余2条评论

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。


但是这仅适用于HTML是有效的XML的情况。HtmlAgilityPack也可以处理普通的HTML。 - Hans Kesting
它可以输出有效的XML。我只是忘记添加doc.OptionOutputAsXml = true;这句话。 - Alejandro Martin
@alejandro 谢谢你的建议。但是,HTML不是XML,而且非常混乱,所以HTML Agility Pack可能是我最好的选择。不过,我还是给了你一个赞。 - Rhys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接