HTML解析 c#

3
我正在解析一个HTML文件,但遇到了一些问题。
我正在使用下面的代码:
EDIT********************************
更新后的代码现在可以工作了。 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {
    WebClient client = new WebClient();
    client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);

    client.DownloadStringAsync(new Uri(@"http://www.SourceURL.com"));

}

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")
        .Element("table")
        .Element("tbody")
        .Elements("tr").Aggregate("Flight list\n", (acc, n) => acc + "\n" + n.InnerHtml);
       // .Elements("td")

    this.scrollViewer1.Content = node;




       }

    }
}

这给我带来了这个结果。

输入图像描述

现在所有的结果都按要求显示。

我的问题是:如何更改此代码以在所有<tr>下显示所有结果

编辑############################ XAML

ListBox Margin="6,6,-12,0" Name="listBox1">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="0,0,0,17" Width="432" Height="Auto">

                            <TextBlock Text="{Binding Flight}" Foreground="#FF4BCCF5" FontSize="24" />
                            <TextBlock Text="{Binding Origin}" TextWrapping="Wrap" FontSize="22" Foreground="#FF969696" />
                            <TextBlock Text="{Binding Date}" TextWrapping="Wrap" FontSize="20" Foreground="#FF05C16C" />
                            <TextBlock Text="{Binding Time}" TextWrapping="Wrap" FontSize="20" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

1
你应该把元素放在tr而不是td上。你希望所有的tr都拥有元素,而不是只有第一个tr中的所有td吗? - Rune FS
2个回答

2

假设您在使用XElement时拥有与as相同的方法,那么这应该能解决问题。

var text = list.Descendants("div")
                 .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
                 .Element("table")
                 .Element("tbody")
                 .Descendants("tr").Aggregate("",(acc,n)=>acc+"\n"+n.OuterHtml);

 this.textBlock2.Text = text;

我认为使用String.Join比使用Aggregate函数更加简洁。 - Claus Jørgensen
@Claus 可能是,也可能不是。我会说“这取决于情况”。对我来说,上面的内容很清晰。代码读起来就像你如何解决任务一样。找到这些元素,对于每个元素连接 InnerHtml。使用字符串更像是:在我提供的每个字符串之间插入“\n”,可以像这样找到这些字符串。 - Rune FS
1
请查看 https://gist.github.com/1190957,我认为那更清晰地表达了意图。 - Claus Jørgensen
1
@Claus,我们在谈论一个HTML表格,你真的认为会有那么多的<tr>标签,以至于潜在的开销会成为性能问题吗?我还没有看过聚合的实现,但是可以优化该实现,使得上述(几乎)等于a + b + c + d + c,这样就像join一样快了。我不认为这是事实,但除非你在代码的特定上下文中实际测量到了性能上的明显差异,否则不要将其作为论点。过早地进行优化会带来比解决更多的问题。 - Rune FS
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Claus Jørgensen
显示剩余11条评论

2
var node = doc.DocumentNode.Descendants("div")
    .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
    .Element("table")
    .Element("tbody")
    .Descendants("tr").ToArray();

this.textBlock2.Text = string.Join(Environment.NewLine, node.Select(tr => tr.InnerHtml));

简单来说,您可以通过以下方式获取所有行:

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

    if (node != null)
    {
       this.textBlock2.Text = node.InnerHtml;
    }

谢谢,但是这段代码在list.Descendants和x.Id上显示了一个代码错误,错误信息为`Error 1 The type 'HtmlAgilityPack.HtmlNode' cannot be used as type parameter 'T' in the generic type or method 'System.Xml.Linq.Extensions.Descendants<T>(System.Collections.Generic.IEnumerable<T>, System.Xml.Linq.XName)'. There is no implicit reference conversion from 'HtmlAgilityPack.HtmlNode' to 'System.Xml.Linq.XContainer'. - Rhys
我很困惑,你刚刚添加了我已经在使用的代码,但是仍然存在list.descendants的问题,因为它似乎对于Windows Phone的HTML Agility Pack无效。 - Rhys
对于第二段代码,value没有被声明。对于第一段代码,我该如何输出结果? - Rhys
刚刚测试了一下,出现了两个错误:错误1:最佳重载方法匹配 'string.Join(string, string[])' 存在一些无效参数错误2:第二个参数:无法将类型为 'System.Collections.Generic.IEnumerable<string>' 的对象转换为类型 'string[]'。非常感谢您的帮助。 - Rhys

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