【发布时间】:2017-10-05 09:38:12
【问题描述】:
我对 java 很陌生,但我正在为学校做这个项目。我有一个 4GB XML 文件(它是一个维基百科转储)需要解析。我使用 StAX 并且我的代码成功运行了超过 400,000 行(几乎 50MB),但随后出现此错误。
线程“主”java.lang.IllegalStateException 中的异常:当前 状态 END_ELEMENT 不在状态CHARACTERS、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
-
我真的怀疑是不是内存问题。它更有可能是某种无效的 XML,就在文档的中间。如果您能确定文档中发生这种情况的位置,那就太好了,然后查看 XML,看看您是否能发现任何错误。为了帮助您确定问题发生的位置,您可以尝试删除文档的一半,然后删除剩余的一半,依此类推,直到您发现问题发生在文档的可管理部分。