1

我正在尝试使用 StaX 找出 IO,但我不断收到来自读者的“格式错误”和“过早的 EOF”错误。这是读取使用 StaX 创建的代码,如下例所示。

我已将代码简化为最简单的配置,但仍然出现错误。这是从哪里来的?

SSCCE(应该抛出错误)

package XMLTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;

public class SaveLoadTest {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        final String FILE = "test.xml";

        //////////// WRITE
        final XMLOutputFactory OFACT = XMLOutputFactory.newInstance();
        final XMLEventFactory EFACT = XMLEventFactory.newInstance();
        final XMLEventWriter WRITER = OFACT.createXMLEventWriter(new FileOutputStream(FILE));

        WRITER.add(EFACT.createStartDocument());
        WRITER.add(EFACT.createComment("As basic as it gets."));
        WRITER.add(EFACT.createEndDocument());
        WRITER.close();

        //////////// READ
        final XMLInputFactory IFACT = XMLInputFactory.newInstance();
        final XMLEventReader READER = IFACT.createXMLEventReader(new FileInputStream(FILE));

        while (READER.hasNext()) {
            READER.nextEvent();
        }
    }
}

和错误:

Exception in thread "main" javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,49]
Message: Premature end of file.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:594)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:85)
    at XMLTest.SaveLoadTest.main(SaveLoadTest.java:34)

我已经查看了其他几个 SO 问题(thisthis似乎最相关),但我无法将它们与这种情况联系起来......

编辑

另外,我已经尝试在单独的操作中进行这种读写,并且发生了同样的事情。

编辑第二个

XML 输出文件,根据要求。

<?xml version="1.0"?><!--As basic as it gets.-->
4

1 回答 1

4

它期望 XML 文件有一个根元素。

如果您的输出代码更改为创建一个元素,它可以工作:

    WRITER.add(EFACT.createStartDocument());
    WRITER.add(EFACT.createStartElement("", "", "element"));
    WRITER.add(EFACT.createEndElement("", "", "element"));
    WRITER.add(EFACT.createEndDocument());

输出到文件中

    <?xml version="1.0" encoding="UTF-8"?><element></element>

然后读取没有错误的第一个事件。

于 2012-03-25T01:38:33.570 回答