StAX:START_DOCUMENT 空 XML 文件

StAX: START_DOCUMENT on empty XML file

我正在尝试了解关于 START_DOCUMENT 事件的 StAX 设计。典型的 while 循环是:

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
try {
  XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));
  while(xmlEventReader.hasNext()) {
    XMLEvent xmlEvent = xmlEventReader.nextEvent();
    switch( xmlEvent.getEventType() ) {
    [...]

使用此循环无法区分空 XML 文件与仅具有 xml 版本的 XML 文件。例如:

% test -s empty.xml || echo empty      
empty
% cat start.xml 
<?xml version="1.0" encoding="UTF-8"?>

以上两个文件产生了完全相同的一系列 StAX 事件(一个 START_DOCUMENT)。这种行为是否记录在某处?在空文件的情况下,为什么有人想要 START_DOCUMENT 事件?

如果您正在解析一个文件并且该文件不包含 well-formed XML,那么您唯一可以确定的是将报告一个错误。您描述的两种情况(空文件和仅包含 XML 声明的文件)都不是 well-formed,因此除了错误之外您不能依赖任何东西。

话虽如此,如果我没记错的话,StAX 解析器在它们报告的事件序列中存在差异,即使在 well-formed 的情况下也是如此。用不止一个来测试你的代码是值得的。

两个文件都同样可解析,因为 XML 声明是可选的。

都不是well-formed(因为一个well-formedXML肯定有一个根元素),但是特别是从像StAX这样的事件解析器的角度来看,这些是一回事.

START_DOCUMENT 事件之后,下一个 hasNext 调用应该抛出 XMLStreamException 指示文档不是 well-formed.