Я заметил ошибку в 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()
вызов будет означать, что нос пропускается.