3

XML を返す RSS フィードをフォローしています。XML 内には HTML テーブルがあり、1 つの長い文字列として返されます。この HTML テーブルの要素に C# でアクセスしようとしているので、これらの各要素を別のプログラムの変数として使用できます。テーブルの例:

<table cellpadding="5"><tr><td><strong>Date (GMT)</strong></td><td><strong>Event</strong></td><td><strong>Cons.</strong></td><td><strong>Actual</strong></td><td><strong>Previous</strong></td></tr><tr><td>Jun 7 11:00</td><td>Announcement</td><td>6.250 %</td><td>6.310  %</td><td>6.560  %</td></tr></table>

ここにあるほぼすべての同様のスレッドで、私が使用しようとしている HtmlAgilityPack が提案されています。これまでのところ、HTML のテーブルを取り出して文字列変数として宣言することはできましたが、テーブル要素を引き出すことはできないようです。以下は、いくつかのユーザーの提案に基づいた私のハックです。

XmlDocument xDoc = new XmlDocument();
xDoc.Load("http://rssfeed.com");
string descr = xDoc.SelectSingleNode("rss/channel/item/description").InnerText;

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml("descr");
// A Print statement here (textBox1.Text = descr;) shows that I'm successfully accessing the HTML table
var table = doc.DocumentNode.Descendants("tr")
.Select(n => n.Elements("td").Select(o => o.InnerText).ToArray());

foreach (var tr in table)
{
textBox1.Text = String.Format("{0} {1} {2}", tr[0], tr[1], tr[2]);
}

どんな提案でも大歓迎です。

ありがとう

4

1 に答える 1

2

これは私にとってはうまくいきました。HtmlがXmlとして機能する限り、それはあなたのために機能します(そして値は常にTD内にあります)。内部に単一の要素(別名ストロング)を持つTDの値は、その要素の値と同じです。

XElement table = XElement.Parse("<table cellpadding=\"5\"><tr><td><strong>Date (GMT)</strong></td><td><strong>Event</strong></td><td><strong>Cons.</strong></td><td><strong>Actual</strong></td><td><strong>Previous</strong></td></tr><tr><td>Jun 7 11:00</td><td>Announcement</td><td>6.250 %</td><td>6.310  %</td><td>6.560  %</td></tr></table>");
string[] values = table.Descendants("td").Select(td => td.Value).ToArray();

および/または値の配列を持つ行:

var rows = table.Elements()
    .Select(tr => tr.Elements().Select(td => td.Value).ToArray())
    .ToList();

アップデート:

foreach (string value in values)
    Console.WriteLine(value);

foreach (string[] row in rows)
    foreach (string value in row)
        Console.WriteLine(value);
于 2012-06-07T13:45:12.013 に答える