2009-09-06 71 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