Отключить автоматический амперсанд и экранирование в XML или, наоборот, как мне написать Unicode как ሴ? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть этот кусок кода

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&amp;#xE9;" /> (from равно finke, to равно finké) где бы я хотел, чтобы это было <elem from="finke" to="fink&#xE9;" />

Я пытался, следуя другому ответу в StackOverflow, отключить экранирование от амперсандов, помещая строку doc.appendChild(doc.createProcessingInstruction(StreamResult.PI_DISABLE_OUTPUT_ESCAPING, "&")); после создания doc, нобез успеха.

Как я мог "сказать XML", чтобы он не выходил из амперсандов?

Или, наоборот, как я мог позволить "XML" конвертировать из é или \\u00E9,до &#xE9;?

- ОБНОВЛЕНИЕ -

Хорошо, мне удалось прийти к проблеме: вплоть до записи файла в узел (через отладку), кажется, содержит правильную строку. Как только я звоню 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());

Так что, похоже, проблема в преобразователе.

1 Ответ

1 голос
/ 25 октября 2019

Попробуйте установить setOutputProperty("encoding", "us-ascii") на трансформаторе. Это говорит сериализатору производить вывод, используя только символы ASCII, что означает, что любой не-ASCII символ будет экранирован. Но вы не можете контролировать, будет ли это десятичное или шестнадцатеричное экранирование (если вы не используете Saxon-PE или выше в качестве вашего Transformer, в этом случае есть опция сериализации для управления этим).

Это никогдаХорошая идея, чтобы попытаться сделать сериализацию "от руки". По крайней мере по трем причинам: (а) вы поймете неправильно (мы видим много вопросов SO, вызванных людьми, производящими плохой XML таким образом), (б) вы должны работать с инструментами, а не против них, (с) люди, написавшие сериализаторы, понимают XML лучше, чем вы, и они знают, что от них ожидается. Вы, вероятно, работаете с требованиями, написанными кем-то, чье понимание XML очень поверхностно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...