问题描述
我试图了解有关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
,表明文档格式不正确。