gpt4 book ai didi

inheritance - 最佳 JAXB XJC 代码生成和最佳 XML 模式与继承

转载 作者:行者123 更新时间:2023-12-04 20:51:31 25 4
gpt4 key购买 nike

有很多类似的问题都集中在要优化的一个方面,但每个解决方案都有一个丑陋的缺点。

假设我想开发一个 XML 模式 (XSD),它允许以下文档并希望使用 XJC 生成类:

<Catalogue>
<Book>...</Book>
<Journal>...</Journal>
<Book>...</Book>
...
</Catalogue>

模式应该对类型层次结构进行建模( BookJournalPublication 的子类)。当然,这也应该
生成的 Java 类就是这种情况。

我尝试了以下方法,它们都有一个主要问题:

1.) 建模目录以包含 xsd:choice所有可能的亚型。
<xsd:complexType name="Catalogue">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="Book" />
<xsd:element ref="Magazine" />
</xsd:choice>
</xsd:complexType>

<xsd:element name="Publication" abstract="true" type="Publication" />
<xsd:element name="Book" type="Book"/>
<xsd:element name="Magazine" type="Magazine"/>

<xsd:complexType name="Publication">
<xsd:sequence></xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Book">
<xsd:complexContent>
<xsd:extension base="Publication">
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...

这里的问题是我必须在 choice 中提及所有可能的子类型。在实际应用中可能很多的元素。
一个小问题是,尽管 Catalogue属性具有正确的类型 List<Publication>它有一个丑陋的名字 bookAndMagazine .
由于冗余模式定义,不是一个选项!

2.) 建模目录包含xsd:sequence父类的
<xsd:complexType name="Catalogue">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="Publication" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:complexType>

这只有在 XML 文档的公式类似于 <Publication xsi:type="Book"...> 时才有效。 .因此,不是一个选择!

3.) 使用这里提到的替代组http://www.xfront.com/ElementHierarchy.html
<xsd:complexType name="Catalogue">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="Publication" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:complexType>

<xsd:element name="Publication" abstract="true" type="Publication" />
<xsd:element name="Book" type="Book" substitutionGroup="Publication"/>
<xsd:element name="Magazine" type="Magazine" substitutionGroup="Publication"/>

<xsd:complexType name="Publication">
<xsd:sequence></xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Book">
<xsd:complexContent>
<xsd:extension base="Publication">
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...

在这里,代码生成是问题,因为 Catalogue 的内部元素映射到 List<JaxbElement<? extends Publication>>而不是 List<Publication> .因此,这也不是一个选择。

如何将我的所有目标集中在一起?:
  • 对继承建模的规范的非冗余模式(例如在 2.中) 3.) )
  • 由该模式生成的简单而干净的 Java 类,这些类对继承进行建模(如 2.)部分在 1.) )
  • 干净的 XML 文档(不像 2.) )
  • 使用标准 JAXB,最好不要太多绑定(bind)元数据

  • 如果没有与所有这些目标相匹配的解决方案,您更喜欢哪一个?

    最佳答案

    我建议使用类似于您的第一个选项的东西,因为我从未见过更清洁的解决方案来解决这个问题。

    XSD

    <xs:element name="Publications" minOccurs="0">
    <xs:complexType>
    <xs:sequence>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="Magazine" type="magazine"/>
    <xs:element name="Book" type="book"/>
    </xs:choice>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    <xs:complexType name="magazine">
    <xs:complexContent>
    <xs:extension base="publication">
    <xs:sequence>
    <xs:element name="issueName" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="publication">
    <xs:sequence>
    <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    </xs:complexType>

    <xs:complexType name="book">
    <xs:complexContent>
    <xs:extension base="publication">
    <xs:sequence>
    <xs:element name="title" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>

    JAVA
    这是我用来生成上述 XSD 的 Java 代码。
    @XmlElements({
    @XmlElement(name="Magazine", type=Magazine.class),
    @XmlElement(name="Book", type=Book.class)
    })
    @XmlElementWrapper(name="Publications")
    public List<Publication> publications;

    关于inheritance - 最佳 JAXB XJC 代码生成和最佳 XML 模式与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10125966/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com