1

我们使用 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 element
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;
}

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

1 回答 1

1

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

选项 #1 - 生成更简单的 XML 模式

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

选项 #2 - 创建您自己的 XML 模式

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

@XmlSchema(location = "http://www.example.com/package/YourSchema.xsd")
package com.example;

import javax.xml.bind.annotation.XmlSchema;
于 2012-10-24T16:32:49.897 回答