Stax анализирует дважды - PullRequest
       32

Stax анализирует дважды

0 голосов
/ 29 января 2020

Я пытаюсь выбрать родителей снизу xml с помощью stax, обратите внимание, что в одной структуре может быть несколько родителей и детей.

<sm:Structure>
    <sm:Parent>
         <sm:parentCode>PARENT-CODE-1</sm:parentCode>
         <sm:parentName>PARENT-NAME-1</sm:parentName>
     </sm:Parent>
     <sm:Child>
         <sm:childCode>CHILD-CODE-1</sm:childCode>
         <sm:childName>CHILD-NAME-1</sm:childName>
         <sm:parentCode>PARENT-CODE-1</sm:parentCode>
     </sm:Child>
 </sm:Structure>

С помощью следующего кода:

XMLStreamReader xmlr = null;
try {
    XMLInputFactory xmlif = XMLInputFactory.newInstance();
    File file = new File(fileName);
    xmlr = xmlif.createXMLStreamReader(new FileReader(file));

    JAXBContext context = JAXBContext.newInstance(type);
    Unmarshaller unmarshaller = context.createUnmarshaller();

    while (xmlr.hasNext() && (!xmlr.isStartElement() || !xmlr.getLocalName().equalsIgnoreCase(localName))) {
        xmlr.next();
    }

    List<T> objectList = new ArrayList<>();
    int numberOfRead = 0, chunkIndex = 0;

    StopWatch watch = new StopWatch();
    watch.start();
    while (xmlr.getEventType() == XMLStreamConstants.START_ELEMENT) {
        if (numberOfRead == chunkSize) {
            chunkConsumer.consumeChunk(objectList, chunkIndex, chunkSize, breakChildProcessOnParentError));
            numberOfRead = 0;
            chunkIndex++;
            objectList = new ArrayList<>();
        }
        JAXBElement<T> objNode = unmarshaller.unmarshal(xmlr, type);
        T obj = objNode.getValue();
        objectList.add(obj);
        numberOfRead++;

        if (xmlr.getEventType() == XMLStreamConstants.CHARACTERS) {
            xmlr.next();
        }
    }
    if (numberOfRead != 0) {
        chunkConsumer.consumeChunk(objectList, chunkIndex, chunkSize, breakChildProcessOnParentError));
    }
    watch.stop();
    log.info("Time Elapsed to trigger all " + type.getName() + "-Chunk-Consumers: " + 
    watch.toSplitString());
} catch (Exception e) {
    throw new CustomException("Error during " + type.getName()+ "-Chunk-Consumer process.", e);
} finally {
    try {
        if (xmlr != null) {
            xmlr.close();
        }
    } catch (Exception exception) {
        log.error(exception.getMessage(), exception);
    }
}

Интересно читает родительский элемент дважды, первый в порядке, второй без parentName. Почему это разбор дважды?

1 Ответ

0 голосов
/ 12 февраля 2020

Пропущено условие в то время, добавление решило мою проблему.

while (xmlr.getEventType() == XMLStreamConstants.START_ELEMENT && xmlr.getLocalName().equalsIgnoreCase(localName)) {
...