Абстрактный класс Маршалла без определения его типа - PullRequest
1 голос
/ 30 августа 2010

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <text>This is a test</text>
    </marke>
</dokument>

, а не

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <inhalt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text">
            <text>This is a test</text>
        </inhalt>
    </marke>
</dokument>

Text унаследовано от абстрактного класса Inhalt.

Myтекущая (сгенерированная) схема показана ниже.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="dokument" type="dokument"/>

  <xs:complexType name="dokument">
    <xs:sequence>
      <xs:element name="marke" type="marke" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="vorlage" type="xs:string" use="required"/>
    <xs:attribute name="ausgabe" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="marke">
    <xs:sequence>
      <xs:element name="inhalt" type="inhalt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="typ" type="markenTyp" use="required"/>
  </xs:complexType>

  <xs:complexType name="inhalt" abstract="true">
    <xs:sequence/>
    <xs:attribute name="style" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="text">
    <xs:complexContent>
      <xs:extension base="inhalt">
        <xs:sequence>
          <xs:element name="text" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:simpleType name="markenTyp">
    <xs:restriction base="xs:string">
      <xs:enumeration value="text"/>
      <xs:enumeration value="tabelle"/>
      <xs:enumeration value="liste"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

1 Ответ

1 голос
/ 02 сентября 2010

Исходя из предоставленной вами схемы, я бы сказал следующее: помните, что наследование сложных типов в XML-схеме не точно , как вы ожидаете в Java.

В вашей схеме / объектной модели у вас есть тип inhalt и тип text, который наследуется от него.inhalt абстрактно.Все идет нормально.Разница заключается в использовании типов.Вы присваиваете тип inhalt элементу с именем inhalt.Это означает, что там может появиться только элемент inhalt, а не text, а переопределение xsi: type необходимо, чтобы указать, какой подтип используется (парсер не может его угадать).

Вы можете достичь того, чтовы хотите достичь, если вы используете группу подстановки в дополнение к подтипу, это позволит элементу text появиться.Выполните рефакторинг схемы следующим образом:

  1. Создайте глобальный элемент с именем «inhalt» и введите «inhalt» (введите имя типа в верхнем регистре, если вы считаете, что это не так)
  2. Создайте глобальный элемент с именем «текст» и типом «текст».Установите для атрибута группы подстановки «text» значение «inhalt».
  3. Замените ссылку на локальный элемент в «marke» ссылкой на глобальный элемент.

Для справки здесьэто новая модель marke:

<xs:element name="inhalt" type="inhalt"/>
<xs:element name="text" type="text" substitutionGroup="inhalt"/>
<xs:complexType name="marke">
    <xs:sequence>
        <xs:element ref="inhalt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="typ" type="markenTyp" use="required"/>
</xs:complexType>

После этого text может появиться внутри marke.

...