当前状态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();
任何建议吗?
答
嗯,我想通了!
我添加另一个条件reader.hasText()到最后'如果',然后一切都很好。这里是代码:
case "text":
reader.next();
if(reader != null && !"".equals(reader.toString()) && reader.hasText())
writer1.println("Text: " + reader.getText());
break;
你可能会向我们展示错误发生点附近的XML吗?否则,任何人都可以做的就是猜测发生了什么。 –
它正好在一个“单词”中间停留在话题的中间(正如我提到它是一个*文章),文本是波斯语,所以我不确定是否显示它是有帮助的。这可能是内存问题吗?因为这是一篇大文章。 - @ DawoodibnKareem – Shireen
我真的怀疑这是否是内存问题。在文档中间,更可能是某种无效的XML。如果你能够识别出发生在文档中的什么地方,那么看看XML会看看是否有什么错误,这将是非常好的。为了帮助您识别发生的位置,您可以尝试删除文档的一半,然后删除剩余的一半,等等,直到您可以在文档的可管理部分找到问题。 –