当前状态END_ELEMENT不在状态CHARACTERS,COMMENT,CDATA,SPACE,ENTITY_REFERENCE,DTD对于getText有效()

当前状态END_ELEMENT不在状态CHARACTERS,COMMENT,CDATA,SPACE,ENTITY_REFERENCE,DTD对于getText有效()

问题描述:

我对Java很新,但是我正在为学校做这个项目。我有一个4GB的XML文件(这是一个*转储)需要解析。我使用StAX,并且我的代码成功运行超过400,000行(几乎50MB),但是后来出现此错误。当前状态END_ELEMENT不在状态CHARACTERS,COMMENT,CDATA,SPACE,ENTITY_REFERENCE,DTD对于getText有效()

异常在线程 “主要” java.lang.IllegalStateException:当前 状态END_ELEMENT不是statesCHARACTERS,COMMENT之间,CDATA SPACE,ENTITY_REFERENCE,DTD在 有效的getText()com.sun.org .apache.xerces.internal.impl.XMLStreamReaderImpl.getText(XMLStreamReaderImpl.java:1081) 在tagremoving1.TagRemoving1.main(TagRemoving1.java:65)

我读的地方,当我使用的getText()我建议立即进行删除检查null或空元素,所以我做了。然后它会进一步发展,但会再次出现同样的错误。我几乎到处都抬头看。我不知道什么是错的。 这是我的代码:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
    File file = new File("source.xml"); 
    FileInputStream fileReader = new FileInputStream(file);  
    factory.setProperty(XMLInputFactory.IS_COALESCING, true); 
      factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,true); 
      factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,false); 
    PrintWriter writer1 = new PrintWriter("result.txt", "UTF-8"); 

    XMLStreamReader reader = factory.createXMLStreamReader(fileReader); 
    int counter = 1; 
    while(reader.hasNext()){ 

     if(reader.next() == 1){ //If it is START_ELEMENT 
      String name = reader.getLocalName(); 
      switch(name){ 
       case "page": 
        writer1.println("\r\npage" + counter + ":"); 
        counter++; 
        break; 

       case "title": 
        reader.next(); 
        if(reader != null && !"".equals(reader.toString())) 
          writer1.println("Title: " + reader.getText()); 
        break; 

       case "text": 
        reader.next(); 
        if(reader != null && !"".equals(reader.toString())) 
         writer1.println("Text: " + reader.getText()); 
        break; 

       default: 
        break; 
      } 
     } 

    } 
    writer1.flush(); 
    writer1.close(); 

任何建议吗?

+0

你可能会向我们展示错误发生点附近的XML吗?否则,任何人都可以做的就是猜测发生了什么。 –

+0

它正好在一个“单词”中间停留在话题的中间(正如我提到它是一个*文章),文本是波斯语,所以我不确定是否显示它是有帮助的。这可能是内存问题吗?因为这是一篇大文章。 - @ DawoodibnKareem – Shireen

+0

我真的怀疑这是否是内存问题。在文档中间,更可能是某种无效的XML。如果你能够识别出发生在文档中的什么地方,那么看看XML会看看是否有什么错误,这将是非常好的。为了帮助您识别发生的位置,您可以尝试删除文档的一半,然后删除剩余的一半,等等,直到您可以在文档的可管理部分找到问题。 –

嗯,我想通了!

我添加另一个条件reader.hasText()到最后'如果',然后一切都很好。这里是代码:

case "text": 
    reader.next(); 
    if(reader != null && !"".equals(reader.toString()) && reader.hasText())      
    writer1.println("Text: " + reader.getText()); 
    break;