java - 使用 Stax Parser 将大于 10GB 的巨大 xml 文件拆分成小块

标签 java xml stax

我们有一个场景,我们需要将大小超过 10GB 的大型 xml 文件分成小块。每个 block 应包含 100 或 200 个元素。示例 xml

<Employees>
  <Employee id="1">
    <age>29</age>
    <name>Pankaj</name>
    <gender>Male</gender>
    <role>Java Developer</role>
  </Employee>
  <Employee id="3">
    <age>35</age>
    <name>Lisa</name>
    <gender>Female</gender>
    <role>CEO</role>
  </Employee>
  <Employee id="3">
    <age>40</age>
    <name>Tom</name>
    <gender>Male</gender>
    <role>Manager</role>
  </Employee>
  <Employee id="3">
    <age>25</age>
    <name>Meghna</name>
    <gender>Female</gender>
    <role>Manager</role>
  </Employee>
  <Employee id="3">
    <age>29</age>
    <name>Pankaj</name>
    <gender>Male</gender>
    <role>Java Developer</role>
  </Employee>
  <Employee id="3">
    <age>35</age>
    <name>Lisa</name>
    <gender>Female</gender>
    <role>CEO</role>
  </Employee>
  <Employee id="3">
    <age>40</age>
    <name>Tom</name>
    <gender>Male</gender>
    <role>Manager</role>
 </Employee>
</Employees>

我有 Stax 解析器代码,它将文件分成小块。但是每个文件只包含一个完整的 Employee 元素,我需要 100 或 200 或更多 <Employee>单个文件中的元素。这是我的java代码

public static void main(String[] s) throws Exception{
     String prefix = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+"\n";
        String suffix = "\n</Employees>\n";
        int count=0;
        try {

        int i=0;
             XMLInputFactory xif = XMLInputFactory.newInstance();
             XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("D:\\Desktop\\Test\\latestxml\\test.xml"));
             xsr.nextTag(); // Advance to statements element

             TransformerFactory tf = TransformerFactory.newInstance();
             Transformer t = tf.newTransformer();
             while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
                 File file = new File("C:\\Users\\test\\Desktop\\xml\\"+"out"  +i+ ".xml");
                 FileOutputStream fos=new FileOutputStream(file,true);
                 t.transform(new StAXSource(xsr), new StreamResult(fos));
                 i++;

             }

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

最佳答案

不要在每次迭代时都加上 i,当迭代达到 100 或 200 时,它应该更新为最新计数

喜欢:

String outputPath = "/test/path/foo.txt";

    while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {

                    FileOutputStream file = new FileOutputStream(outputPath,true);
                     ... 
                     ...
                     count ++; 
                     if(count == 100){
                      i++;
                      outputPath = "/test/path/foo"+i+"txt";
                      count = 0;
                      }  
                 }

关于java - 使用 Stax Parser 将大于 10GB 的巨大 xml 文件拆分成小块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34148923/

相关文章:

java - Adapter 内的 ImageView 出现 NullPointerException

java - 将java.sql.Timestamp转换为Java 8 ZonedDateTime吗?

java - 如何将 RSSReader 组件与代号一中的 URL 链接

xml - 如何在 clojure.data.zip 中使用 xml-> 获取嵌套节点?

c# 解析 XML 问题

来自 DBpedia 和 Jena 的 SPARQL XML 结果

java - XSD "property already defined"

xml - 能否将两个给定的 XSD 数据类型连接成一种新的 XSD 数据类型?

java - 为什么 javax.xml.stream.XMLEventReader 扩展原始 Iterator 而不是 Iterator<XmlEvent>?

validation - 如果命名空间存在,则无法在 JAXB 中验证 XML 的特定部分