Splitting Large XML FIles Java (StAX)



我正在使用GitHub上的这段代码 https://github.com/koen-serneels/blog/tree/master/BigXmlTest/src/main/java/be/error/bigxmltest 来拆分大型XML文件(6GB(。我从提供的基本XML文件开始,以了解该程序。程序输出每个拆分文件的标头。我现在正在尝试为每个文件添加一个页脚元素,并且遇到了一些困难,有关如何执行此操作的任何建议或建议都会很棒。

我已将页脚添加到架构中,并编写了代码以在"openOutputFileAndWriteHeader(("方法中添加页脚。但是,这会在内容元素中添加页脚。所 示:

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;
}

输出:

<?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>

方法的名称openOutputFileAndWriteHeader提示它将创建新文件。这不是页脚的合适位置。

在 BigXmlTestIteratorAPI 中.java从第 74 行可以看到代码:

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

要添加页脚,您需要在关闭文件之前添加一些内容:

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

请注意,为每个文件创建FooterType实例可能是多余的。它可以在环路外创建,例如在 60 行处

最新更新