Карта JAXB2 xsd: ограничения как подклассы и (не) маршалл xsi: типы - PullRequest
0 голосов
/ 19 мая 2011

Я провел много исследований, пытаясь понять это, но я все еще неудачно.

У меня есть ряд XSD, которые следуют этой схеме:

Simple_Identification.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:include schemaLocation="./Base_3039.xsd"/>
       <xsd:include schemaLocation="./Simple_A.xsd"/>
       <xsd:include schemaLocation="./Simple_S.xsd"/>
       <xsd:include schemaLocation="./Simple_N.xsd"/>
       <xsd:include schemaLocation="./Simple_V1.xsd"/>
       <xsd:include schemaLocation="./Simple_L.xsd"/>
       <xsd:include schemaLocation="./Simple_V.xsd"/>
       <xsd:include schemaLocation="./Simple_C.xsd"/>
       <xsd:simpleType name="Simple_Identification">
               <xsd:restriction base="Base_3039"/>
       </xsd:simpleType>
</xsd:schema>

где, например Simple_S.xsd выглядит так:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="./Simple_Identification.xsd"/>
    <xsd:simpleType name="Simple_S">
      <xsd:restriction base="Simple_Identification">
           <xsd:minLength value="14"/>
           <xsd:maxLength value="14"/>
     </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

В конце концов, я хотел бы иметь возможность создавать файлы XML, содержащие Теги выглядят так:

<Identification xsi:type="Simple_S">XYZUVW</Identification>

Пока без включения mapSimpleTypeDef я могу marshall / unmarshall XML-файлы, игнорируя простые типы, такие как Simple_S.

После включения mapSimpleTypeDef классы генерируются для простого типы. Simple_Identification сопоставляется с классом, содержащим поле Base_3039. А класс Base_3039 содержит поле String. Однако классы для различных подтипов Simple_Identification не расширяют Simple_Identification, а содержат только поле типа Simple_Identification, которое не помогает при маршалинге / демаршаллинге.

Например, при демонтаже этого XML-файла:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
  <Identification>EDS-200708021031-950012222329</Identification>
  <Time>2007-08-02T10:31:44.449+01:00</Time>
  <Function>9</Function>
  <Sender>
    <Identity xsi:type="Simple_S">111111380002111</Identity>
 </Sender>
</Header>

значение Identity распаковывается в объект Simple_Identification, а не в специализированный объект Simple_S. Более того, если я верну все атрибуты xsi: type, они будут потеряны в сгенерированном XML.

Итак, в основном, мой вопрос заключается в том, как правильно разобрать и сгенерировать XML, содержащие типы xsi :. Разве схемы, с которыми я работаю, не подходят для этого? Разве xsd: ограничение не интерпретируется JAXB как тип наследования?

Обратите внимание, что XSD не мои изменения, я просто должен работать с ними, чтобы правильно читать и генерировать XML.

Спасибо, что нашли время помочь мне разобраться!

-Anca

1 Ответ

0 голосов
/ 19 мая 2011

JAXB поддерживает xsi:type, но вы будете видеть только сгенерированные различные подклассы (и созданные объекты экземпляров) при работе со сложными типами, а не с простыми типами.

Ограничение простого типа с использованием только фасета не приводит к созданию нового класса с JAXB. Это связано с тем, что в чисто объектно-ориентированном виде производный класс в любом случае будет выглядеть точно так же, как и суперкласс.

...