【问题标题】:StAX: START_DOCUMENT on empty XML fileStAX:空 XML 文件上的 START_DOCUMENT
【发布时间】:2020-09-10 07:56:56
【问题描述】:

我正在尝试了解有关 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 这样的事件解析器的角度来看,它们是一回事。
  • 这有资格作为答案。请发帖,我会接受的。

标签: java xml stax


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    话虽如此,如果我没记错的话,StAX 解析器在它们报告的事件序列中存在差异,即使在格式正确的情况下也是如此。值得用多个代码测试您的代码。

    【讨论】:

    • 我不知道有多个 StAX 实现。在我看来,我认为hasNext() 的意思是fpeek() did not return EOF
    • JDK 自带了一个实现,还有 Woodstox。在我(不是最近)的经验中,伍德斯托克斯要好得多。
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2015-06-13
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多