2014-10-06 4 views
0

Я работаю над проектом 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?

+0

Если я понимаю ваш вопрос, вы хотите пройти через каждый элемент вашего html. Я думаю, вы должны пересмотреть подход Jsoup. Используйте метод [getAllElements()] (http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#getAllElements()), чтобы получить список ваших элементов, а затем использовать для каждого цикла для итерации 'Elements' – Grice

+0

Это не работает, слишком много вложенных тегов (DIV) и встроенных тегов (P, span, b, ui) и не обрабатывает теги форматирования. – Pigasus

+0

@Pigasus Любая другая альтернатива будет иметь ту же проблему, которую вы описываете в своем вопросе. У вас нет другого выбора, кроме как найти все текстовые узлы. (э, я думаю, вы могли бы использовать regexp, но regexp на html ужасно.) –

ответ

0

У меня были больше всего повезло с этим

StringBuilder sb = new StringBuilder(); 
sb.append("<?xml version=\"1.0\" enconding=\"UTF-8\"?><!DOCTYPE html>"); 

Document doc = Jsoup.parse(txt.getResult()); 

Element elements = doc.getAllElements(); 
for (Element e : elements) { 
    if (!(e.tagName().equalsIgnoreCase("#root"))) { 
    sb.append("<" + e.tagName() + e.attributes() + ">" + e.ownText() + "\n"); 
    }// end if 
}// end for 
return sb; 

одной корягу я до сих пор получаю вложенности не всегда «отремонтировали» правильно, но все еще полу близко. Я больше работаю над этим.