StAX:空XML文件上的START_DOCUMENT

问题描述

我试图了解有关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事件?

解决方法

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

已经说过,如果我没记错的话,即使在格式正确的情况下,StAX解析器之间在它们报告的事件顺序上也存在差异。值得对多个代码进行测试。

,

由于XML声明是可选的,因此每个文件都同样可解析。

格式都不正确(因为格式正确的XML必须具有根元素),但是特别是从事件解析器(如StAX)的角度来看,它们是同一回事。

START_DOCUMENT事件之后,下一个hasNext调用应抛出XMLStreamException,表明文档格式不正确。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...