【问题标题】:JAXB: Ignore order of elements while using xs:extensionJAXB:使用 xs:extension 时忽略元素的顺序
【发布时间】:2012-10-12 23:16:59
【问题描述】:

我们使用 JAXB 进行 Java-xml 绑定。我们最初创建了域类,然后使用 schemagen 命令行工具生成了以下模式。但生成的架构无效,并给出以下错误消息。

错误信息: cos-all-limited.1.2:一个所有模型组必须出现在一个粒子中,且{min发生} = {max发生} = 1,并且该粒子必须是构成复杂类型的 {content type} 对的一部分定义。

用例: 有两个类 Emp(Base class) 和 Dept(Child class)。
1. 元素顺序没有限制(即empId、deptId、deptName可以以任意顺序出现)。所以我们使用 xs:all 元素
2. 在 Dept 类中,deptId 字段应该只出现一次(minOccurs =1, maxOccurs=1),deptName 是可选的。
根据我的用例,我无法生成有效的模式。我确实在谷歌上搜索过。但我找不到解决方案。所以我期待专家可以回答这个问题。请你看看下面的类,模式并指导我正确的方向。

注意:请不要建议我创建一些临时域类。
感谢期待。

Emp.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="EmpType", propOrder={})
@XmlRootElement
public class Emp {

    @XmlElement(name="empId", required = true)
    private String empId;
}

Dept.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="DeptType", propOrder={})
public class Dept extends Emp
{

    @XmlElement(name="deptId", required = true)
    private String deptId;
    private String deptName;
}

Schema1.xsd

<?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="emp" type="EmpType"/>

  <xs:complexType name="EmpType">
    <xs:sequence>
      <xs:element name="empId" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DeptType">
    <xs:complexContent>
      <xs:extension base="EmpType">
        <xs:all>  <!--showing error message, mentioned above -->
          <xs:element name="deptId" type="xs:string" minOccurs="1" maxOccurs="1"/>
          <xs:element name="deptName" type="xs:string" minOccurs="0"/>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

【问题讨论】:

    标签: jaxb xsd jaxb2 xsd-validation


    【解决方案1】:

    您试图允许的文档结构实际上很难在 XML 模式中表示。您可能无法从 JAXB (JSR-222) 注释模型生成它。但是,您确实有几个选择:

    选项 #1 - 生成更简单的 XML 架构

    如果您没有使用 XML 架构验证 XML 内容,而只是将其用作人们可以用作指南的文档,那么我将删除 all 部分并改用 sequence。这将与您拥有的继承关系更好地工作。如果您未在 Unmarshaller 上指定 Schema 的实例,则不会强制执行元素顺序,因此您将能够读取所有符合您的规则的 XML 文档。

    选项 #2 - 创建您自己的 XML 架构

    如果您希望 XML 模式准确地反映所有可能接受的输入,那么您需要自己编写它。您可以使用包级别的 @XmlSchema 注释来引用这个现有的 XML 架构。

    @XmlSchema(location = "http://www.example.com/package/YourSchema.xsd")
    package com.example;
    
    import javax.xml.bind.annotation.XmlSchema;
    

    【讨论】:

    • 非常感谢您的详细回复。由于我们应该忽略顺序,我们删除了继承关系并使用 xs:all 创建了单独的类。
    猜你喜欢
    • 2011-02-10
    • 2011-06-29
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多