0

私は Windows Phone 8 の開発に関しては初心者で、開発中のアプリケーションの一部としていくつかのことをいじっています。

現在、RuneScape 07 High Scores - http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=zezimaなどの Web サイトから情報を解析しようとしています。

HTML Agility Pack を使用していて、一部のデータ (Woodcutting まで) を解析できますが、渡されたものが表示されませんか? (それは私の ListBox のサイズまで減っていますか?)

理想的には、次のように 1 つのブロックではなく、テーブル情報を個別に解析できるようにしたいと考えています。

public MainPage()
    {
        InitializeComponent();
        HtmlWeb.LoadAsync("http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=zezima", DownLoadCompleted);
    }

    void DownLoadCompleted(object sender, HtmlDocumentLoadCompleted e)
    {
        if(e.Error == null)
        {
            HtmlDocument doc = e.Document;
            if (doc != null)
            {
                var result = doc.DocumentNode.SelectNodes("//div[@id='contentHiscores']");
               foreach (var htmlNode in result)
               {
                   lBox.Items.Add(htmlNode.InnerText);
               }
            }
        }

しかし、このような個々のテーブルにアクセスしようとすると、

var result = doc.DocumentNode.SelectNodes("//div[@id='contentHiscores']/table/tbody/tr[5]/td[2]");

NullReferenceException が発生します。

これは可能ですか、それとも私は何か非常に間違っていますか?

4

1 に答える 1

0

おそらく、FireBug や Chrome などの開発者ツールに依存して、目的のノードの XPATH を決定したことでしょう。

Html Agility Pack はサーバーから送り返された未加工の HTML しか認識していないのに対し、そのようなツールによって指定された XPATH はメモリ内の HTML DOM に対応するため、実際にこれを行うことができます。

あなたがする必要があるのは、送り返されたものを見ることです (または単にソースを表示するだけです)。たとえば、TBODY 要素がないことがわかります。したがって、判別可能なものを見つけて、たとえばXPATH 軸を使用する必要があります。

動作するように見えるコードは次のとおりです。

// get all TD nodes with ALIGN attribute set to left
foreach (var node in doc.DocumentNode.SelectNodes("//div[@id='contentHiscores']//td[@align='left']"))
{
    var item = lBox.Items.Add(node.InnerText.Trim());
    // use an 'XPATH axe': get all sibling TD nodes with ALIGN attribute set to 'right'
    foreach (var sibling in node.SelectNodes("following-sibling::td[@align='right']"))
    {
        item.SubItems.Add(sibling.InnerText.Trim());
    }
}
于 2013-04-01T06:32:05.197 に答える