2017-04-20 55 views
0

我想分裂一个XML文件使用以下方法,它创建第一个拆分文件没有问题,但是当我使用output.clear();要清除已经写入的XMLEvent数组,它会抛出错误。根据大小拆分XML使用Java

错误:异常线程“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(); 
     } 
    } 
} 

回答

0

假设output是在你的类中定义的List,我觉得你的问题是,你使用output.clear()两次。

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

output.add(event); 

但第二次,output是空的。

解决方案

  • 您需要检查是否使用outputoutput.clear()output.isEmpty()

  • 你也许忘了清除它之前元素添加到你的列表之前是空的。

+0

嗨Mickaël,谢谢你的回复..我调试了程序,看看第二个循环的输出是否为空,但是它被成功清除并且XMLEvents再次被添加。 –

+0

造成异常的行是什么? (XMLEvent i:output) –

+0

{xmlEventWriter.add(i); }问题似乎在这里..我已经添加了xmlWriter.flush();在我调试时看到每个输出,并且程序开始将元素输出到第二个文件,但输出2个元素并且程序终止后抛出错误 –