将大型XML文件转换为java对象?

时间:2014-04-23 05:47:46

标签: java xml marshalling

我有大尺寸的xml文件,可以在500 mb到2 gb之​​间进行验证 喜欢自定义标签和其他验证的总数。我的问题是有一个很好的方式让我编组 完整的xml文件到没有OutOfMemory异常的java对象?我不认为它可能,因为我有2 GB的RAM 和ram大小1536 MB。但那么,替代方案是什么?

我应该使用STAX / SAX将xml拆分为更小的xml文件,然后使用单独的对象吗?然后算上顾客 每个java对象中的元素。将其存储为实例变量,然后将其重复为xml。汇总所有客户 计数。如果是,我怎么知道分解的xmls是单个xml的一部分。可能我需要引入一些相关Id 在文件名中,以便我可以知道单独的XML节点是单独的XML节点的一部分吗?

2 个答案:

答案 0 :(得分:1)

为了解析你提到的大小的xml [高达2GB],你不必在RAM中加载所有这些。您可以使用SAX解析器进行解析。 Here我找到了一种有趣的方式

XMLReader r = new XMLReader();

   r.addHandler("node", new NodeHandler() {

     @Override
     public void process(StructuredNode node) {
       System.out.println(node.queryString("name"));
       System.out.println(node.queryValue("price").asDouble(0d));
     }
   });

   r.parse(new FileInputStream("src/examples/test.xml"));

Basicaly它是SAX和DOM的混合体。它为您要处理某些数据的元素创建do。此代码在MIT许可下,可以找到here

如果以上对您不可行,我建议你应该选择普通的StAX解析器Here是一个很好的教程,从

开始

答案 1 :(得分:1)

SAX (Simple API for XML)会帮助你。

  

与DOM解析器不同,SAX解析器不会创建内存   XML文档的表示,因此更快,使用更少   记忆。相反,SAX解析器通知客户端XML文档   通过调用回调来实现结构,即通过调用a上的方法   提供给解析器的org.xml.sax.helpers.DefaultHandler实例。

以下是一个示例实现:

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);

MyHandler中,您定义了生成文档/元素的开头/结尾等事件时要采取的操作。

class MyHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void endDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

    // To take specific actions for each chunk of character data (such as
    // adding the data to a node or buffer, or printing it to a file).
    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
    }

}