Jaxb выдает неправильный характер

1

Я использовал для сортировки своих моделей, вызывая там toXml():

@XmlRootElement
public class MyModel {

    private String body;

    public String getBody() {
        return this.body;
    }

    public void setBody(final String _body) {
        this.body = _body;
    }

    public String toXML() throws JAXBException {
        final JAXBContext context = JAXBContext.newInstance(MyModel.class);
        final Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        final StringWriter writer = new StringWriter();
        marshaller.marshal(this, writer);
        return writer.toString();
    }
}

Если я пишу это в файл или через поток в webdav-target, это приводит к недопустимому xml при использовании ie ä в качестве значения text.

final MyModel m = new MyModel();
m.setBody("\u00E4");

final FileWriter w = new FileWriter("D:\\outtest.xml");
w.write(m.toXML());
w.close();

XMl что-то вроде этого (выглядит другим в npp и там корректно, при переключении на ansi):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myModel><body>伯</body></myModel>

Мне нужен намек, чтобы решить это!


Хорошо, это работает как должно (спасибо!):

final MyModel m = new MyModel();
m.setBody("\u00E4");
final FileOutputStream s = new FileOutputStream("D:\\outtest.xml");
final OutputStreamWriter osw = new OutputStreamWriter(s, Charset.forName("UTF-8"));
osw.write(m.toXML());
osw.close();

Моя проблема в том, что это тестирование файлов было упрощенной версией ;-)
Я вызываю toXml() и записываю эту строку в JPA-moodel. Позже это должно быть записано в webdav с использованием класса framework, который принимает вход ByteArrayInputStream. Поэтому я использую этот код:

final ByteArrayInputStream stream = new ByteArrayInputStream(jpaModel.getXmlString().getBytes());

... и, написав это, я, наконец, понял. Использование "более подробных" getBytes(Charset.forName("UTF-8")) помогает мне! благодаря

  • 0
    Что именно вы подразумеваете под «недопустимым XML»? Каков результат и каким образом он недействителен? Возможно, вы позже закодируете результат, используя что-то кроме UTF-8? (Это, безусловно, будет проблемой.)
  • 0
    XML записывается в файл, и когда я открываю его в браузере или в notepad ++, он отображается как «недействительный». Есть xE4 где должен быть ä .
Показать ещё 3 комментария
Теги:
jaxb
utf-8

1 ответ

1
Лучший ответ

Хорошо, теперь мы знаем, как вы пишете файл, вот в чем проблема:

FileWriter w = new FileWriter("D:\\outtest.xml");

Это всегда будет использовать кодировку по умолчанию для платформы - даже если вы сказали JAXB, что собираетесь использовать UTF-8. Это немного похоже на создание данных для JPEG, но затем сохранение его как файла .png. Используйте FileOutputStream завернутый в OutputStreamWriter используя UTF-8, и все должно быть хорошо.

Если вы используете Java 7, вы можете упростить это:

try (Writer writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
    writer.write(m.toXML());
}

В качестве альтернативы вам может понадобиться изменить метод toXML чтобы принять OutputStream для записи данных вместо того, чтобы возвращать строку.

  • 0
    Я добавил свою вторую проблему, но решил ее. Платформа-дефолт мне помогла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню