2013-03-31 43 views
0

当谈到Windows Phone 8开发时,我相当新颖,而且我一直在做一些事情,作为我正在开发的应用程序的一部分。HTML解析单个表/不是所有数据都被解析?

现在我试图解析从网站的信息,如RUNESCAPE 07高分 - http://services.runescape.com/m=hiscore_oldschool/hiscorepersonal.ws?user1=zezima

我使用的HTML敏捷性包,我能够解析一些数据(下降到木刻),但通过的东西不会出现? (那是到我的列表框的大小?)

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

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。

这是可能的还是我在做一些特别错误的事情?

+0

是它导致这就是空或属性的innerText? –

+0

当试图访问特定点时,它的结果为空,结果为null。 – Optimistic

+0

如果将它分解一点,当你得到一个非空的结果时,随时删除每个子查询? –

回答

0

您可能依靠诸如FireBug或Chrome等开发工具来确定您之后的节点的XPATH。

你可以这样做,因为这些工具提供的XPATH对应于内存HTML DOM,而Html Agility Pack只知道服务器发回的原始HTML。

你需要做的是查看发回的内容(或者只是查看源代码)。例如,你会看到没有TBODY元素。所以你想找到任何判别式,例如使用XPATH axes

这里,似乎工作代码:

// 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()); 
    } 
} 
+0

谢谢!这对我非常有帮助,现在我有了更多的理解! :) 冒着愚蠢的风险最后一件事 - 如果我要实现,我得到一个 '无法分配void关于var item = lbox.x.x的隐式类型局部变量错误。 这是否与我的'void DownLoadCompleted'回调,或其他原因?我的课程还没有真正涵盖vars,所以我可能领先于我自己。 :) @SimonMourier – Optimistic

+0

@乐观 - 哦,这只是为了示例的目的。此代码可以在Windorms窗体上工作(并添加一个项目+一堆子项目),但在您的平台上,这意味着Add不会返回任何内容。 –