我對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();
任何建議嗎?
你可能會向我們展示錯誤發生點附近的XML嗎?否則,任何人都可以做的就是猜測發生了什麼。 –
它正好在一個「單詞」中間停留在話題的中間(正如我提到它是一個維基百科文章),文本是波斯語,所以我不確定是否顯示它是有幫助的。這可能是內存問題嗎?因爲這是一篇大文章。 - @ DawoodibnKareem – Shireen
我真的懷疑這是否是內存問題。在文檔中間,更可能是某種無效的XML。如果你能夠識別出發生在文檔中的什麼地方,那麼看看XML會看看是否有什麼錯誤,這將是非常好的。爲了幫助您識別發生的位置,您可以嘗試刪除文檔的一半,然後刪除剩餘的一半,等等,直到您可以在文檔的可管理部分找到問題。 –