有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何以内存高效的方式将xml写入bean网络中的流

编辑以更清楚地指定场景

我必须编写一个xml文件,信息来自几个bean(甚至不是整个bean,一些bean的jsut子集),一些bean包含列表等。因此我不能只给xstream一个根bean,让它编写xml。另外,某些格式可能需要满足某些条件,但前面的问题就是其中之一

现在我正在使用JDOM在内存中创建文档,并最终使用XMLOutputer将文档写入文件

但是我想写的bean可以有非常大的其他bean的列表等等,并且使用的内存可能相当高

所以我怀疑在记忆方面应该有更好的方法? 我已经使用xstream在较大的bean中创建了一些bean的xml,并将它们作为元素附加到JDOM中

我希望使用拉式解析器以同样的方式解析xml会更节省内存,同样的方法也可以应用于编写xml


共 (5) 个答案

  1. # 1 楼答案

    偏见声明-我是EclipseLink JAXB (MOXy)的领导者


    使用EclipseLink JAXB (MOXy)可以获得所需的格式。这将允许您消除JDOM片段,以减少内存占用

    示例

    假设我们的模型中有以下类(忽略访问器以节省空间):

    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Customer {
    
        private Address billingAddress;
    
        private Address shippingAddress;
    
    }
    

    JAXB映射

    由于EclipseLink MOXy符合JAXB规范(JSR-222),默认情况下,它将生成以下文档:

    <customer>
        <billingAddress/>
        <shippingAddress/>
    </customer>
    

    路径映射

    如果需要对XML进行细粒度控制,可以使用MOXy的@XmlPath扩展。 按如下方式注释字段:

    @XmlPath("contact-info/billing-address")
    private Address billingAddress;
    
    @XmlPath("contact-info/shipping-address")
    private Address shippingAddress;
    

    将导致生成以下XML:

    <customer>
       <contact-info>
          <billing-address/>
          <shipping-address/>
       </contact-info>
    </customer>
    

    位置映射

    XPath片段可以包括位置指示符:

    @XmlPath("address[1]")
    private Address billingAddress;
    
    @XmlPath("address[2]")
    private Address shippingAddress;
    

    生成的XML如下所示:

    <customer>
       <address/>
       <address/>
    </customer>
    

    条件映射

    @XmlPath("address[@type='billing']")
    private Address billingAddress;
    
    @XmlPath("address[@type='shipping']")
    private Address shippingAddress;
    

    生成的XML将是:

    <customer>
       <address type="billing"/>
       <address type="shipping"/>
    </customer>
    

    了解更多信息

  2. # 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

    对不起,如果这不是你的意思。如果我弄错了,你能给我们一个小的使用场景吗

  3. # 4 楼答案

    即使您想深入研究并编写定制的子类,使用JDOM也是很困难的。XMLOutputter有点假设它有一个可以遍历的完整树。为了节省内存,您必须以某种方式进行排列,以便仅存在当前子树。把经过的子树砍掉是完全可行的;但是如何推迟子树的创建,直到需要它们。所有这些都需要在子类XMLOutputter、专用元素和bean导航代码之间进行某种协调。可能不值得这么做

    正如G_H所做的那样,我建议大家看看Stax,javax。xml。流动XMLStreamWriter与您自己的“bean导航器”结合使用

  4. # 5 楼答案

    您尝试过xml序列化库Xstream吗