这个解析XHTML的XPath查询是错误的吗?使用TouchXML

时间:2011-08-12 10:14:33

标签: iphone parsing xhtml xpath touchxml

我一直试图通过XHTML解析TouchXML个文档,但始终无法通过XPath query找到任何标记。

以下是XHTML:

XHTML <!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">
   <head>
      <meta name="generator" content=
         "HTML Tidy for Mac OS X (vers 25 March 2009), see www.w3.org" />
      <title></title>
      </head>
   <body>
      <p>
          <a href="http://www.flickr.com/photos/55397648@N00/5987335786/"
             title="casavermeer5.jpg by the style files, on Flickr">
          <img src="http://farm7.static.flickr.com/6127/5987335786_abec990554_o.jpg"
               width="500" height="750" border="0" alt="casavermeer5.jpg" />
          </a>
      </p>
   </body>
</html>

所以,我们可以看到有一个“p”标签,“a”标签和“img”标签

我所做的事情如下所示:

CXHTMLDocument *doc = [[[CXHTMLDocument alloc] initWithXHTMLString:XHTML options:0 error:&error] autorelease];
NSLog(@"error %@", [error localizedDescription]);
NSLog(@"doc children count = %d", [doc childCount]);
NSArray *imgNodeArray = [doc nodesForXPath:@"//img" error:&error];
NSLog(@"imgNodeArray = %d", [imgNodeArray count]);
NSLog(@"error %@", [error localizedDescription]);

结果

error (null)
doc children count = 2
imgNodeArray = 0
error (null)

因此,在解析XHTML doc时没有任何错误,XPath query没有错误。此doc也在根目录下有两个孩子(“body”标签和“head”标签)。但问题是它无法找到“img”标签。我试图将“img”替换为其他可能的标签名称(例如p,a,甚至是正文,头部),根本没有运气。

有人可以帮助我吗?

P.S。

实际上原始文档是HTML,我在TouchXML lib中使用CTidy类来首先将HTML整理到XHTML。上面的XHTML来自CTidy结果。

我还尝试在XPath查询中添加命名空间,比如

NSMutableDictionary *namespaceDict = [NSMutableDictionary dictionary];
[namespaceDict setValue:@"http://www.w3.org/1999/xhtml" forKey:@"xhtml"];

将XPath查询更改为

NSArray *imgNodeArray = [doc nodesForXPath:@"//xhtml:img" namespaceMappings:namespaceDict error:&error];

仍然没有运气,找不到任何结果。

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题曾经可以帮助你。我有一份文件,我会解析并找到某些地标并记录他们的XPath。然后,我将文档加载到UIWebView中并运行JavaScript以对我之前标记的元素执行操作。问题是,在解析文档并且我的所有XPath都无效之后,DOM结构完全不同。一个特殊情况与表有关。

<table>
    <tr>
        <td>Cell</td>
    </tr>
</table>

上面的简单HTML将始终转换为如下所示。 (白色空间仅用于提高可读性,我将从记忆中恢复过来。)

<table>
    <thead></thead>
    <tbody>
        <tr>
            <td>Cell</td>
        </tr>
    </tbody>
</table>

我的观点是你的解析器可能已经在你的HTML结构中注入了元素。

答案 1 :(得分:0)

试试这个//img。 当您使用//时,无论页面中的位置如何,都会获得img标记。
它优于//xhtml:img - 因为有时候后面的代码中的分层标签会稍微改变,所以最好是全局的,而不是太具体。