Является ли этот запрос XPath при разборе XHTML неправильным?используя TouchXML - PullRequest
5 голосов
/ 12 августа 2011

Я пытался проанализировать 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".Я пытался заменить «img» другими возможными именами тегов (такими как p, a, даже body, head), но безуспешно.

Может ли кто-нибудь помочь мне здесь?

PS

На самом деле исходный документ представляет собой HTML, я использовал класс CTidy в библиотеке TouchXML, чтобы сначала привести 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];

Все еще не повезло, не могу найти никаких результатов.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2014

Попробуйте это //img. Когда вы используете //, он получает тег img, независимо от того, где он находится на странице.
Это лучше, чем //xhtml:img - потому что иногда иерархические теги немного изменяются в коде, поэтому лучше быть глобальным, а не слишком конкретным.

0 голосов
/ 20 октября 2013

Однажды у меня была похожая проблема, которая могла бы вам помочь.У меня был документ, который я бы проанализировал, нашел определенные ориентиры и записал их 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-структуру.

...