Я пытаюсь выбрать родителей снизу 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. Почему это разбор дважды?