Я создал AbstractView
для вывода некоторых XML в браузер, как показано ниже:Неправильная кодировка в XML-элементе с помощью dom4j с Spring MVC
public abstract class AbstractXmlView extends AbstractView {
public AbstractXmlView() {
setContentType("application/xml");
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.setCharacterEncoding("UTF-8");
Document document = new DOMDocument();
document.setXMLEncoding("UTF-8");
buildXmlDocument(model, document, request, response);
response.getOutputStream().print(document.asXML());
}
public abstract void buildXmlDocument(Map<String, Object> model,
Document document, HttpServletRequest request,
HttpServletResponse response) throws Exception;
Как вы можете видеть, мои подклассы будут определять buildXMLDocument
метод для того, чтобы заселить XML-документ, который будет фактически доставлен в браузер, так вот упрощенная реализация:
public class GetXmlContacts extends AbstractXmlView {
@Override
public void buildXmlDocument(Map<String, Object> model, Document document,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Element node = document.addElement("node");
node.setText ("I'm unicode áéíóú");
}
Обратите внимание буквальную строки в виде текста в элементе node
«Я юникод AEIOU». Когда я запрашиваю это на сервере, я получаю HTTP-ответ с кодировкой UTF-8 (ОК), определение XML говорит, что это UTF-8, но текст узла будет закодирован как ISO-8859-1 (это мое предположение, потому что, когда я изменяю кодировку с Firefox, эта строка выглядит нормально).
Итак, почему dom4j соответствует буквенной строке как ISO, когда она определена, которая должна быть UTF-8? Что-то не так с моим кодом? Спасибо
Ну, setText() не проблема. Проблема в том, что сериализация документа в XML несовместима. Doxument # asXML() не должен быть «правильным» способом сделать это. Однако в документации это не упоминается - DOM4J в двух словах. Там слишком много веревки, чтобы не повеситься. Вместо этого вы должны использовать XMLWriter. –