Это неправильный запрос XPath при разборе XHTML? используя TouchXML

Я пытался разобрать 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, even body, head), безуспешно.

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

P.S.

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

По-прежнему не повезло, не могу найти никаких результатов.


person Jackson Tale    schedule 12.08.2011    source источник
comment
Если вы загрузите xhtml в браузер Chrome и введете // img xpath, тег img будет найден. Нет ничего плохого в вашем выражении XPath - может быть, ваша библиотека не понимает ярлык //? Попробуйте использовать / Потомку :: img и посмотрите, что будет дальше.   -  person drew    schedule 08.10.2012
comment
Следуя комментарию @drew, попробуйте использовать абсолютный XPath, чтобы узнать, может ли ваша библиотека следовать любому Xpath, например. /html/body/p/img. Затем попробуйте пути, которые вам ближе, например. /html//img Как он сказал, Xpath является действительным, поэтому он должен работать и работает при тестировании в OxygenXML.   -  person    schedule 16.05.2013


Ответы (2)


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

person Chani Poz    schedule 04.02.2014

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

person Holly    schedule 20.10.2013