我正在处理HTML页面突出显示器项目,但当搜索字词是HTML标记元数据或类/ ID名称的名称时遇到问题;例如,如果搜索词是“媒体或类或内容”,那么我的查找和替换将执行此操作:
<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 :(得分: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;
我仍然得到的一个障碍是嵌套并不总是正确地“修复”但仍然是半封闭的。我在这方面做得更多。