拆分大型 XML 文件 Java (StAX)
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 文件开始,以了解程序。该程序为每个拆分的文件输出 header。我现在也正在尝试为每个文件添加一个页脚元素,但遇到了一些困难,如果有任何关于如何解决这个问题的建议或建议,那就太好了。
我已将页脚添加到架构中,并编写代码以在 "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
暗示它将创建新 文件。这不是放置页脚的合适位置。
在第 74 行的 BigXmlTestIteratorApi.java 中,您可以看到代码:
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 行
我正在使用来自 GitHub 的代码 https://github.com/koen-serneels/blog/tree/master/BigXmlTest/src/main/java/be/error/bigxmltest 来拆分大型 XML 文件 (6GB)。我从提供的基本 XML 文件开始,以了解程序。该程序为每个拆分的文件输出 header。我现在也正在尝试为每个文件添加一个页脚元素,但遇到了一些困难,如果有任何关于如何解决这个问题的建议或建议,那就太好了。
我已将页脚添加到架构中,并编写代码以在 "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
暗示它将创建新 文件。这不是放置页脚的合适位置。
在第 74 行的 BigXmlTestIteratorApi.java 中,您可以看到代码:
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 行