2009-09-06 108 views
0

我正在构建XML文档并使用JVM内置库打印出缩进格式。当有一个包含换行符的文档中的文本节点,它包装线到线,而不是它的开始真实正确的缩进位置Java:XML转换,文本节点中的换行符打破缩进

示例代码

ByteArrayOutputStream s; 

s = new ByteArrayOutputStream(); 

Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
Transformer t = TransformerFactory.newInstance().newTransformer(); 

Element a; 
Text b; 

a = d.createElement("a"); 

String text = "multi\nline\ntext"; 
b = d.createTextNode(text); 

a.appendChild(b); 
d.appendChild(a); 

t.setOutputProperty(OutputKeys.INDENT,"yes"); 
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
t.transform(new DOMSource(d), new StreamResult(s)); 

System.out.println(new String(s.toByteArray())); 

输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<a>multi 
line 
text</a> 

所需的输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<a> 
multi 
line 
text 
</a> 

有使每个新行一个聪明的办法从缩进的xml标签开始的地方开始?有些东西告诉我textnode不适合使用?有什么更好的吗?

回答

2

请注意,更改缩进实际上会更改该节点的文本内容。即

<a> 
multi 
line 
text 
</a> 

将导致文本中的多个前导空格被XML apis读取。那是你要的吗 ?我知道这不是你的问题的答案,但我不确定你是否真的想要维持缩进。你将如何处理文本节点向下缩进XML结构(即有更多的前导空格)?

+0

你是对的,我可能需要使用类似cdata这样的 – Mike 2009-09-06 09:04:50

+0

或使用 编码,允许它被放在一行。无论如何,你的textnode不能很好地打印而不改变内容。 – 2009-09-06 10:21:53