Я использовал для сортировки своих моделей, вызывая там 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"))
помогает мне! благодаря
Хорошо, теперь мы знаем, как вы пишете файл, вот в чем проблема:
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
для записи данных вместо того, чтобы возвращать строку.
xE4
где должен бытьä
.