HTML Parse нет результатов - PullRequest
       26

HTML Parse нет результатов

1 голос
/ 05 сентября 2011

Пытаюсь разобрать этот 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>

Я использую этот код на основе HTML Agility Pack для Windows Phone 7 для поиска и вывода содержимого <td class="flight">US5316</td>

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

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


    var node = doc.DocumentNode.Descendants("div")
        .FirstOrDefault(x => x.Id == "FlightInfo_FlightInfoUpdatePanel")
        .Element("table")
        .Element("tbody")
        .Elements("tr")
        .Where(tr => tr.GetAttributeValue("td", "").Contains("class"))
        .SelectMany(tr => tr.Descendants("flight"))
        .ToArray();

    this.scrollViewer1.Content = node;  

   //Added below

   listBox1.itemSource = node;
}

Я не получаю результатов ни в ScrollViewer, ни в списке. Я хотел бы знать, правильно ли я использую синтаксический анализ linq для предоставленного мною HTML?

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Что вы собираетесь делать с этой строкой?

.Where(tr => tr.GetAttributeValue("td", "").Contains("class"))

GetAttributeValue(name, def) ищет атрибут с ключом name в узле и возвращает значение этого атрибута, если оноосновывает это.В противном случае он возвращает значение по умолчанию def.

Так что на самом деле здесь происходит то, что <tr> не имеет никакого атрибута с ключом td, поэтому он возвращает значение по умолчанию (пустая строка), который не содержит подстроку «class», поэтому ваш <tr> узел фильтруется.

Edit : это вернет массив, где каждая запись является массивом из 8строки, содержащие содержимое каждого тд:

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

Примеры:

node[0][1] == "US5316"
node[0][3] == "Rarotonga"
0 голосов
/ 05 сентября 2011

Вы пытаетесь установить содержимое ScrollViewer в string[] (массив). Поэтому я повторюсь и скажу, что вам следует потратить некоторое время на изучение базового C #, прежде чем продолжить эту работу.

Что вам нужно сделать, это использовать ListBox вместо ScrollViewer, а затем установить ListBox.ItemSource в ваш node строковый массив.

...