我有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}}
我的问题是,这种行为是否正常?这是一个错误吗?我错过了什么吗?