【问题标题】:Current state END_ELEMENT is not among the statesCHARACTERS, COMMENT, CDATA, SPACE, ENTITY_REFERENCE, DTD valid for getText()当前状态 END_ELEMENT 不在状态CHARACTERS、COMMENT、CDATA、SPACE、ENTITY_REFERENCE、DTD 对 getText() 有效
【发布时间】: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,看看您是否能发现任何错误。为了帮助您确定问题发生的位置,您可以尝试删除文档的一半,然后删除剩余的一半,依此类推,直到您发现问题发生在文档的可管理部分。

标签: java stax


【解决方案1】:

好吧,我想通了!

我将另一个条件 reader.hasText() 添加到最终的 'if' 中,然后一切都很好。代码如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2012-10-21
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2023-04-03
    相关资源
    最近更新 更多