2017-10-05 72 views
0

我對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會看看是否有什麼錯誤,這將是非常好的。爲了幫助您識別發生的位置,您可以嘗試刪除文檔的一半,然後刪除剩餘的一半,等等,直到您可以在文檔的可管理部分找到問題。 –

回答

0

嗯,我想通了!

我添加另一個條件reader.hasText()到最後'如果',然後一切都很好。這裏是代碼:

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