ottenere valore dalla tabella in una pagina Web utilizzando Html Agility Pack senza utilizzare "SelectNode"

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

Domanda

Sto cercando di ottenere il valore completo di "Transaction and get url" utilizzando l'Html Agility Pack. quando ispeziono la sorgente html usando google, sono in grado di vedere l'id completo della transazione con un url. La mia domanda è come ottengo il valore completo di tutta la transazione e l'url associato con loro e li aggiungo al mio datagridusing Async. Non sono in grado di utilizzare "SelectNode" perché non è supportato nelle app di Windows Store. ## Titolo ##

ecco l'indirizzo del sito: 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>

Risposta accettata

SelectNode (con una query XPath) fa semplicemente il suo iterare attraverso i nodi e abbinare le cose. Devi solo farlo a mano, osservando l'HTML stesso e costruendo un percorso per arrivare a ciò che vuoi.

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

Ora che hai la tabella (e avresti potuto essere più specifico con i ChildNodes, come cercare il Div con un valore di attributo di classe specifico) puoi iniziare a guardare le righe. La prima riga è l'intestazione, non ci interessa.

// 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;
}

Risposta popolare

questo è un diavolo, ma puoi provare a usare la regex per analizzare se sei assolutamente sicuro di non usare l'API menzionata da @the_lotus.

\<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\>


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché