【问题标题】:How to output HTML Agility Pack for WP7如何为 WP7 输出 HTML 敏捷包
【发布时间】:2011-09-02 08:54:23
【问题描述】:

我有下面的代码来解析 html 页面的一部分。

我想知道的是如何将它输出到列表框或文本框。

每当我尝试时,我都会收到未处理的 exceltion 错误

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {

var doc = new HtmlDocument();
doc.LoadHtml("http://www.sourceURL.com");

var node = doc.DocumentNode.Descendants("div").FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel");

 var value = node.InnerHtml;
 this.textBox1.Text = value;

异常错误是:

System.NullReferenceException was unhandled
Message: NullReferenceException

堆栈跟踪是:

   at Auckland_Airport.MainPage.PhoneApplicationPage_Loaded(Object sender, RoutedEventArgs e)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

HTML 布局是

        <div id="FlightInfo_FlightInfoUpdatePanel">

        <table cellspacing="0" cellpadding="0"><tbody>
            <tr class=""><td class="airline"><img src="/images/airline logos/US.gif" title="US AIRWAYS. " alt="US AIRWAYS. " /></td><td class="flight">US5316</td><td class="codeshare">NZ46</td><td class="origin">Rarotonga</td><td class="date">02 Sep</td><td class="time">10:30</td><td class="est">21:30</td><td class="status">CHECK IN CLOSING</td></tr><tr class="alt"><td class="airline"><img src="/images/airline logos/NZ.gif" title="AIR NEW ZEALAND LIMITED. " alt="AIR NEW ZEALAND LIMITED. " /></td><td class="flight">NZ6</td><td class="codeshare">&nbsp;</td><td class="origin">Los Angeles</td><td class="date">02 Sep</td><td class="time">19:15</td><td class="est">19:15</td><td class="status">DEPARTED</td></tr><tr class=""><td class="airline"><img src="/images/airline logos/AC.gif" title="Air Canada. " alt="Air Canada. " /></td><td class="flight">AC6093</td><td class="codeshare">NZ6</td><td class="origin">Los Angeles</td><td class="date">02 Sep</td><td class="time">19:15</td><td class="est">19:15</td><td class="status">DEPARTED</td></tr><tr class="alt"><td class="airline"><img src="/images/airline  class="d
    </div>
</div>

更清晰的 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>
     <tr class="alt">
     <td class="airline"><img src="/images/airline logos/AC.gif" title="Air Canada. " alt="Air Canada. " /></td>
     <td class="flight">AC6103</td>
     <td class="codeshare">NZ8</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>

【问题讨论】:

  • 您的标记中是否有带有id="DivName" 的div?从您发布的 sn-p 中看不到任何内容。
  • @Darin 抱歉,刚刚编辑。我只是想从简单开始并在 FlightInfo_FlightInfoUpdatePanel div 中显示所有 html,然后我将解析各个 td。我就是无法输出。
  • 什么时候会出现异常。可能您添加的堆栈跟踪不完整。
  • @Rhys,是因为找不到div而抛出的异常,还是尝试将值分配给文本框时抛出的异常?
  • @maxim 它构建得很好,但是当我尝试在模拟器上运行时,它会得到异常并突出显示var value = node.InnerHtml;

标签: c# html windows-phone-7 silverlight-4.0 html-agility-pack


【解决方案1】:

HtmlDocument.Load 函数不将 Uri 作为参数,它应该接收结构化的 HTML,您以某种方式从服务器检索到该 HTML。

这是您的案例的代码,使用 WebClient 类从服务器检索 HTML:

        WebClient client = new WebClient();
        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);

        client.DownloadStringAsync(new Uri(@"http://www.aucklandairport.co.nz/en/FlightInformation/DomesticArrivalsAndDepartures.aspx"));

    }

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        var html = e.Result;

        var doc = new HtmlDocument();
            doc.LoadHtml(html);

        var list = doc.DocumentNode.Descendants("div").ToList();

        var node = doc.DocumentNode.Descendants("div").FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel");

        var value = string.Empty;

        if (node != null)
            value = node.InnerHtml;
    }

最后,value 变量保存了您需要进一步解析的内部 HTML。

【讨论】:

  • 这段代码会去哪里?代替var value = node.InnerHtml; this.textBox1.Text = value;
  • 谢谢。我添加了代码,但它在两件事上出错,一个 Empty 应该是大写,另一个是 var 值被声明了两次
  • 已更新。对不起。好吧,这是一个编译时错误。当您运行代码时,空引用异常是否仍然出现在同一个地方?
  • 谢谢。那个时候没有错误。那么这意味着它在 HTML 中找不到节点?
  • 这意味着,在生成的 HTML 页面中,根据对 SourceHTML.com 的请求提供服务,没有 Id 为 FlightInfo_FlightInfoUpdatePanel 的 div 元素。尝试通过在浏览器中打开 URL 并查看页面源代码来检查从服务器返回的 HTML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多