java - XJC xs :choice inheritance

标签 java jaxb xsd jaxb2 xjc

我在让 xjc 生成一个具有维持顺序的选择组扩展的类时遇到问题。以下架构是一个示例。

<xs:complexType name="base">
  <xs:choice maxOccurs="unbounded">
    <xs:element name="a" />
    <xs:element name="b" />
  </xs:choice>
</xs:complexType>

<xs:complexType name="extended">
  <xs:complexContent>
    <xs:extension base="base">
      <xs:choice>
        <xs:element name="c" />
      </xs:choice>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

问题是,这会导致基类和扩展类都包含列表属性,而不是扩展类仅添加到基列表属性,以便在以下 xml 的情况下可以保持顺序:

<extended>
  <a />
  <c />
  <b />
</extended>

我尝试在绑定(bind).xjb 中手动将属性名称设置为相同,但由于命名冲突而出现提示。

最佳答案

在这里,您想要扩展可能的选择列表,而不是类型。为此,您应该使用如下模式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="base">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:group ref="baseGroup"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name="extended">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:group ref="extendedGroup"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:group name="baseGroup">
    <xs:choice>
      <xs:element name="a" />
      <xs:element name="b" />
    </xs:choice>
  </xs:group>

  <xs:group name="extendedGroup">
    <xs:choice>
      <xs:group ref="baseGroup" />
      <xs:element name="c" />
    </xs:choice>
  </xs:group>

</xs:schema>

我尝试在 http://www.xmlvalidation.com/ 上验证以下文件使用上面的 xmlschema,它可以正常工作,不会出现错误:

<?xml version="1.0" encoding="ISO-8859-1"?>
<extended>
  <a />
  <c />
  <b />
</extended>

关于java - XJC xs :choice inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290025/

相关文章:

java - 在 JavaFX 中动态添加 CSS 样式表

java - 使用带有 namespace 和模式的 Jaxb 进行 XML 解码

java - 有没有办法用 xmlBeans 处理多个 xsd 版本?

java - 无法添加或更新表

java - JSP 错误页面会导致问题吗?

java - 为什么我的 RadioButtons 和 JLabels 没有显示?

java - jaxb:意外元素(uri :"",本地 :"head")- 没有 "head"元素

java - 如何使用 JAXB 对元素进行逻辑分组?

java - JAXB 属性绑定(bind) - 为什么需要它

java - 从 Java 类还是从 XML 创建 XSD?