2011-08-12 9 views
5

Próbowałem parsować dokument XHTML przez TouchXML, ale zawsze nie można znaleźć żadnych tagów za pomocą XPath query.Czy to zapytanie XPath podczas analizowania XHTML jest nieprawidłowe? przy użyciu TouchXML

Poniżej znajduje się 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> 

Więc widzimy, istnieje "p" tag "" znacznika i "img" znacznik

co robiłem wtedy jest pokazany jako Kod poniżej:

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

wyniki są

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

Tak więc, nie ma żadnego błędu podczas analizowania dokumentu XHTML i braku błędu dla XPath query. Również ten dokument ma dwoje dzieci pod nazwą root (tag "body" i tag "head"). Problem polega jednak na tym, że nie można znaleźć znacznika "img". Próbowałem zastąpić "img" innymi możliwymi nazwami znaczników (takimi jak p, a, nawet ciało, głowa), bez żadnego szczęścia.

Czy ktoś może mi w tym pomóc?

P.S.

Właściwie oryginalny dokument to HTML, użyłem klasy CTidy w bibliotece TouchXML, aby najpierw uporządkować kod HTML na XHTML. Powyższy XHTML pochodzi z tych wyników CTidy.

Próbowałem też dodać coś przestrzeni nazw do kwerendy XPath, jak to

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

i zmienić zapytanie XPath do

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

nadal nie ma szczęścia, nie można znaleźć żadnych wyników.

+0

Po załadowaniu xhtml do przeglądarki Chrome i wprowadzeniu // img xpath, znajduje się znacznik img.Nie ma nic złego w wyrażeniu XPath - czy może być tak, że twoja biblioteka nie rozumie // skrótu? Spróbuj użyć/descendant :: img i zobacz, co się wtedy stanie. – drew

+0

Po komentarzu @drew spróbuj użyć bezwzględnego XPath, aby sprawdzić, czy twoja biblioteka może śledzić _any_ Xpath, np. '/ html/body/p/img'. Następnie spróbuj ścieżek, które Cię zbliżą, np. '/ html // img' Jak powiedział, Xpath _is_ valid, więc powinno działać, i sprawdza się w OxygenXML. –

Odpowiedz

0

Spróbuj tego //img. Podczas korzystania z // otrzymuje znacznik img, bez względu na to, gdzie znajduje się na stronie.
To jest lepsze niż //xhtml:img - ponieważ czasami tagi hierarchiczne zmieniają się nieco w kodzie, więc lepiej jest być globalnym i niezbyt konkretnym.

0

Miałem podobny problem, który mógł ci pomóc. Miałem dokument, który chciałbym przeanalizować i znaleźć pewne punkty orientacyjne i nagrać ich XPaths. Następnie wczytałbym dokument do UIWebView i uruchomiłam JavaScript, aby wykonać akcje na elementach, które wcześniej zaznaczyłem. Problem z tym, że struktura DOM była zupełnie inna po przeanalizowaniu dokumentu i wszystkie moje XPath były nieprawidłowe. Jeden szczególny przypadek związany z tabelami.

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

Prosty powyższy HTML zawsze zostanie przekonwertowany na coś jak poniżej. (Biała przestrzeń jest tylko do odczytu i jadę z pamięci.)

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

Chodzi mi o to, że parser może wstrzyknięcia elementy w strukturze HTML.

Powiązane problemy