当前位置: 首页 > 面试题库 >

JAXB-在xsd:all内部具有不受限制的maxOccur的元素

贺皓
2023-03-14
问题内容

假设我有以下java类,它映射到我的REST服务的请求主体以搜索用户。

@XmlRootElement(name = "SearchParams")
@XmlType(propOrder = {})
public class SearchParams {

  private String firstname;
  private String lastname;
  private List<String> role;

  ...
}

注意 @XmlType* 批注的 propOrder 参数-它声明表示单个属性在XML文件中出现的顺序无关紧要,因此在生成的XSD模式中应使用
xsd:all 而不是 xsd:sequence
*

但是,如您所见,属性之一( 角色 属性)是一个列表,因此对应于具有 无界maxOccurs 的元素。

似乎在 xsd:all complexType中* 不允许具有 maxOccurs无限制 的元素。如何避免这个问题? *

需要注意的是,不同的角色,将 名字姓氏 具有 的maxOccurs1 。因此,我不能使用
无限制的xsd:choice 而不是 xsd:all


问题答案:

假设您仍然可以修改此模型,则可以将角色列表包装为自己的类型,因此最终得到一个<roles>带有<role>s 列表的元素

<SearchParams>
    <firstname>firstname</firstname>
    <lastname>lastname</lastname>
    <roles>
        <role>role</role>
    </roles>
</SearchParams>

XSD将是

<xsd:schema ... >

    <xsd:element name="SearchParams">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="firstname" type="xsd:string" />
                <xsd:element name="lastname" type="xsd:string" />
                <xsd:element name="roles" type="Roles" />
            </xsd:all>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="Roles">
        <xsd:sequence>
            <xsd:element name="role" type="xsd:string" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

而且您将有两个班级。Roles包含列表的类。海事组织,这是一种更清洁的方法。(您可以Roles将其设为匿名,但随后您将陷入静态的内部类中)

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {

})
@XmlRootElement(name = "SearchParams")
public class SearchParams {

    @XmlElement(required = true)
    protected String firstname;
    @XmlElement(required = true)
    protected String lastname;
    @XmlElement(required = true)
    protected Roles roles;
    ...
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Roles", propOrder = {
    "role"
})
public class Roles {

    @XmlElement(required = true)
    protected List<String> role;
    ...
}

更新

“如果我可以通过这种方式更改模型类,那么这将是解决此问题的好方法。不幸的是,我只允许更改注释”

您可以使用@XmlList

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {

})
@XmlRootElement(name = "SearchParams")
public class SearchParams {

    @XmlElement(required = true)
    protected String firstname;
    @XmlElement(required = true)
    protected String lastname;
    @XmlList
    @XmlElement(required = true)
    protected List<String> role;
    ...
}

xsd看起来像

<xsd:element name="SearchParams">
    <xsd:complexType>
        <xsd:all>
            <xsd:element name="firstname" type="xsd:string" />
            <xsd:element name="lastname" type="xsd:string" />
            <xsd:element name="role">
                <xsd:simpleType>
                    <xsd:list itemType="xsd:string" />
                </xsd:simpleType>
            </xsd:element>
        </xsd:all>
    </xsd:complexType>
</xsd:element>

注: 如前所述 这里
,这种方法是一种“危险的”,我在文章的开头的解决方案优于使用list字符串类型的。但在您的特定情况下,不确定我是否看到另一种方式



 类似资料:
  • 我得到以下错误: 我尝试了以下几种方式,

  • 问题内容: 我有一个如下形式的XML: 如何使用JAXB批注将所有内容映射到String值。 那呢 问题答案: 您可以使用注释并指定一个DOMHandler来将DOM片段与String值相互转换。 举一个完整的例子 http://blog.bdoughan.com/2011/04/xmlanyelement-and-non-dom-properties.html

  • 我有下面的xml结构: 有不同的 Field(X) 包装器元素,它们包含相同的用户元素。XML 中可以发送 n 个字段。因此,我不能为每个单独的Jaxb。我需要访问用户,但在取消编组步骤后忽略 Field 元素。不幸的是,我无权更改xml结构。我无法找到解决方案。任何指针都会有所帮助。

  • 有太多关于大致相同主题的问题,但我找不到我想要的。如果我错过了,我很抱歉。 我正在尝试散集具有公共逻辑元素但使用不同标记定义的XML文件: 两个<代码> 我可以这样做: 所需要的只是在和中实现并分别返回或。 然而,在中有一个属性并以某种方式告诉JAXB将这两个字段映射到它似乎更简单。 我是不是想多了?你将如何实现它? (当然,我无法控制输入XML。如果可能的话,我还想避免使用MOXy的解决方案,因

  • 我已经读过hashtable的各种变体,但我不清楚哪种更适合内存不足的系统(我们有一个内存限制) 线性/二次探测适用于稀疏表<我认为双重散列在这方面与二次散列相同 外部链接与群集无关 我检查过的大多数教科书似乎都假设总会有额外的空间可用,但实际上,在我看到的大多数示例实现中,由于哈希表从未减半,因此占用的空间比实际需要的要多得多 那么,当我们想充分利用内存时,哈希表的哪种变体最有效? 更新: 所以