Как отключить / избежать Ampersand-Escaping в Java-XML? - PullRequest
5 голосов
/ 19 сентября 2011

Я хочу создать XML, где пробелы заменяются на  . Но Java-Transformer экранирует амперсанд, так что на выходе получается  

Вот мой пример кода:

public class Test {

    public static void main(String[] args) {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.newDocument();

        Element element = document.createElement("element");
        element.setTextContent(" ");
        document.appendChild(element);

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        StreamResult streamResult = new StreamResult(stream);
        transformer.transform(new DOMSource(document), streamResult);
        System.out.println(stream.toString());

    }

}

И это вывод моего примера кода:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<element>&amp;#160;</element>

Любые идеи, чтобы исправить или избежать этого? Большое спасибо!

Ответы [ 4 ]

5 голосов
/ 11 января 2017

Решение очень смешное:

Node disableEscaping = document.createProcessingInstruction(StreamResult.PI_DISABLE_OUTPUT_ESCAPING, "&");
 Element element = document.createElement("element");
 element.setTextContent("&#160;");
 document.appendChild(disableEscaping );
 document.appendChild(element);
Node enableEscaping = document.createProcessingInstruction(StreamResult.PI_ENABLE_OUTPUT_ESCAPING, "&");
document.appendChild(enableEscaping )

Так что в основном вам нужно поместить свой код между экранирующим элементом.

5 голосов
/ 19 сентября 2011

Установите текстовое содержимое непосредственно на нужный вам символ, и сериализатор при необходимости его исключит:

element.setTextContent("\u00A0");
0 голосов
/ 19 сентября 2011

Как дополнение к ответу сорока двух:

Если, как и я, вы пробуете код в не исправленной Eclipse IDE, вы, скорее всего, увидите странную букву А вместо неразрывного пробела. Это связано с тем, что кодировка консоли в Eclipse не соответствует Unicode (UTF-8).

Добавление -Dfile.encoding=UTF-8 в eclipse.ini должно решить эту проблему.

Ура, Wim

0 голосов
/ 19 сентября 2011

Попробуйте использовать

element.appendChild (document.createCDATASection ("&#160;"));

вместо

element.setTextContent(...);

Вы получите это в своем XML: Это может сработать, если я правильно понимаю, что вы пытаетесь сделать.

...