0

当谈到 Windows Phone 8 开发时,我相当陌生,我一直在玩弄一些东西作为我正在开发的应用程序的一部分。

现在我正在尝试从诸如 RuneScape 07 高分之类的网站解析信息 - http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=zezima

我正在使用 HTML Agility Pack,并且能够解析一些数据(直到 Woodcutting),但是通过的任何内容都没有出现?(这取决于我的 ListBox 的大小吗?)

理想情况下,我希望能够单独解析表信息,而不是像这样在一个块中解析:

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。

你真的不能这样做,因为这些工具给出的 XPATH 对应于内存中的 HTML DOM,而 Html Agility Pack 只知道服务器发回的原始 HTML。

您需要做的是查看发回的内容(或者只是查看源代码)。例如,您会看到没有 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 回答