Marshall抽象类没有它的类型定义

时间:2010-08-30 11:44:26

标签: xsd abstract-class jaxb2

我尝试与here相反。我有一个抽象类,但我不希望输出抽象类的类型和标记。所以我需要一个输出,基本上看起来像

<?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

我当前(生成的)架构如下所示。

<?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 个答案:

答案 0 :(得分:1)

根据您提供的模式,我会说以下内容:请记住,XML Schema中复杂类型的继承与完全相同与您在Java中所期望的相同。

在架构/对象模型中,您有一个类型inhalt和一个继承自它的类型textinhalt是抽象的。到现在为止还挺好。不同之处在于类型的用法。您将类型inhalt分配给名为inhalt元素。这意味着只有inhalt元素可以出现在那里,而不是text,并且需要xsi:type override来指示正在使用哪个子类型(解析器无法猜测它)。

如果您使用替换组以及子类型,您可以实现您想要实现的目标,这将允许元素text出现。重构架构如下:

  1. 创建一个名为“inhalt”的全局元素,并键入“inhalt”(如果您认为这会让人感到困惑,请将类型名称设为大写)
  2. 创建名为“text”的全局元素并键入“text”。将“text”的替换组属性设置为“inhalt”。
  3. 将“marke”中的本地元素引用替换为对全局元素的引用。
  4. 供参考,以下是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内。