Html Agility Packのテーブルをオブジェクトに解析する

c# foreach html-agility-pack html-parsing

質問

だから私はこのようなHTMLを持っている:

<tr class="row1">
        <td class="id">123</td>
        <td class="date">2014-08-08</td>
        <td class="time">12:31:25</td>
        <td class="notes">something here</td>
</tr>
<tr class="row0">
        <td class="id">432</td>
        <td class="date">2015-02-09</td>
        <td class="time">12:22:21</td>
        <td class="notes">something here</td>
</tr>

そしてそれは各顧客の行のためにそれのように続きます。私はオブジェクトに各テーブル行の内容を解析したい。私はいくつかの方法を試しましたが、正しく動作させることができません。

これは私が現在持っているものです

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='customerlist']//tr"))
{
    Customer cust = new Customer();
    foreach (HtmlNode info in row.SelectNodes("//td"))
    {
        if (info.GetAttributeValue("class", String.Empty) == "id")
        {
            cust.ID = info.InnerText;
        }
        if (info.GetAttributeValue("class", String.Empty) == "date")
        {
            cust.DateAdded = info.InnerText;
        }
        if (info.GetAttributeValue("class", String.Empty) == "time")
        {
            cust.TimeAdded = info.InnerText;
        }
        if (info.GetAttributeValue("class", String.Empty) == "notes")
        {
            cust.Notes = info.InnerText;
        }
    }
    Console.WriteLine(cust.ID + " " + cust.TimeAdded + " " + cust.DateAdded + " " + cust.Notes);
}

これは、各ループのテーブルの最後の行の情報を出力する点まで機能します。私は何か非常に単純なものを見逃していますが、何が見えないのですか。

また、オブジェクトをうまく作成する私の方法ですか、またはコンストラクタを使用し、変数からオブジェクトを作成する必要がありますか?例えば

    string Notes = String.Empty;
if (info.GetAttributeValue("class", String.Empty) == "notes")
{
    Notes = info.InnerText;
}
..
Customer cust = new Customer(id, other_variables, Notes, etc);

人気のある回答

あなたのXPathクエリが間違っています。 //td代わりにtdを使う必要があります:

foreach (HtmlNode info in row.SelectNodes("td"))

SelectNodes() //tdを渡すと、ドキュメント内のすべての <td>要素と一致するため、内部ループは4回ではなく8回実行され、最後の4回は常にCustomerオブジェクトで以前に設定された値をオーバーライドします。

XPathの例を参照してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow