如何在Java-XML中禁用/避免Ampersand-Escaping?

时间:2011-09-19 10:01:08

标签: java xml dom escaping ampersand

我想创建一个XML,其中空格被 替换。但是Java-Transformer逃脱了Ampersand,因此输出为 

以下是我的示例代码:

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 个答案:

答案 0 :(得分:5)

将文本内容直接设置为您想要的字符,如有必要,序列化程序将为您转义:

element.setTextContent("\u00A0");

答案 1 :(得分:5)

解决方案非常有趣:

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 )

所以基本上你需要把你的代码放在转义元素之间。

答案 2 :(得分:0)

尝试使用

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

而不是

element.setTextContent(...);

你会在你的xml中得到这个: 如果我理解你正在尝试做什么,它可能会有效。

答案 3 :(得分:0)

作为对四十二个答案的补充:

如果像我一样,你在非修补的 Eclipse IDE中尝试代码,你可能会看到一些奇怪的A出现而不是不间断的空间。这是因为Eclipse中控制台的编码与Unicode(UTF-8)不匹配。

-Dfile.encoding=UTF-8添加到eclipse.ini应解决此问题。

干杯, 维姆