Маршал / демаршал, когда есть 2 XmlRootElements из 2 файлов xsd

1

Что-то говорит мне, что я выполняю шоу ужасов Java с xsd для генерации класса через JAXB... Надеюсь, кто-то может сказать мне, что!

Мне предоставили несколько связанных XSD, и мне нужно иметь возможность взаимодействовать с API. Скажем, есть A.xsd и B.xsd. A.xsd определяет элемент body, который может по существу содержать список любого типа, включая B-объекты:

<xsd:element name="Body" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:anyAttribute namespace="##any"/>
</xsd:complexType>
</xsd:element>

Поэтому я генерирую классы для A.xsd, чей корневой элемент помечен следующим образом:

@XmlRootElement(name = "A", namespace = "http://www.example.com/a")
public class A {

И я создаю package-info.java в том же пакете, чтобы иметь это пространство имен, чтобы я мог его маршалировать:

@XmlSchema(namespace = "http://www.example.com/a", elementFormDefault = XmlNsForm.QUALIFIED)
package com.mypackage;

Теперь я генерирую классы для B.xsd в один и тот же пакет. (Я переименовал A ObjectFactory в нечто другое, потому что IntelliJ не добавляет завод).

(EDIT: я также создал их в разных пакетах, но затем я получаю проблемы с сортировкой, потому что для запроса xml нужны как A, так и B.)

(Суб-вопрос - так вы обычно это делаете?)

Итак, класс B теперь имеет:

@XmlRootElement(name = "B")
public class B {

С этим я могу теперь создать A и маршал его. Я не получаю неприятный ns2, когда я вставляю B в тело благодаря package-info.java (a la Java: Marshalling Object - Удаление дополнительной аннотации ns2 в xml).

Ответное сообщение, которое я получаю от API, также дает мне A, который я могу отключить без проблемы. НО основной объект в теле, который должен быть B, не получит unmarshalled - это объект Node, поэтому я попытался:

JAXBContext specialContext = JAXBContext.newInstance(B.class);
Object companyAppt = specialContext.createUnmarshaller().unmarshal((Node)reply.getBody().getAny().get(0));

Но я получаю это исключение:

javax.xml.bind.UnmarshalException: unexpected element (uri:"/some/uri/location", local:"B"). Expected elements are <{http://www.example.com/a}B>

Поэтому я думаю, что ответ кроется в том, что package-info.java но я просто не знаю, как манипулировать им.

Заранее спасибо.

РЕДАКТИРОВАТЬ

Здесь xsd я работаю с:

"А" в моем примере = http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch-v2-0.xsd

"B" в моем exmaple = http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd

Другие зависимые xds: http://xmlgw.companieshouse.gov.uk/v1-0/schema/chbase-v2-1.xsd

  • 0
    Можете ли вы, пожалуйста, добавьте chbase-v2-1.xsd
Теги:
jaxb
xsd

1 ответ

0

Почему вы не создаете классы Jaxb с помощью xjc, где вы можете передать несколько xsds и использовать файл привязок, если есть конфликт.

xjc -d out A.xsd B.xsd

  • 0
    Спасибо, попробовал это, но это дает мне много [com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions исключений [com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions , но неудобно не говорит мне, где! Следовательно, xjc по одному.
  • 0
    Можете ли вы опубликовать свои xsds здесь. Вы пробовали генерировать, используя Eclipse? мы сделали это раньше.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню