我有一个输出XML的java应用程序。我使用JaxB的RI实现。
事实上,使用我的输出的第三方应用程序之一不会将文件读取为XML,而是逐行读取,并以其自己的扭曲方式解组它。经过多次质疑,我认为必须适应。
所以我的目标是生成如下所示的XML:
<root>
<alice>
<bob>
bobContent
</bob>
</alice>
</root>
每个节点之间的换行符,包含节点内容,没有缩进。 我发现它很令人痛苦,但问的是什么。
所以,我的想法是创建自己的 XMLStreamWriter 实现,让它来处理它。
这是一个好主意还是我错过了一个更简单的解决方案?你能否提供关于如何编写自定义XMLStreamWriter和常见陷阱的好指示?
答案 0 :(得分:0)
我认为您可以使用Transformer
来实现这一目标。基本上你可以发布处理编组输出:
final ByteArrayOutputStream out = new ByteArrayOutputStream();
// 0) make sure to disable formatted output
final JAXBContext jaxbContext = JAXBContext.newInstance({YOURCLASS}.class);
final Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
// 1) marshal to byte array
final ByteArrayOutputStream out = new ByteArrayOutputStream();
jaxbMarshaller.marshal(this, out);
out.flush();
// 2) setup properties for post processing
final indent = 0;
Transformer transformer = SAXTransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", 0);
// 3) write it to the file
Source xmlSource = new SAXSource(new org.xml.sax.InputSource(input));
final FileOutputStream fos= new FileOutputStream("filename.xml");
StreamResult res = new StreamResult(fos);
transformer.transform(xmlSource, res);
fos.flush();
fos.close();