java如何以内存高效的方式将xml写入bean网络中的流
编辑以更清楚地指定场景
我必须编写一个xml文件,信息来自几个bean(甚至不是整个bean,一些bean的jsut子集),一些bean包含列表等。因此我不能只给xstream一个根bean,让它编写xml。另外,某些格式可能需要满足某些条件,但前面的问题就是其中之一
现在我正在使用JDOM在内存中创建文档,并最终使用XMLOutputer将文档写入文件
但是我想写的bean可以有非常大的其他bean的列表等等,并且使用的内存可能相当高
所以我怀疑在记忆方面应该有更好的方法? 我已经使用xstream在较大的bean中创建了一些bean的xml,并将它们作为元素附加到JDOM中
我希望使用拉式解析器以同样的方式解析xml会更节省内存,同样的方法也可以应用于编写xml
# 1 楼答案
偏见声明-我是EclipseLink JAXB (MOXy)的领导者
使用EclipseLink JAXB (MOXy)可以获得所需的格式。这将允许您消除JDOM片段,以减少内存占用
示例
假设我们的模型中有以下类(忽略访问器以节省空间):
JAXB映射
由于EclipseLink MOXy符合JAXB规范(JSR-222),默认情况下,它将生成以下文档:
路径映射
如果需要对XML进行细粒度控制,可以使用MOXy的@XmlPath扩展。 按如下方式注释字段:
将导致生成以下XML:
位置映射
XPath片段可以包括位置指示符:
生成的XML如下所示:
条件映射
生成的XML将是:
了解更多信息
# 2 楼答案
你也可以试试http://commons.apache.org/betwixt/
# 3 楼答案
让我直说: 你从一棵豆子树开始。您希望使用它们按照它们的结构构造一个XML文档,但它有自己的语法/模式,所以简单的BeanXML序列化是不可能的
如果是这样的话,Blaise Doughan推荐的JAXB是一个很好的建议。但是,如果您需要对XML格式进行更精细的控制,您需要执行一些高度特定的序列化,或者您希望在创建XML时删除一些bean引用以允许在执行期间进行垃圾收集,那么您可能需要XML流API(StAX)。您可以使用它将XML构造写入流
http://download.oracle.com/javase/6/docs/api/javax/xml/stream/package-summary.html
对不起,如果这不是你的意思。如果我弄错了,你能给我们一个小的使用场景吗
# 4 楼答案
即使您想深入研究并编写定制的子类,使用JDOM也是很困难的。XMLOutputter有点假设它有一个可以遍历的完整树。为了节省内存,您必须以某种方式进行排列,以便仅存在当前子树。把经过的子树砍掉是完全可行的;但是如何推迟子树的创建,直到需要它们。所有这些都需要在子类XMLOutputter、专用元素和bean导航代码之间进行某种协调。可能不值得这么做
正如G_H所做的那样,我建议大家看看Stax,javax。xml。流动XMLStreamWriter与您自己的“bean导航器”结合使用
# 5 楼答案
您尝试过xml序列化库Xstream吗