如何使用jsoup解析xhtml而不更改Html或解析Html实体

时间:2016-08-26 12:23:44

标签: java html xhtml jsoup

我正在使用jsoup解析器来操作xhtml文件。 我的文件包含以下标记为I / P

<param name="video_title" value="&lt;p&gt;Renewable Energy&lt;/p&gt;" />
我使用对象html将此标记传递给jsoup解析器,如下面的

org.jsoup.nodes.Document blogContentDocument = Jsoup.parse(html, "", Parser.xmlParser());
org.jsoup.select.Elements all_elements = blogContentDocument.select("*");

在返回all_elements后,我的o / p就像

<param name="video_title" value="<p>Renewable Energy</p>" />

预期o / p:

<param name="video_title" value="&lt;p&gt;Renewable Energy&lt;/p&gt;" />

任何人都可以建议我如何防止jsoup解析器更改html编码。

1 个答案:

答案 0 :(得分:1)

根据jsoup版本,这将起作用:

Document document = ...;
document.outputSettings().charset(Charset.forName("ASCII")); //$NON-NLS-1$
System.out.println(document.body().html());

解决方案可能是降级到低于1.8.x的Jsoup版本。转义行为从1.7.x更改为1.8.x。

这是一个例子:

  • 1.7.3 <a href="#" title="Test&lt;br&gt;Test">Test<br />Test</a>
  • 1.8.1 <a href="#" title="Test<br>Test">Test<br>Test</a>

此处有关于此主题的更多信息:
jsoup: differnt result after updating from 1.7.3 to 1.8.1, how to avoid this?

另一个解决方案可能是,apache公共 StringEscapeUtils
解析后转义value并将转义后的值放回元素属性。

org.jsoup.select.Elements all_elements = blogContentDocument.select("*");
for (Element element : all_elements) {
    String escaped = StringEscapeUtils.escapeHtml(element.attr("value"));
    element.attr("value", escaped);
    System.out.println(element);
}

// check if the content is changed in the document
System.out.println(blogContentDocument.html());