2011-09-19 495 views
3

我想创建一个空白替换为 的XML。但是Java的变压器转义&符号,从而使输出 如何在Java-XML中禁用/避免&符号转义?

这里是我的示例代码:

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> 

任何想要解决或避免这种情况?非常感谢!

+0

我想知道为什么你想要替换空白。你想解释一下吗? – Wivani

+0

据我所知,他想要一个不破坏的空白(究竟是0xA0)而不是一个普通的空白 –

+0

我创建的xml是一个xsl-fo-xml,其中我需要块元素的空白。所以空白对我来说是必要的,因为apache-fop似乎忽略了领先空白。我得到了其他地方的建议,用这个实体取代空白。安德烈是对的。 – oleh

回答

5

文本内容直接设置为你想要的字符,并在必要的序列化器将逃脱它为您:

element.setTextContent("\u00A0"); 
+0

谢谢,这对我有效。非常简单的解决方案:-) – oleh

+0

这种方式没有转义,因为0xA0不是xml的特殊字符。所以它可能不是什么想要的。 –

+0

好吧,我接受了答案,因为它为我工作。虽然你是对的,但这不是我真正想要的答案。 – oleh

0

尝试使用

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

,而不是

element.setTextContent(...); 

你会得到这个在你的XML: 它可能工作,如果我正确理解你的东西正在努力去做。

+0

我试过你的建议,它不适合我。生成的字符数据“<![CDATA []]使我在后面的代码中遇到了一些麻烦,我会在稍后处理这个问题。 – oleh

+0

经过一番尝试,这种方式的结果与简单的文本节点相同。文本' '被当作分隔字符而不是一个实体来处理。所以进一步的处理会导致'$ amp;#160;'。 – oleh

0

至于附加到42的回答是:

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

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

干杯, 维姆

0

的解决方案是非常可笑:

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) 

所以基本上你需要把逃逸元素之间的代码。

相关问题