2012-09-18 71 views
0

摘要:我想將一個org.w3c.dom.Document保存爲帶有很好縮進的文件(很漂亮地打印出來)。下面的代碼與Transformer可以在某些情況下完成這項工作,但不是在所有情況下(請參閱示例)。你能幫我解決這個問題嗎?將org.w3c.dom.Document中的XML美化爲文件

我有一個org.w3c.dom.Document(而不是org.jdom.Document),並希望自動格式化並打印到文件中。我怎樣才能做到這一點?我想這一點,但如果有在文檔中附加的換行不工作:

import java.io.ByteArrayInputStream; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 

public class Main { 
    public static void main(String[] args) { 
     try { 
      String input = "<asdf>\n\n<a>text</a></asdf>"; 
      Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(input.getBytes())); 

      System.out.println("-- input -------------------\n" + input + "\n----------------------------"); 
      System.out.println("-- output ------------------"); 
      prettify(doc); 
      System.out.println("----------------------------"); 

     } catch (Exception e) {} 
    } 

    public static void prettify(Document doc) { 
     try { 
      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
      transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
      transformer.transform(new DOMSource(doc), new StreamResult(System.out)); 
     } catch (Exception e) {} 
    } 
} 

我已指示輸出中,以System.out,這樣就可以不管你想要的(例如on Ideone.com)輕鬆地運行它。你可以看到,輸出是不是漂亮。如果我從輸入字符串中刪除\n\n,一切都很好。而且文檔通常不是來自字符串,而是來自文件,並在我想對其進行美化之前進行大量修改。

這個變壓器似乎是正確的方式,但我錯過了一些東西。你能告訴我,我做錯了什麼?

SSCCE輸出:

-- input ------------------- 
<asdf> 

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

<a>text</a> 
</asdf> 
---------------------------- 

預期輸出:

-- input ------------------- 
<asdf> 

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

回答

3

試試這個:

它需要org.apache.xml.serialize.XMLSerializerorg.apache.xml.serialize.OutputFormat;

OutputFormat format = new OutputFormat(document); //document is an instance of org.w3c.dom.Document 
format.setLineWidth(65); 
format.setIndenting(true); 
format.setIndent(2); 
Writer out = new StringWriter(); 
XMLSerializer serializer = new XMLSerializer(out, format); 
serializer.serialize(document); 

String formattedXML = out.toString(); 
+0

感謝您的回答。它確實創造了不錯的產出。你能告訴我爲什麼'Transformer'方法不起作用嗎?我更喜歡使用'Transformer',因爲它位於'javax'分支中,而'OutputFormat'和'XMLSerializer'位於'com.sun.org.apache'分支中。 – brimborium

+1

只需**使用變壓器上的'INDENT'屬性**即'''transformer.setOutputProperty(OutputKeys.INDENT,「yes」);' – Santosh

+0

嗯,只設置縮進適用於這個例子,但不適合我的大一。如果有人能告訴我發生了什麼問題,我寧願使用'Transformer',在那之前,我會使用你的解決方案,這很好,但使用舊的包...;) – brimborium