StAX не может правильно сигнализировать событие END_ELEMENT - PullRequest
2 голосов
/ 27 января 2012

У меня проблема с анализатором 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>
....

Точные метки орагнизации, единственная разница - отступы и возврат каретки после иконец тега.теперь, когда я анализирую этот тип файла, даже если в середине файла находится тег </ContainedResourceList> end, StAX не будет сигнализировать о его правильном завершении.Вместо этого он создаст событие END tag для </ContainedResourceList> до конца файла, ПОСЛЕ </ContainedReleaseList>.

Кроме того, если я возьму такой XML-файл и вручную добавлю возврат каретки после каждого конечного тега (в значительной степени сделаю так, чтобы он выглядел как первый пример), теперь StAX будет анализировать его правильно, каждый конечный тег сигнализируется там, где он.

Я пробовал это с реализацией Woodstox StAX версий 4.1.1 и 4.1.2, а также с реализацией ссылок StAX 1.0.2, поведение точно такое же.Это заставляет меня думать, что это не ошибка как таковая, а просто то, чего мне не хватает.

Для справки, код, который я использую для разбора файла, выглядит примерно так:

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;
    }
    }
}

Мой вопрос: нормально ли это поведение?Это ошибка?Я что-то упустил?

...