Я работаю над проектом highlighter HTML-страницы, но столкнулся с проблемами, когда поисковый запрос - это имя метаданных HTML-тегов или имя класса/идентификатора; например, если условия поиска «средства массовой информации или класс или содержание», то моя находка и заменить бы сделать это:Loop Through HTML Elements and Nodes
<link href="/css/DocHighlighter.css" <span style='background-color:yellow;font-weight:bold;'>media</span>="all" rel="stylesheet" type="text/css">
<div <span style='background-color:yellow;font-weight:bold;'>class</span>="container">
Я использую Lucene для выделения и мой текущий код (вроде):
InputStreamReader xmlReader = new INputStreamReader(xmlConn.getInputStream(), "UTF-8");
if (searchTerms!=null && searchTerms!="") {
QueryScorer qryScore = new QueryScorer(qp.parse(searchTerms));
Highlighter hl = new Highlighter(new SimpleHTMLFormatter(hlStart, hlEnd), qryScore);
}
if (xmlReader!=null) {
BufferedReader br = new BufferedReader(xmlReader);
String inputLine;
while((inputLine = br.readLine())!=null) {
String tmp = inputLine.trim();
StringReader strReader = new stringReader(tmp);
HTMLStripCharFilter htm = HTMLStripCharFilter(strReader.markSupported() ? strReader : new BufferedReader(strReader));
String tHL = hl.getBestFragment(analyzer, "", htm);
tmp = (tHL==null ? tmp : tHL);
}
xmlDoc+=tmp;
}
bufferedReader.close()
Как вы можете видеть (если вы понимаете выделение Lucene), это делает неизбирательную находку/замену. Поскольку мой документ будет HTML, а условия поиска продиктованы пользователями, мне нет возможности анализировать определенные элементы или теги. Кроме того, поскольку find/replace в основном петли и добавляет HTML в строку (возвращаемый тип метода), я должен хранить все теги и значения HTML на месте и в порядке. Я пробовал использовать Jsoup для прокрутки страницы, но обрабатывает HTML-тег как один большой результат. Я также попробовал суп с тегами, чтобы удалить сломанный HTML, вызванный проблемой, но он работает неправильно. Кто-нибудь знает, как в основном зацикливать элементы и узел (значение данных) html?
Если я понимаю ваш вопрос, вы хотите пройти через каждый элемент вашего html. Я думаю, вы должны пересмотреть подход Jsoup. Используйте метод [getAllElements()] (http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#getAllElements()), чтобы получить список ваших элементов, а затем использовать для каждого цикла для итерации 'Elements' – Grice
Это не работает, слишком много вложенных тегов (DIV) и встроенных тегов (P, span, b, ui) и не обрабатывает теги форматирования. – Pigasus
@Pigasus Любая другая альтернатива будет иметь ту же проблему, которую вы описываете в своем вопросе. У вас нет другого выбора, кроме как найти все текстовые узлы. (э, я думаю, вы могли бы использовать regexp, но regexp на html ужасно.) –