2011-09-03 96 views
3

我正在解析一個HTML文件並遇到一些問題。HTML解析c#

我使用下面的代碼:

編輯********************************

更新的代碼現在可以使用。

私人無效PhoneApplicationPage_Loaded(對象發件人,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; 




     } 

    } 
} 

這是給我這樣的結果。如需要

enter image description here

所有結果現在被disaplayed。

我的問題是:我怎樣才能改變這種代碼來顯示所有下的所有<tr>'s

編輯#######################結果##### 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。你不會全部都不是所有的tds都緊張嗎? –

回答

2

假設您有使用的XElement的時候,因爲這應該做的伎倆可用同樣的方法

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; 
+0

我會認爲String.Join比使用聚合函數更簡潔。 –

+0

@Clausmåske,måskeikke。我會說「這取決於」對我來說,上述情況很明顯。代碼讀作你將如何解決任務。找到我這些元素,爲他們每個人連接InnerHtml。對於字符串來說,它更像是:每個字符串或我要提供的字符串插入「\ n」,字符串可以像這樣找到 –

+1

請參閱https://gist.github.com/1190957,我認爲這更多明確的意圖。 –

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; 
    } 
+0

謝謝,但這顯示在list.Descendants和x.Id上的代碼錯誤,說'錯誤類型'HtmlAgilityPack.HtmlNode'不能用作泛型類型或方法'System.Xml.Linq.Extensions.Descendants (System.Collections.Generic.IEnumerable ,System.Xml)中的類型參數'T'。 Linq.XName)」。沒有從'HtmlAgilityPack.HtmlNode'到'System.Xml.Linq.XContainer'的隱式引用轉換。 ' – Rhys

+0

@Rhys檢查我的更新 – Damith

+0

我很困惑,你剛剛添加了我已經使用的代碼,仍然存在list.descendants的問題,因爲它似乎不適用於Windows Phone的HTML敏捷包 – Rhys