【问题标题】:Split XML based on size using Java使用 Java 根据大小拆分 XML
【发布时间】:2017-09-16 19:08:49
【问题描述】:

我正在尝试使用以下方法拆分 XML 文件,它创建了第一个拆分文件没有问题,但是当我使用 output.clear();清除已经写入的 XMLEvents 数组会引发错误。

错误:线程“main”中的异常 javax.xml.stream.XMLStreamException:找不到要写入的元素:java.lang.ArrayIndexOutOfBoundsException:-1

我试图调查这个问题但没有成功,任何关于导致错误的原因或如何克服它的建议都非常感谢!

public void SplitBySize() throws FileNotFoundException, XMLStreamException, IOException {

    //File Path
    String filePath = "C:\\Users\\thamm\\Desktop\\XMLFile\\Data2.xml";

    //Read XML file.
    Reader fileReader = new FileReader(filePath);

    //Get XMLInputFactory instance.
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

    //Create XMLEventReader object.
    XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(fileReader);

    long charCount = 0;
    int fileNumber = 1;

    while (xmlEventReader.hasNext()) {

        XMLEvent event = xmlEventReader.nextEvent();
        charCount++;
        output.add(event);

        if (charCount == MAX_SIZE) {

            XMLEventWriter xmlEventWriter = factory.createXMLEventWriter(new FileWriter("C:\\Users\\thamm\\Desktop\\SplitFiles\\output_part_" + fileNumber + ".xml"));

            for (XMLEvent i : output) {
                xmlEventWriter.add(i);
            }

            xmlEventWriter.close();
            output.clear();
            charCount = 0;
            fileNumber++;

        }

        if (event.isEndDocument()) {

            XMLEventWriter xmlEventWriter = factory.createXMLEventWriter(new FileWriter("C:\\Users\\thamm\\Desktop\\SplitFiles\\output_part_End.xml"));

            for (XMLEvent i : output) {
                xmlEventWriter.add(i);
            }
            xmlEventWriter.close();
            output.clear();
        }
    }
}

【问题讨论】:

    标签: java xml filesplitting


    【解决方案1】:

    假设output 是在您的课程中定义的List,我认为您的问题是您使用了两次output.clear()

    第一次使用output.clear()就可以了,因为之前添加了一个元素。

    output.add(event);
    

    但是第二次,output 是空的。

    解决方案

    • 在将output.clear()output.isEmpty() 之类的东西一起使用之前,您需要检查output 是否为空

    • 您可能忘记在清除列表之前将元素添加到列表中。

    【讨论】:

    • 嗨 Mickaël,感谢您的回复.. 我已调试程序以查看第二个循环的输出是否为空,但已成功清除并再次添加 XMLEvents。
    • 导致异常的行是什么?
    • for (XMLEvent i : output) { xmlEventWriter.add(i);问题似乎在这里..我添加了 xmlWriter.flush();在我调试时查看每个输出,并且程序开始将元素输出到第二个文件,但是在输出 2 个元素并且程序终止后抛出错误
    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2018-06-26
    • 2015-04-20
    相关资源
    最近更新 更多