5

我一直在尝试通过 解析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文档时完全没有错误,对于XPath query. 此文档在根目录下还有两个孩子(“body”标签和“head”标签)。但问题是它找不到“img”标签。我试图用其他可能的标签名称(例如 p、a、甚至 body、head)替换“img”,但一点运气都没有。

有人可以在这里帮助我吗?

附言

实际上原始文档是 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];

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

4

2 回答 2

0

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

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

上面的简单 HTML 总是会转换为如下所示的内容。(空白只是为了便于阅读,我是从记忆中开始的。)

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

我的观点是您的解析器可能已将元素注入到您的 HTML 结构中。

于 2013-10-20T04:00:23.450 回答
0

试试这个//img。当您使用//它时img,无论它在页面中的哪个位置,都会获得标签。
它比//xhtml:img- 因为有时层次标签在后面的代码中会发生一些变化,所以最好是全局的,而不是太具体。

于 2014-02-04T09:45:03.417 回答