2012-09-26 3 views
0

Я создал 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? Что-то не так с моим кодом? Спасибо

ответ

1

Решено! Потому что какая-то ошибка с dom4j, element.setText() бы не заботиться о указанной кодировке и document.asXML() возвратит строку ISO, так что я изменил эту строку следующим образом:

response.getOutputStream().write(document.asXML().getBytes("UTF-8")); 

И все работало нормально ..

+1

Ну, setText() не проблема. Проблема в том, что сериализация документа в XML несовместима. Doxument # asXML() не должен быть «правильным» способом сделать это. Однако в документации это не упоминается - DOM4J в двух словах. Там слишком много веревки, чтобы не повеситься. Вместо этого вы должны использовать XMLWriter. –

 Смежные вопросы

  • Нет связанных вопросов^_^