是否真的没有办法直接使用javax.xml.stream.XMLStreamWriter(Java SE 6)编写格式化的XML?这真是令人难以置信,因为其他XML API(如JAXB和一些DOM库)能够做到这一点.即使.NET XMLStreamWriter等效也能够使用此AFAIK(如果我没记错的话,该类是System.Xml.XmlTextWriter).
这意味着我唯一的选择是重新分析XML以生成格式化输出?
例如:
StringWriter sw = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newFactory();
XMLStreamWriter xmlStreamWriter = xmlOutputFactory.createXMLStreamWriter(sw);
writeXml(xmlStreamWriter);
xmlStreamWriter.flush();
xmlStreamWriter.close();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
StringWriter formattedStringWriter = new StringWriter();
transformer.transform(new StreamSource(new StringReader(sw.toString())), new StreamResult(formattedStringWriter));
System.out.println(formattedStringWriter);
Run Code Online (Sandbox Code Playgroud)
此解决方案的问题是属性"{http://xml.apache.org/xslt}indent-amount".我没有找到任何关于它的文档,它似乎不保证是可移植的.
那么,如果我想用标准的Java 6类做什么,我还有什么其他选择?创建一个JAXB或DOM对象图只是为了漂亮的打印?
我有一个相当大的重复XML来使用JAXB创建.将整个对象存储在内存中然后进行编组会占用太多内存.基本上,我的XML看起来像这样:
<Store>
<item />
<item />
<item />
.....
</Store>
Run Code Online (Sandbox Code Playgroud)
目前我对该问题的解决方案是将根标签"硬编码"到输出流,并逐个编组每个重复元素:
aOutputStream.write("<?xml version="1.0"?>")
aOutputStream.write("<Store>")
foreach items as item
aMarshaller.marshall(item, aOutputStream)
end
aOutputStream.write("</Store>")
aOutputStream.close()
Run Code Online (Sandbox Code Playgroud)
不知何故,JAXB生成这样的XML
<Store xmlns="http://stackoverflow.com">
<item xmlns="http://stackoverflow.com"/>
<item xmlns="http://stackoverflow.com"/>
<item xmlns="http://stackoverflow.com"/>
.....
</Store>
Run Code Online (Sandbox Code Playgroud)
虽然这是一个有效的XML,但它看起来很难看,所以我想知道有没有办法告诉编组人员不要为项目元素添加命名空间?或者是否有更好的方法使用JAXB按块序列化为XML块?
我在使用Marshaller.JAXB_FRAGMENT属性成功编组时遇到了一些麻烦.这是我想要输出的XML的简单版本.
<Import>
<WorkSets>
<WorkSet>
<Work>
<Work>
...
..
...
</WorkSet>
<WorkSet>
<Work>
<Work>
...
</WorkSet>
<WorkSets>
<Import>
Run Code Online (Sandbox Code Playgroud)
的<Import>和<WorkSets>元件基本上围住了大量的只是容器元素<WorkSet>&<Work>元件.我现在正试图在马萨诸塞州<WorkSet>.
<Import>和<WorkSets>元素,然后从元素编组<WorkSet>并将输出封装在<Import><WorkSets>标签中?xmlns='http://namespace.com'属性附加到WorkSet标记时,有没有一种方法可以在没有将namespace属性附加到Workset的情况下编组?