Не удается разобрать XML-файлы со сгенерированными классами JAXB

Я пытаюсь сгенерировать привязки JAXB из этого файла xsd в соответствии с это руководство. Во-первых, я заметил, что есть некоторые зависимости, но мне удалось получить их с одного и того же адреса. После того, как я их скачал, я побежал

xjc net_file.xsd

Это действительно сгенерировало некоторый код Java, однако, в отличие от учебника, файлы выглядят как «... Type.java». Я нахожу это неудобным, но я мог бы жить с этим. После этого я попытался разобрать данный пример файла:

File file = new File("quickstart.net.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(NetType.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
NetType net = (NetType) jaxbUnmarshaller.unmarshal(file);

Однако я получаю следующее исключение:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"net"). Expected elements are (none)

Кто-нибудь знает, что я делаю неправильно?


person hfhc2    schedule 05.02.2016    source источник
comment
Взгляните на это, может быть похоже на ваш вопрос similar_Question   -  person Imran    schedule 05.02.2016
comment
net должен быть вашим корневым элементом, например, XmlRootElement(name=net). Вы можете показать класс NetType.   -  person Vaseph    schedule 05.02.2016


Ответы (2)


Я думаю, что ваш файл XML определяется двумя XSD. Посмотреть здесь:

xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/netconvertConfiguration.xsd" и xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/net_file.xsd

Вы либо пропустите net, либо configuration элемент.

Я не знаю, как JAXB может поддерживать частичные XSD. Вы уверены, что правильно следуете инструкции? Вы должны иметь возможность объединить эти два файла xsd в один (?).

person FazoM    schedule 05.02.2016

Ну, я нашел проблему. Кажется, вам действительно нужно использовать сгенерированный файл ObjectFactory. Я изменил код следующим образом:

    File file = new File("quickstart.net.xml");
    JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    JAXBElement<NetType> netElement = (JAXBElement<NetType>) jaxbUnmarshaller.unmarshal(file);

Теперь все работает. Я предполагаю, что причина в том, что ObjectFactory имеет аннотированный метод построения:

/**
 * Create an instance of {@link JAXBElement }{@code <}{@link NetType }{@code >}}
 * 
 */
@XmlElementDecl(namespace = "", name = "net")
public JAXBElement<NetType> createNet(NetType value) {
    return new JAXBElement<NetType>(_Net_QNAME, NetType.class, null, value);
}

Имхо, это действительно перепроектировано, но что угодно :)

person hfhc2    schedule 05.02.2016