简体   繁体   English

拆分大型XML文件Java(StAX)

[英]Splitting Large XML FIles Java (StAX)

I am using this code https://github.com/koen-serneels/blog/tree/master/BigXmlTest/src/main/java/be/error/bigxmltest from GitHub to split large XML files(6GB).I am starting with the basic XML File provided to understand the program. 我正在使用这段代码https://github.com/koen-serneels/blog/tree/master/BigXmlTest/src/main/java/be/error/bigxmltest来自GitHub来拆分大型XML文件(6GB)。提供基本的XML文件以了解程序。 The program outputs the header for each file that is split. 程序输出每个分割文件的标题。 I am Trying to add a Footer Element now also for each file and having some difficulties, any suggestions or advice on how to go about this would be great. 我现在也尝试为每个文件添加一个页脚元素,并且遇到一些困难,有关如何执行此操作的任何建议或建议都很好。

I have added The footer to the schema and written the code to add a footer in the "openOutputFileAndWriteHeader()" method. 我已经在模式中添加了页脚,并在“ openOutputFileAndWriteHeader()”方法中编写了添加页脚的代码。 However This adds the footer within the Content Element. 但是,这会将页脚添加到Content Element中。 Shown Below: 如下图所示:

private XMLEventWriter openOutputFileAndWriteHeader(int fileNumber) throws Exception
{

    XMLEventFactory xmlEventFactory = XMLEventFactory.newInstance();
    XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
    xmlOutputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
    XMLEventWriter writer = xmlOutputFactory.createXMLEventWriter(new FileOutputStream(new File("C:\\Users\\thamm\\Desktop\\SplitFiles\\File_" + fileNumber + ".xml")));

    writer.setDefaultNamespace(DOCUMENT_NS);
    writer.add(xmlEventFactory.createStartDocument());

    writer.add(xmlEventFactory.createStartElement(new QName(DOCUMENT_NS, ROOT_ELEMENT), null, null));

    HeaderType header = objectFactory.createHeaderType();
    header.setSomeHeaderElement("List of Employees");
    marshaller.marshal(new JAXBElement<HeaderType>(new QName(DOCUMENT_NS, HEADER_ELEMENT, ""), HeaderType.class, 
                    HeaderType.class, header), writer);

    writer.add(new StartElementEvent(new QName(DOCUMENT_NS, CONTENT_ELEMENT)));

    FooterType footer = objectFactory.createFooterType();
    footer.setSomeFooterElement("Footer");
    marshaller.marshal(new JAXBElement<FooterType>(new QName(DOCUMENT_NS, FOOTER_ELEMENT,""), FooterType.class, 
                      FooterType.class, footer), writer);

    return writer;
}

Output: 输出:

<?xml version='1.0' encoding='UTF-8'?>
<BigXmlTest xmlns="http://www.sidero.ie/bigxmltest">
    <Header>
        <SomeHeaderElement>List of Employees</SomeHeaderElement>
    </Header>
    <Content>
        <Footer>
            <SomeFooterElement>Footer</SomeFooterElement>
        </Footer>
        <Data>Data4</Data>
        <Data>Data5</Data>
        <Data>Data6</Data>
    </Content>
</BigXmlTest>

Name of method openOutputFileAndWriteHeader hints that it will create new file. 方法名称openOutputFileAndWriteHeader暗示它将创建文件。 It's not proper place for footer. 页脚不合适。

In BigXmlTestIteratorApi.java from line 74 you can see code: 在第74行的BigXmlTestIteratorApi.java中 ,您可以看到代码:

xmlEventWriter.close(); // Also closes any open Element(s) and the document
xmlEventWriter = openOutputFileAndWriteHeader(++fileNumber); // Continue with next file
dataRepetitions = 0;

To add footer, you need add something before closing file: 要添加页脚,您需要关闭文件之前添加一些内容:

writeFooter(footer);
xmlEventWriter.close(); 
xmlEventWriter = openOutputFileAndWriteHeader(++fileNumber);
dataRepetitions = 0;

Please note that creating instance of FooterType for each file may be superfluous. 请注意,为每个文件创建FooterType实例可能是多余的。 It could be created outside loop, for example at 60 line 可以在外部循环(例如60行)上创建

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM