我需要读取一个XML文件(如果存在 - 如果没有,那么我将创建该文件),修改一些标签并将xml写回。我这样做是为了
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
答案 0 :(得分: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
作为目标文件。
顺便说一下,你提出的代码中有很多陷阱:
FileUtils.writeByteArrayToFile(userFile, getFormatedXML(document).getBytes());
这对于不同的编码是不安全的,因为您使用了String#getBytes(),它使用默认的平台编码,并且很容易导致带有错误编码标题的XML文档。
XMLWriter
是一个com.sun特定于实现的类,它不能跨JDK移植。 (这不太可能成为你的问题)