2011-08-12 10 views
5

he estado tratando de analizar un documento a través de XHTMLTouchXML, pero siempre no puedo encontrar ninguna etiqueta a través de XPath query.¿Es incorrecta esta consulta de XPath al analizar XHTML? utilizando TouchXML

A continuación se muestra el 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> 

Así, podemos ver que hay una etiqueta "p", "una" etiqueta y la etiqueta "img"

Lo que yo se muestra entonces como el a continuación código:

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

Los resultados son

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

Por lo tanto, no hay ningún error en el análisis del documento XHTML y no hay error en el XPath query. Además, este documento tiene dos hijos debajo de la raíz (etiqueta "cuerpo" y etiqueta "cabeza"). Pero el problema es que no puede encontrar la etiqueta "img". He intentado reemplazar "img" con otros posibles nombres de etiqueta (como p, a, incluso cuerpo, cabeza), sin suerte.

¿Alguien me puede ayudar aquí?

P.S.

En realidad, el documento original es un HTML, he utilizado la clase CTidy en TouchXML lib para poner en orden el código HTML a XHTML primero. El XHTML anterior proviene de los resultados de CTidy.

También probé añadir algo de espacio de nombres a la consulta XPath, como este

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

Y cambiar la consulta XPath para

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

Todavía no hay suerte, no puede encontrar ningún resultado.

+0

Si carga el XHTML en el navegador Chrome y entrar en el XPath // img, la etiqueta img se encuentra.No hay nada de malo con su expresión XPath, ¿podría ser que su biblioteca no comprenda el // atajo? Pruebe usar/descenddant :: img y vea qué sucede en ese momento. – drew

+0

A raíz del comentario de @drew, intente utilizar un XPath absoluto para ver si su biblioteca puede seguir _any_ Xpath, por ejemplo. '/ html/body/p/img'. Luego prueba caminos que te acerquen, ej. '/ html // img' Como dijo que Xpath _is_ es válido, por lo que debería funcionar, y lo hace cuando se prueba en OxygenXML. –

Respuesta

0

probar este //img. Cuando usa // obtiene la etiqueta img, sin importar dónde se encuentre en la página.
Es mejor que //xhtml:img - porque a veces las etiquetas jerárquicas cambian un poco en el código detrás, por lo que es mejor ser global y no demasiado específica.

0

que tenía un problema similar una vez que podría ayudarle. Tenía un documento que analizaría y encontraría ciertos hitos y registraría sus XPaths. Luego, cargaba el documento en UIWebView y ejecutaba JavaScript para realizar acciones en los elementos que había marcado previamente. Problemáticamente, la estructura DOM era completamente diferente después de analizar el documento y todas mis XPaths no eran válidas. Un caso particular relacionado con tablas.

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

El simple HTML de arriba siempre se convertiría a algo como a continuación. (El espacio en blanco es únicamente para facilitar la lectura y voy de la memoria.)

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

Mi punto con esto es que el analizador puede tener elementos inyectado dentro de su estructura HTML.

Cuestiones relacionadas