Разбор HTML с помощью HTTP Agility Pack

Вот одна таблица из 5:

<h3>marec - maj 2009</h3>
<div class="graf_table">
<table summary="layout table">
    <tr>
        <th>DATUM</th>
        <td class="datum">10.03.2009</td>
        <td class="datum">24.03.2009</td>
        <td class="datum">07.04.2009</td>
        <td class="datum">21.04.2009</td>
        <td class="datum">05.05.2009</td>
        <td class="datum">06.05.2009</td>
    </tr>
    <tr>
        <th>Maloprodajna cena [EUR/L]</th>
        <td>0,96000</td>
        <td>0,97000</td>
        <td>0,99600</td>
        <td>1,00800</td>
        <td>1,00800</td>
        <td>1,01000</td>
    </tr>
    <tr>
        <th>Maloprodajna cena [SIT/L]</th>
        <td>230,054</td>
        <td>232,451</td>
        <td>238,681</td>
        <td>241,557</td>
        <td>241,557</td>
        <td>242,036</td>
    </tr>
    <tr>
        <th>Prodajna cena brez dajatev</th>
        <td>0,33795</td>
        <td>0,34628</td>
        <td>0,36795</td>
        <td>0,37795</td>
        <td>0,37795</td>
        <td>0,37962</td>
    </tr>
    <tr>
        <th>Trošarina</th>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
        <td>0,46205</td>
    </tr>
    <tr>
        <th>DDV</th>
        <td>0,16000</td>
        <td>0,16167</td>
        <td>0,16600</td>
        <td>0,16800</td>
        <td>0,16800</td>
        <td>0,16833</td>
    </tr>
</table>
</div>

Мне нужно извлечь значения, где заголовком таблицы является DATUM, а цена Malopdajna [EUR/L]. Я использую пакет Agility HTML.

this.htmlDoc = new HtmlAgilityPack.HtmlDocument();
this.htmlDoc.OptionCheckSyntax = true;
this.htmlDoc.OptionFixNestedTags = true;
this.htmlDoc.OptionAutoCloseOnEnd = true;
this.htmlDoc.OptionOutputAsXml = true; // is this necessary ??
this.htmlDoc.OptionDefaultStreamEncoding = System.Text.Encoding.Default;

У меня было много проблем с получением этих значений. Я начал с:

 var query = from html in doc.DocumentNode.SelectNodes("//div[@class='graf_table']").Cast<HtmlNode>()
 from table in html.SelectNodes("//table").Cast<HtmlNode>()
 from row in table.SelectNodes("tr").Cast<HtmlNode>()
 from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
 select new { Table = table.Id, CellText = cell.InnerHtml };

но не смог найти способ выбрать только значения, где заголовок таблицы DATUM и Малопродайна цена[EUR/L]. Можно ли это сделать с предложением where?

Затем я закончил с этими двумя запросами:

var date = (from d in htmlDoc.DocumentNode.SelectNodes("//div[@class='graf_table']//table//tr[1]/td")
                    select DateTime.Parse(d.InnerText)).ToArray();

var price = (from p in htmlDoc.DocumentNode.SelectNodes("//div[@class='graf_table']//table//tr[2]/td")
                     select double.Parse(p.InnerText)).ToArray();

Можно ли объединить эти два запроса? И как мне преобразовать это в лямбда-выражение? Я только начал изучать эти вещи, и я хотел бы знать, как это делается, чтобы в будущем у меня не возникало этих вопросов.

О, еще один вопрос ... кто-нибудь знает какой-либо элемент управления графиком, потому что я должен показать эти значения на графике. Я начал с Microsoft Chart Controls, но у меня возникли проблемы с его настройкой. Поэтому, если у кого-то есть опыт работы с этим, я хотел бы знать, как его настроить, чтобы ось x показывала все значения не каждую секунду ... пример: если у меня есть: 10.03.2009, 24.03.2009, 07.04.2009, 21.04.2009, 05.05.2009, 06.05.2009 показывают только: 10.03.2009, 07.04.2009, 05.05.2009 и т.д.

Я привязываю данные к графику следующим образом:

chart1.Series["Series1"].Points.DataBindXY(date, price);

У меня много вопросов к моему первому посту... хе-хе, надеюсь, что я не был невнятным или что-то в этом роде. Спасибо за любой ответ!


person Pajci    schedule 29.03.2010    source источник


Ответы (1)


Для таких проектов CodePlex рассмотрите возможность публикации своих вопросов непосредственно на их досках обсуждений. Обычно это лучший способ связаться с разработчиками.

person Lex Li    schedule 30.03.2010