Я заметил ошибку в xmlstreamreader. Если файл не очень приятный для печати, потоковая программа чтения пропускает некоторые элементы! Зачем?? Смотри ниже

Мне нужно прочитать сгенерированные XML-файлы, и я не могу требовать, чтобы они были в хорошем формате. При этом не должно иметь значения, является ли файл одной длинной строкой или довольно красивым с разрывами строк.

        final JAXBContext context = JAXBContext.newInstance(typeClass);
        final XMLInputFactory xmlif = XMLInputFactory.newInstance();
        final Unmarshaller unmarshaller = context.createUnmarshaller();
        final XMLStreamReader xmlr = xmlif.createXMLStreamReader(reader);

        xmlr.nextTag();
        List<T> items = new ArrayList<T>();
        long count = 0;

        while (xmlr.hasNext()) {
            System.out.println(":"+XmlStreamUtils.printEvent(xmlr));
            int eventType = xmlr.next();

                if (eventType == XMLStreamReader.START_ELEMENT) {

                    if (target.getSimpleName().equals(xmlr.getLocalName()) || target.getSimpleName().startsWith(xmlr.getLocalName())) {
                        items.add(unmarshaller.unmarshal(xmlr, target).getValue());

                    }
                }


        }

file: Когда jaxb и Xmlstreamreader демонтируют, он отменяет маршализацию только одного элемента Hest, даже если присутствуют два. Это происходит только тогда, когда это не очень красиво. ЗАЧЕМ??

<?xml version='1.0' encoding='UTF-8'?>
<Fil>
    <Hest>
        <hestName>hest</hestName>
        <hestAge>12</hestAge>
        <hestColor>blue</hestColor>
    </Hest>
    <Hest>
        <hestName>hest</hestName>
        <hestAge>12</hestAge>
        <hestColor>blue</hestColor>
    </Hest>
</Fil>

Мой класс jaxb

    /**
 * 
 */
package dk.skat.efi.wls.bebb.bum;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author efidev
 *
 */
public class JaxbTest {
    @XmlRootElement(name = "Hest")
    @XmlAccessorType(XmlAccessType.FIELD)
    public static class Hest {
        @XmlElement(name = "hestName")
        private String hestName;
        @XmlElement(name = "hestAge")
        private String hestAge;
        @XmlElement(name = "hestColor")
        private String hestColor;
        public String getHestName() {
            return hestName;
        }
        public void setHestName(String hestName) {
            this.hestName = hestName;
        }
        public String getHestAge() {
            return hestAge;
        }
        public void setHestAge(String hestAge) {
            this.hestAge = hestAge;
        }
        public String getHestColor() {
            return hestColor;
        }
        public void setHestColor(String hestColor) {
            this.hestColor = hestColor;
        }


    }

}

1 ответ

Запишите, какое событие (узел) XMLStreamReader в том случае, когда демаршальная операция завершена. Это может быть впереди того, что вы думаете. Это будет означать ваш next() вызов будет означать, что нос пропускается.

Другие вопросы по тегам