2

を使用して (かなり大きな) XML ファイルを解析しようとしていますjavax.xml.stream.XMLStreamReader。ファイルは整形式 (xmllint で検証済み) ですが、それでも次の例外が発生します。

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[12418,95]
Message: XML document structures must start and end within the same entity.
at     com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:592)

これは私のコードを簡略化したものです:

while(parser.hasNext()){
    parser.next();
    if (parser.getEventType() == XMLStreamReader.START_ELEMENT){
        if (parser.getLocalName() == "s") {
            // do stuff
        }
    }
    if (parser.getEventType() == XMLStreamReader.END_ELEMENT){
        if (parser.getLocalName() == "s") {
            // do more stuff                
        }
    }
    if (parser.getEventType() == XMLStreamReader.CHARACTERS){
        if (inSentenceElement) {
            // process text
            parser.getText()...
        }
    }
}

エラーメッセージに示されているように、XML の行/列を確認しましたが、特に異常はありませんでした。ファイルのサイズが問題である可能性があり、ルート要素が閉じられる前に EOF が読み取られるようにファイルが切り捨てられるのではないかと考えていました。それは実現可能ですか?もしそうなら、どうすればそれを避けることができますか?

編集: bz2 で圧縮されたファイルは、最大 1.5G のサイズで最大 7M 行ですが、4M の比較的小さなファイルも、約 10K 行の後にクラッシュします (ただし、問題が発生するまでの行数は 3K 行ずつ変化する傾向があります)。 .

4

1 に答える 1