2

编辑以更清楚地指定场景。

我必须编写一个xml文件,信息来自几个bean(甚至不是整个bean,其中一些bean的jsut子集),一些bean包含列表等。所以我不能只给xstream一个根bean并让它写xml。还有一些格式可能需要满足一些条件,但上一期是

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

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

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

我希望使用拉式解析器解析 xml 的内存效率更高,这同样适用于编写 xml。

4

5 回答 5

1

你试过 Xstream,一个 xml 序列化库吗?

于 2011-04-05T11:03:34.773 回答
1

让我直截了当地说:你从一棵豆树开始。您希望使用它们按照它们的结构构造一个 XML 文档,但具有自己的语法/模式,所以简单的 bean XML 序列化是不可能的......

如果是这样,Blaise Doughan 推荐的 JAXB 是一个很好的建议。但是,如果您需要对 XML 格式进行更精细的控制,则需要进行一些高度特定的序列化,或者您可能希望在创建 XML 时删除一些 bean 引用以允许在执行期间进行垃圾收集,那么 Streaming API for XML (StAX) 可能是您需要的。您可以使用它将 XML 构造写入流。

http://download.oracle.com/javase/6/docs/api/javax/xml/stream/package-summary.html

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

于 2011-04-05T11:44:20.760 回答
0

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

我和 G_H 一样,建议结合您自己的“bean navigator”来查看 Stax、javax.xml.stream.XMLStreamWriter。

于 2011-04-05T13:42:58.180 回答
0

偏见声明- 我是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>

了解更多信息

于 2011-04-05T14:00:34.503 回答
0

你也可以试试http://commons.apache.org/betwixt/

于 2011-04-05T11:36:06.187 回答