hpple xpath问题

时间:2013-04-08 13:11:46

标签: ios xpath hpple

我正在使用hpple来解析HTML文档。我按照Ray Wenderlich的教程,让一切工作正常,因为他们的示例文件。但是,我需要更改它以便为我的朋友博客阅读某个HTML文件。该文件比我到目前为止使用的示例更复杂。该文件的相关部分(已在gist上传完整版):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<!-- snip -->
<div id="content" class="hfeed">
            <div class="post-21443 post type-post status-publish format-standard hentry category-about-catherine">

      <div class="postdate">
      Apr          <br />
      6            <br />
      2013         
      </div>
    <h2 class="entry-title"><a href="http://catherinepooler.com/2013/04/stampnation-live-retreat-updates/" title="StampNation LIVE Retreat Updates" rel="bookmark">StampNation LIVE Retreat Updates</a></h2>

    <div class="post-info"></div>       <div class="entry-content">
        <p><a href="http://catherinepooler.com/wp-content/uploads/2013/04/IMG_0560.jpg" ><img class="aligncenter size-large wp-image-21444" alt="StampNation LIVE" src="http://catherinepooler.com/wp-content/uploads/2013/04/IMG_0560-450x337.jpg" width="450" height="337" /></a></p> <p>StampNation LIVE is in full swing!  We are having a wonderful time.  I am taking a quick break from stamping and chatting to share a few photos with you.</p> <p>I think my favorite thing in getting ready for the retreat was setting up the Accessory Bar.  Each attendee received a small galvanized bucket with their fully glittered initial on it to fill up at the bar.  Awesome!</p>
<!-- snip -->

文件中有以下几个部分,我需要放置所有

<h2 class = "entry-title"> 
数组中的

(title =“StampNation LIVE Retreat Updates”)。我已成功放置了

<div class = "entry-content"> 

使用XPathQuery //div[@class = 'entry-content']/p进入数组。但是,由于空数组没有代码崩溃,我似乎无法获得标题。显然我的XPathQuery是不正确的。这是我试过的。

//h2[@class = 'entry-title']  (: this crashed :)

//div[@class = 'post-21443.....']//h2[@class = 'entry-title']  (: this crashed too.   ")

除了一系列其他尝试之外!

有人对我有任何建议吗?我查看了许多SO答案,以及与hpple一起提供的示例,但我无法将它拼凑在一起。

更新:使用Jens帮助我将查询更改为
     NSString * postsXpathQueryString = @“// h2 [@class ='entry-title'] / a”;

这让我得到一个数组,但我现在也得到了这个错误。

2013-04-08 10:26:30.604 HTML [12408:11303] *由于未捕获的异常'NSRangeException'而终止应用,原因:'* - [__ NSArrayM objectAtIndex:]:index 4超越界限[0 .. 3]' * 第一次抛出调用堆栈: (0x210a012 0x1203e7e 0x20ac0b4 0x3852 0x2028fb 0x2029cf 0x1eb1bb 0x1fbb4b 0x1982dd 0x12176b0 0x2706fc0 0x26fb33c 0x2706eaf 0x2372bd 0x17fb56 0x17e66f 0x17e589 0x17d7e4 0x17d61e 0x17e3d9 0x1812d2 0x22b99c 0x178574 0x17876f 0x178905 0x9733ab6 0x181917 0x14596c 0x14694b 0x157cb5 0x158beb 0x14a698 0x2065df9 0x2065ad0 0x207fbf5 0x207f962 0x20b0bb6 0x20aff44 0x20afe1b 0x14617a 0x147ffc 0x1d2d 0x1c55) libc ++ abi.dylib:terminate调用抛出异常

更新2

通过在reloadData时放入if语句,修正了超出边界的错误索引。我在我的NSLog中得到一个数组,但它没有把它放在我的表视图中。表视图空出来!!但没有更多的崩溃!

最终更新

它现在正在工作,Jens帮助我查询正确,然后我只需要填写表格视图。我已经将数组计数设置为20,因为Ray的tut有很多条目。我的朋友博客,只有四个!感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题:

您的文档包含名称空间:

<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">

解决方案:

我不熟悉hpple和ObjectiveC,所以我无法验证我在this hpple github issue上调整过的代码,但它看起来很合理。我想你要做的就是将第一个参数改为你的xpath上下文变量。

xmlXPathRegisterNs(xpathCtx, [@"xhtml" cString],[@"http://www.w3.org/1999/xhtml" cString]); 

然后,每次访问元素时都为此命名空间添加前缀:

//xhtml:h2[@class = 'entry-title']

如果您不想使用名称空间(并且不需要因为有不同名称),您可以添加通配符名称空间:

//*:h2[@class = 'entry-title']