在Java中解析1 GB xml数据的最佳解析器

时间:2018-07-30 15:44:20

标签: java dom xml-parsing

我的要求是: 我有1GB的xml文件,想从xml文件中删除几个节点。这里删除xml节点可以是整个文件中基于输入的任何内容.JAVA中最好的解析器是什么。 我目前正在使用DOM解析器,它对于100MB的文件可以正常工作,但是它抛出了内存不足错误:1 GB文件的堆空间。 谁能为我的代码建议最佳方法:

    public static void main(String[] args) {
    DocumentBuilder docBuilder = null;
    File inputFile = new File("/scratch/bigfile/final.txt");
    // Parse the xml file using DOM parser
    try{
    DocumentBuilderFactory docBuilderFactory =DocumentBuilderFactory.newInstance();
    docBuilderFactory.setExpandEntityReferences(false);
    docBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
    docBuilder = docBuilderFactory.newDocumentBuilder();
       Document doc= docBuilder.parse(inputFile);

       // Remove unwanted nodes from xml file
        Element element1 = (Element) doc.getElementsByTagName("G_SUMMARY_ROWSET").item(0);
        element1.getParentNode().removeChild(element1);
        Element element2 = (Element) doc.getElementsByTagName("G_JRNLSOURCE_ROWSET").item(0);
        element2.getParentNode().removeChild(element2);
        Element element3 = (Element) doc.getElementsByTagName("G_JRNLSOURCE_UNMATCHED_ROWSET").item(0);
        element3.getParentNode().removeChild(element3);
        Element element4 = (Element) doc.getElementsByTagName("G_JRNLDETAILS_UNMATCHED_ROWSET").item(0);
        element4.getParentNode().removeChild(element4);

        // Convbert Dom Document to Byte array
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
         StreamResult result=new StreamResult(bos);
         transformer.transform(source, result);
         byte []array=bos.toByteArray();
        System.out.println(array.length);

    }
    catch (Exception e) {
             e.printStackTrace();
          }
}

1 个答案:

答案 0 :(得分:1)

请考虑使用SAXParser。通常最好将SAXParser用于较大的文件,因为数据没有存储在内存中,并且在处理完大多数元素后会丢弃它们。这样可以解决您的内存不足问题。

与DOM(文档对象模型)解析器形成对比,该解析器将整个文档加载到内存中。