2011-08-12 4 views
5

TouchXMLXHTMLのドキュメントを解析しようとしていますが、常に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) 
であります210

したがって、XHTMLのドキュメントを解析する際にエラーは全くなく、XPath queryのエラーはありません。また、このドキュメントにはルート( "body"タグと "head"タグ)の下に2つの子があります。しかし、問題はそれが "img"タグを見つけることができないということです。私は "img"を他の可能なタグ名(p、a、even body、headなど)に置き換えようとしました。運が全くありません。

誰かが私を助けることができますか?

P.S.

実際に元のドキュメントはHTMLですが、TouchXMLライブラリのCTidyクラスを使用してHTMLをXHTMLに整理しています。上記のXHTMLは、そのCTidyの結果から来たものです。

また、私はこの

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

にXPathクエリを変更しようとしましたまだ運は、任意の結果を見つけることができません。

+0

xhtmlをクロムブラウザにロードして// img xpathを入力すると、imgタグが配置されます。あなたのXPathの表現に間違いはありません - あなたのライブラリが//ショートカットを理解できないかもしれませんか?/descendant :: imgを使用して、何が起こるかを見てください。 – drew

+0

@drewのコメントの後に、あなたのライブラリが_any_Xpathに従うことができるかどうかを確認するために、絶対XPathを使ってみてください。 '/ html/body/p/img'となります。次に、あなたを近づけるパスを試してください。 '/ html // img' Xpathは有効であると言っていたので、それはうまくいくはずです。また、OxygenXMLでテストしたときに動作します。 –

答えて

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構造に要素を注入している可能性があることです。

関連する問題