StAX无法正确发出END_ELEMENT事件的信号

时间:2012-01-27 08:49:20

标签: java stax

我有StAX解析器的问题。如果有人之前已经看过这个,并且知道如何解决它,那就太好了。

基本理念是这样的。我有以下类型的XML文件:

....
<ContainedResourceList>
    <Resource> ... </Resource>
    <Resource> ... </Resource>
    ....
    <Resource> ... </Resource>
</ContainedResourceList>
<ContainedReleaseList>
    <Release>...</Release>
    <Release>...</Release>
    ....
    <Release>...</Release>
</ContainedReleaseList>
....

现在,当XML标记位置完全如上所述一切正常时,StAX会为每个标记正确地为我提供Start Element和End Element事件。

我怎么也有一些格式不太好的文件,而是看起来像这样:

....
<ContainedResourceList>
<Resource> ... </Resource>
    <Resource> ... </Resource>
    ....
    <Resource> ... </Resource></ContainedResourceList><ContainedReleaseList><Release>...</Release>
<Release>...</Release>
    ....
    <Release>...</Release>
</ContainedReleaseList>
....

确切的某种标签oragnisation,唯一的区别是缩进和回车后和结束标签。现在当我解析这种文件时,即使</ContainedResourceList>结束标记位于文件的中间,StAX也不会发出正确结束的信号。相反,它会在文件末尾</ContainedResourceList>之后为</ContainedReleaseList>创建一个END标记事件。XMLInputFactory2 xmlInputFactory = (XMLInputFactory2) XMLInputFactory2.newInstance(); XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(xmlFile); while(reader.hasNext()) { staxParseEventType = reader.next(); switch(staxParseEventType) { case START_ELEMENT: { //do something on the element if it's local name is whatever break; } case END_ELEMENT: { //do something at the end of this element if it's name is whatever break; } case END_DOCUMENT: { //do something when document ends break; } } }

此外,如果我采用这样的XML文件并在每个结束标记后手动添加回车符(几乎使它看起来像第一个示例),现在StAX将正确解析它,每个结束标记都会发出信号。

我尝试使用Woodstox StAX实现版本4.1.1和4.1.2以及StAX参考实现1.0.2,行为完全相同。这让我觉得它本身并不是一个bug,而只是我可能会遗漏的东西。

对于引用,我用来解析文件的代码是这样的:

{{1}}

我的问题是,这种行为是否正常?这是一个错误吗?我错过了什么吗?

0 个答案:

没有答案