私はルート要素がリストであるXMLを解析する必要があります。私はむしろ、のようなものを書いて、ユーザーが非整列リスト全体をメモリに保持し、それを1つずつ処理するよう強制しません。JAXBパースXMLリストの順番(一つずつ)
は、これまでのところ私は内部Iterable<SomeObject>
と私自身のIterator
を実装して、このようなクラスを書いた:
public class SomeObjectsIterableParser implements Iterable<SomeObjectType> {
private final Unmarshaller jaxbUnmarshaller;
private final XMLStreamReader xmlReader;
public SomeObjectsIterableParser(Schema schema, java.io.Reader xmlStringReader) throws ExtractorException {
try {
jaxbUnmarshaller = JAXBContext.newInstance(SomeObjectType.class).createUnmarshaller();
xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(xmlStringReader);
} catch (JAXBException | XMLStreamException e) {
throw new ExtractorException("Could not create jaxbUnmarshaller", e);
}
jaxbUnmarshaller.setSchema(schema); //turns on schema validation
//Move reader to first occurence of SomeObject - really necessary?
try {
while (xmlReader.hasNext()) {
if (!xmlReader.isStartElement() || !xmlReader.getLocalName().equals("SomeObject"))
xmlReader.next();
else break;
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
@Override
public Iterator<SomeObjectType> iterator() {
return new MyIterator();
}
class MyIterator implements Iterator<SomeObjectType> {
@Override
public boolean hasNext() {
try {
return xmlReader.hasNext();
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
}
@Override
public SomeObjectType next() {
try {
return (SomeObjectType) jaxbUnmarshaller.unmarshal(xmlReader);
} catch (JAXBException | XMLStreamException e) {
throw new RuntimeException(e);
}
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet");
}
}
}
私はメッセージとnext()
方法で例外を受け取る:org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 17; cvc-elt.1: Cannot find the declaration of element 'SomeObject'.
は私が間違って何をしているのですか?
完全な診断を行うにはすべてが必要ですが、おそらくはの子としてのみ宣言され、このスキーマでは許容できるスタンドアロン要素ではありません。あなたのUnmarshallerはあなたのXMLReaderがこれまでに読んだことを見ないので、が実際にの子であることを知ることはできません。このような要素を独立して宣言するには、スキーマを別に宣言するか、別の方法で検証する必要があります(私には分かりません) –
kumesana
@kumesanaあなたは正しいですが、これが問題でした(ただし唯一ではありません)。私は接続された質問を作成しました:https://stackoverflow.com/questions/45733478/jaxb-schema-validation-when-unmarshalling-non-root-element – jaskmar