У меня есть этот кусок кода
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element root = doc.createElement("list");
doc.appendChild(root);
for(CorrectionEntry correction : dictionary){
Element elem = doc.createElement("elem");
elem.setAttribute("from", correction.getEscapedFrom());
elem.setAttribute("to", correction.getEscapedTo());
root.appendChild(elem);
}
(затем следует запись документа в файл XML)
, где getEscapedFrom
и getEscapedTo
возвращаются (в моем коде) что-то вроде finké
, если исходное слово finké
. Чтобы выполнить экранирование Unicode для символов, которые больше 127.
Проблема в том, что в конечном XML есть следующая строка <elem from="finke" to="fink&#xE9;" />
(from
равно finke
, to
равно finké
) где бы я хотел, чтобы это было <elem from="finke" to="finké" />
Я пытался, следуя другому ответу в StackOverflow, отключить экранирование от амперсандов, помещая строку doc.appendChild(doc.createProcessingInstruction(StreamResult.PI_DISABLE_OUTPUT_ESCAPING, "&"));
после создания doc
, нобез успеха.
Как я мог "сказать XML", чтобы он не выходил из амперсандов?
Или, наоборот, как я мог позволить "XML" конвертировать из é
или \\u00E9
,до é
?
- ОБНОВЛЕНИЕ -
Хорошо, мне удалось прийти к проблеме: вплоть до записи файла в узел (через отладку), кажется, содержит правильную строку. Как только я звоню transformer.transform(domSource, streamResult);
, все становится диким.
DOMSource domSource = new DOMSource(doc);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StreamResult streamResult = new StreamResult(baos);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(domSource, streamResult);
System.out.println(baos.toString());
Так что, похоже, проблема в преобразователе.