Html Agility Packを使用してWebページのテーブルから値を取得 "SelectNode"

c# c#-4.0 html html-agility-pack windows-store-apps

質問

私はHtml Agility Packを使用して、 "Transaction and get url"の完全な価値を得ようとしています。私がGoogleを使ってhtmlソースを調べると、URLを持つ完全なトランザクションIDを見ることができます。私の質問は、どのように私はすべてのトランザクションとそれらに関連付けられているURLの完全な価値を取得し、私のdatagridusing Asyncに追加することです。私はそれがWindowsストアのアプリケーションでサポートされていないため、 "SelectNode"を使用することができません。

ここにサイトのURLがあります: http : //explorer.litecoin.net/address/LeDGemnpqQjrK8v1s5HZKaDgjgDKQ2MYiK

async private void GetTransactions()
{
    url = "http://explorer.litecoin.net/address/LeDGemnpqQjrK8v1s5HZKaDgjgDKQ2MYiK";
    string html;

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    try
    {
        WebResponse x = await req.GetResponseAsync();
        HttpWebResponse res = (HttpWebResponse)x;
        if (res != null)
        {
            if (res.StatusCode == HttpStatusCode.OK)
            {
                Stream stream = res.GetResponseStream();
                using (StreamReader reader = new StreamReader(stream))
                {
                    html = reader.ReadToEnd();
                }
                HtmlDocument htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);

               var tsTable = htmlDocument.DocumentNode.ChildNodes["html"].ChildNodes["body"].ChildNodes["div"].
                        ChildNodes["div"].ChildNodes["div"].ChildNodes["table"].InnerHtml;

                    int n = 2;
                    var tsRow = tsTable.Split(Environment.NewLine.ToCharArray()).Skip(n).ToArray();

                    for (var index = 1; index < tsRow.Count(); index++)
                    {

                    }
            }
        }
    }
    catch
    {
        MessageDialog messageDialog =
            new MessageDialog("A tear occured in the space-time continuum. Please try again when all planets in the solar system are aligned.");
    }
}
<telerikGrid:RadDataGrid Grid.RowSpan="1"  ItemsSource="{Binding Data}" IsSynchronizedWithCurrentItem="True" AlternateRowBackground="AliceBlue" Background="White" Grid.Row="2" 
                         UserEditMode="Inline" UserGroupMode="Disabled" VerticalAlignment="Bottom" AutoGenerateColumns="False" Height="294" Grid.ColumnSpan="2">
    <telerikGrid:RadDataGrid.GroupDescriptors>
        <telerikGrid:PropertyGroupDescriptor PropertyName="Group"/>
    </telerikGrid:RadDataGrid.GroupDescriptors>
    <telerikGrid:RadDataGrid.Columns>
        <telerikGrid:DataGridNumericalColumn PropertyName="Id" CanUserEdit="False" CanUserFilter="False" Header="#" SizeMode="Fixed" Width="40"/>
        <telerikGrid:DataGridTextColumn PropertyName="pnDate" CanUserFilter="False" Header="Date" CellContentFormat="{}{0,0:dd.MM.yyyy}"/>
        <telerikGrid:DataGridNumericalColumn PropertyName="pnType" CanUserFilter="False" Header="Type"/>
        <telerikGrid:DataGridTextColumn PropertyName="pnAddress" CanUserFilter="False" Header="Address"/>
        <telerikGrid:DataGridDateColumn PropertyName="pnAmount" CanUserFilter="False" Header="Amount"/>
    </telerikGrid:RadDataGrid.Columns>
</telerikGrid:RadDataGrid>

受け入れられた回答

SelectNode(XPath問合せを使用)は、ノードを反復して処理する独自の処理を実行します。手作業で行う必要があるのは、HTML自体を見て、あなたが望むものに到達するための道を築くことだけです。

var table = htmlDocument.DocumentNode.ChildNodes["html"].ChildNodes["Body"].ChildNodes[0].ChildNodes[0].ChildNodes[0].ChildNodes["Table"];

これで、テーブルが作成されました(そして、ChildNodesでより具体的になりました。特定のクラス属性値を持つDivを探しているようなものです)。最初の行はヘッダーですが、気にしません。

// The first table row is index 0 and looks like this:
// <tr><th>Transaction</th><th>Block</th><th>Approx. Time</th><th>Amount</th><th>Balance</th><th>Currency</th></tr>
// It is the column headers, each <th> node represents a column. The foreach below starts at index 1, the first row of real data...
foreach(var index = 1; index < table.ChildNodes.Count; index++)
{
    // a row of data looks like:
    // <tr><td><a href="../tx/513.cut for space.b4a#o1">5130f066e0...</a></td><td><a href="../block/c3.cut for space.c9c">468275</a></td><td>2013-11-28 09:14:17</td><td>0.3</td><td>0.3</td><td>LTC</td></tr>
    // each <td> node inside of the row, is the matching data for the column index...
    var row = table.ChildNodes[index];
    var transactionLink = row.ChildNodes[0].ChildNodes["a"].Attributes["href"].Value;
    var transactionText = row.ChildNodes[0].ChildNodes["a"].InnerText;

    // Other variables for the table row data... 
    // Here is one more example
    var apporxTime = row.ChildNodes[2].InnerText;
}

人気のある回答

これはちょっとしたハックですが、@the_lotusが指摘したAPIを使用しないことを確実に確実にしている場合は、以下の正規表現を使って解析することができます。

\<td\>\s*\<a(?:.*)href="(?<url>[^"]*)"\>(?<block>[^<]*)\</a\>\s*\</td\>\s*\<td\>(?<date>[^<]*)\</td\>\s*\<td\>(?<amount>[^<]*)\</td\>\s*\<td\>(?<balance>[^<]*)\</td\>\s*\<td\>(?<currency>[^<]*)\</td\>


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ