使用jsoup解析HTML并保留原始内容

问题描述:

我想替换HTML文件中的某些元素,并保持所有其他内容不变。使用jsoup解析HTML并保留原始内容

Document doc = Jsoup.parse("<div id=title>Old</div >\n" + 
     "<p>1<p>2\n" + 
     "<table><tr><td>1</td></tr></table>"); 
doc.getElementById("title").text("New"); 
System.out.println(doc.toString()); 

我期望有以下的输出:

<div id=title>New</span></div > 
<p>1<p>2 
<table><tr><td>1</td></tr></table> 

相反,我有:

<html> 
<head></head> 
<body> 
    <div id="title">New</div> 
    <p>1</p> 
    <p>2 </p> 
    <table> 
    <tbody> 
    <tr> 
    <td>1</td> 
    </tr> 
    </tbody> 
    </table> 
</body> 
</html> 

Jsoup补充说:

  1. 关闭p标签
  2. DOUB LE-引号的属性值
  3. TBODY
  4. HTML,头部和身体的元素

我可以连载修改HTML回原来的? Jericho这样做,但它并不像Jsoup那样提供精巧的DOM操作方法。

+2

你可以做,如果JSoup会给你的元素的字符偏移量。请参阅http://stackoverflow.com/questions/11387458/get-character-offsets-for-elements-in-jsoup。我们需要这个功能。不幸的是,JSoup的作者不再回复发布到jsoup google小组的问题。 – ccleve

是否有理由不引用属性值?见herehere

对于其他点试试这个:

final String html = "<div id=title>Old</div >\n" 
      + "<p>1<p>2\n" 
      + "<table><tr><td>1</td></tr></table>"; 

Document doc = Jsoup.parse(html); 
doc.select("[id=title]").first().text("New"); 
doc.select("body, head, html, tbody").unwrap(); 
doc.outputSettings().prettyPrint(false); 

System.out.println(doc);