XPath не может найти таблицу по идентификатору - PullRequest
0 голосов
/ 18 мая 2009

Я делаю некоторые скриншоты экрана с помощью WATIJ, но он не может читать таблицы HTML (выбрасывает NullPointerExceptions или UnknownObjectExceptions). Чтобы преодолеть это, я читаю HTML и запускаю его через JTidy, чтобы получить правильно сформированный XML.

Я хочу проанализировать его с помощью XPath, но он не может найти <table ...> на id, даже если таблица находится в XML-формате как день. Вот мой код:

XPathFactory factory=XPathFactory.newInstance();  
XPath xPath=factory.newXPath();  
InputSource inputSource = new InputSource(new StringReader(tidyHtml));  
XPathExpression xPathExpression=xPath.compile("//table[@id='searchResult']");  
String expression = "//table[@id='searchResult']";
String table = xPath.evaluate(expression, inputSource);
System.out.println("table = " + table);

Таблица является пустой строкой.

Однако таблица находится в XML. Если я печатаю строку tidyHtml, это показывает

 <table
   class="ApptableDisplayTag"
   id="searchResult"
   style="WIDTH: 99%">

Я раньше не использовал XPath, так что, может быть, я что-то упустил.

Кто-нибудь может меня поправить? Спасибо.

Ответы [ 7 ]

2 голосов
/ 01 сентября 2009

Я ничего не знаю о JTidy, но я для WATIJ. Я полагаю, что причина, по которой вы получаете исключения NullPointer и UnknownObject, заключается в том, что ваш XPATH использует узлы с нижним регистром. Допустим, вы используете "// table [@ id = 'searchResult']" в качестве xpath для поиска таблицы в WATIJ. Это на самом деле не сработает, потому что «таблица» в нижнем регистре. Для WATIJ вам нужно иметь все имена узлов в верхнем регистре, например: "// TABLE [@ id = 'searchResult']". Например, скажем, что вы хотите напечатать число строк в этой таблице с помощью WATIJ, вы должны сделать следующее:

import watij.runtime.ie.IE;
import static watij.finders.SymbolFactory.*;

public class Example {
    public static void main(String[] args) {
        IE ie = new IE();
        ie.start("your_url_goes_here");
        System.out.println(ie.table(xpath, "//TABLE[@id='searchResult']").rowCount());
        ie.close();
    }
}

Этот код или ответ могут быть неверными, так как я только начал использовать WATIJ сегодня. Хотя я столкнулся с той же самой проблемой с xpaths. Мне потребовалось несколько часов на поиск / тестирование, прежде чем я заметил, как все xpath-файлы были размещены на этой странице: Руководство пользователя WATIJ Как только я изменил регистр в своих xpath-файлах, WATIJ смог найти объекты, так что должен работать и для вас.

0 голосов
/ 06 апреля 2010

Атрибуты уникального идентификатора должны быть доступны с помощью метода id () id('search')

0 голосов
/ 10 ноября 2009

Двойные кавычки определенно не требуются, и ни в верхнем регистре. Пространства имен и / или DTD являются более вероятным ответом.

0 голосов
/ 01 сентября 2009

Решением было отказаться от WATIJ и переключиться на Google WebDriver. WebDriver документирует, как разные браузеры обрабатывают регистр в операторах xpath.

0 голосов
/ 19 мая 2009

Похоже, проблема в основном с JTidy. Я могу получить xpath для анализа результата JTidy-ied, выполнив следующее:

Удалить все "<& amp> nbsp;". JTidy возвращает xhtml с "<& amp> nbsp;" вне тегов. Удалить В теге удалите атрибут xmlns = ... Уберите теги "голова". (Я использую несколько забавное форматирование, потому что объекты HTML не будут отображаться при правильном наборе)

JTidy также помещает новые строки в середину текстового содержимого, если ... элементы.

Мне нужно посмотреть другие варианты преобразования HTML -> XML. Я быстро попробовал Cobra, но он также не смог найти мой стол по идентификатору. Я не пробовал вручную очищать результат от Cobra, поэтому я не знаю, как он сравнивается с JTidy.

Если вам известен HTML-парсер, который возвращает хороший XML, пожалуйста, дайте мне знать.

0 голосов
/ 18 мая 2009

у вас xPath верный ... что бы это ни было, это не так.

0 голосов
/ 18 мая 2009

Я никогда не использовал XPath API Java напрямую, я всегда использовал его через dom4j или в других языках (Perl и C). Но я хорошо понимаю, как это работает нормально. Сначала вам, вероятно, следует проанализировать ввод как документ DOM, это очень поможет. Также, если вы знаете, что у вашего документа есть идентификатор, вы должны проанализировать его с загрузкой DTD или схемы, которая описывает это таким образом, что анализатор XML будет отмечать и идентифицировать узлы, которые имеют надлежащие идентификаторы. Сделав это, вы можете использовать свой код с деревом DOM.

Документация к [XPath.evaluate (expression, item)] (http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/XPath.html#evaluate(java.lang.String,%20java.lang.Object) показывает, что вторым элементом должен быть Node или NodeList. Вероятно, поэтому у вас много UnknownObjectExceptions.

Если ваш синтаксический анализатор XML способен распознавать элементы идентификатора, вы можете получить доступ к элементу, имеющему идентификатор, со следующим выражением XPath:

XPathExpression xPathExpression=xPath.compile("id('searchResult')");
xPathExpression.evaluate(document); // document is a DOM document instance

Использование функции XPath id () является наиболее эффективным способом доступа к элементам, то есть когда элементы используют идентификатор и были объявлены таким образом в DTD или Схеме.

...