2012-03-20 58 views
1

我需要讀取一個XML文件(如果存在 - 如果不存在,那麼我將創建該文件),修改一些標籤並將xml寫回。我與Java Dom4j SAXReader和XMLWriter導致多個換行

InputStream in = new FileInputStream(userFile); 
    SAXReader reader = new SAXReader(); 
    Document document = reader.read(in); 

    Element root = document.getRootElement(); 
    ... 

這樣做的,用

FileUtils.writeByteArrayToFile(userFile, getFormatedXML(document).getBytes()); 

    ... 

    private String getFormatedXML(Document doc) { 
    try { 
     String encoding = doc.getXMLEncoding(); 

     if (encoding == null) 
      encoding = "UTF-8"; 

     Writer osw = new StringWriter(); 
     OutputFormat opf = new OutputFormat(" ", true, encoding); 
     XMLWriter writer = new XMLWriter(osw, opf); 
     writer.write(doc); 
     writer.close(); 
     return osw.toString(); 
    } catch (IOException e) { 
    } 
    return "ERROR"; 
} 

問題是寫回,那之後的每個寫回一個額外的換行符將被創建。如果將outputFormat的參數從true切換到false,則不會寫入換行符。

有沒有簡單的方法來解決這個問題?

非常感謝 Hauke

回答

1

用Java編寫格式的XML使用javax.xml.transform包,這樣,最好的辦法:

TransformerFactory transfac = TransformerFactory.newInstance(); 
transfac.setAttribute("indent-number", 2); 
Transformer trans = transfac.newTransformer(); 
trans.setOutputProperty(OutputKeys.INDENT, "yes"); 
trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
Result result = new StreamResult(System.out); 
trans.transform(new DomSource(document), result); 

相反的System.out,使用FileOutputStream爲目標文件。

順便說一句,有一些代碼陷阱諸位:

​​

因爲你使用字符串#的getBytes(這不是爲不同的編碼安全),它使用默認的平臺編碼,並且很容易導致編碼標題不正確的XML文檔。

XMLWriter是一個com.sun實現特定的類,它不能跨JDK移植。 (這不太可能是你的問題)

+0

非常感謝。這工作好多了。但我需要改變兩件事才能正常工作: 1)transfac.setAttribute(「indent-number」,new Integer(2)); - >我需要刪除,因爲我得到了一個IllegalArgumentException:不支持 2)trans.transform(new DocumentSource(document),result); - > DomSource對象不在我的類路徑中,但DocumentSource是。也許我正在使用不同的版本。 非常感謝! – Hauke 2012-03-21 10:37:10