2011-08-12 41 views
5

我一直试图通过TouchXML解析XHTML文档,但它始终无法通过XPath query找到任何标签。解析XHTML的XPath查询是否有错误?使用TouchXML

下面是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/[email protected]/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”标签“”标签和“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”,根本没有运气。

有人可以帮我吗?

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]; 

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

+0

如果您将xhtml加载到Chrome浏览器并输入// img xpath,则会找到img标记。XPath expresion没有问题 - 它可能是因为你的库不理解//快捷方式吗?尝试使用/ descendant :: img,然后看看会发生什么。 – drew

+0

根据@drew的评论,尝试使用绝对XPath来查看您的库是否可以遵循_any_ Xpath,例如。 '/ HTML /体/ P/img'。然后尝试让你更接近的路径,例如。 '/ html // img'正如他所说的Xpath _is_有效,所以它应该可以工作,并且在OxygenXML中进行测试。 – 2013-05-16 01:45:55

回答

0

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

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结构。