将XML实体保留在输出中(jSoup)

时间:2013-10-29 11:05:05

标签: java html groovy escaping jsoup

我正在使用jsoup进行一些xml处理。问题是,它正在用html实体替换xml实体,即:»»

我怎样才能保留原始(xml)实体?

Groovy脚本:

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Entities
import org.jsoup.parser.Parser

String HTML_STRING = '''
    <html>
    <div></div>
    <div>Some text &#187;</div>
    </html>
  '''

Document doc = Jsoup.parse(new ByteArrayInputStream(HTML_STRING.getBytes("UTF-8")), "UTF-8", "", Parser.xmlParser())
doc.outputSettings().charset("UTF-8")
doc.outputSettings().escapeMode(Entities.EscapeMode.base)


println doc.toString()

结果:

<html> 
 <div></div> 
 <div>
  Some text &raquo;
 </div> 
</html>

如果我使用 Entities.EscapeMode.xhtml ,结果为:

<html> 
 <div></div> 
 <div>
  Some text »
 </div> 
</html>

感谢。

1 个答案:

答案 0 :(得分:0)

您希望使用EscapeMode.xhtml的组合(如果使用XML解析器,则为默认值,而不是HTML解析器)和ascii作为输出字符集。

默认输出字符集是UTF-8,如果输出字符集直接支持字符,jsoup将优先不使用实体转义(因为为什么浪费CPU和带有不必要的转义)。

如果您使用Document.OutputSettings.charset("ascii")将输出字符集更改为ascii,您将获得所需的输出。

如果您正在使用HTML,您可能还希望将输出语法设置为XML,否则HTML解析器将尝试使输出确认为HTML并且可以使您的XML DOM树变得简单。

(来源:jsoup的作者)