java - 改进 xsd :any in Java code 的使用

标签 java xsd jaxb

我有一些旧版 XML 文档需要导入到我的一款软件中。目前给我带来一些麻烦的部分是 Param 元素的内容:

示例.xml

<...>
    <Param>
        <IdNumber>12345678</IdNumber>
        <Factor>12.3</Factor>
        <Date>2015-07-01</Date>
        <Counter unit="1">
            <Medium>1</Medium>
            ...
        </Counter>
        <Counter unit="2">
            <Medium>4</Medium>
            ...
        </Counter>
        ...
    </Param>
</...>

Param 中可以有许多(数量可能不同)子元素,为了避免在 XSD 中列出所有子元素,声明如下:

架构.xsd

...
<xs:element name="Param">
    <xs:complexType>
        <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
        </xs:sequence>
    </xs:complexType>
</xs:element>
...

当我使用 XJC 工具生成用于编码/解码的一对一类时,我得到的是:

参数.java

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

    @XmlAnyElement
    protected List<Element> any;

    public List<Element> getAny() {
        if (any == null) {
            any = new ArrayList<Element>();
        }
        return this.any;
    }

}

我的问题是使用 Param 类并不容易,因为它只包含 Element 列表,需要改进。

我看到 3 个解决方案:

  1. 什么都不改变
  2. 通过声明所有可能的元素(和子元素)来完成 XSD,使我能够对 Param 类中的每个元素进行特定访问。
  3. Param 中使用 Map 而不是列表,以简化搜索/提取元素。虽然我不知道如何实现这一点,并且 <Counter unit="1"><Counter unit="2"> 的情况可能会出现问题。

因此,我正在寻求一些建议,以选择这三种解决方案中的一种提出另一种解决方案。

最佳答案

我的看法;

  • 我想说,如果您百分百确定会发生什么,那么选项 2 就是您的选择。然而,对 XSD 进行建模可能会很痛苦。
  • 选项 3 对我来说似乎不可行,深度 > 2 的反例就是一个例子。
  • 最后,我曾参与过采用选项 1 的项目,因此也应该考虑它(您需要编写和维护代码,但使其工作非常简单)。

关于java - 改进 xsd :any in Java code 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31564991/

相关文章:

c# - 基于 XSD 的 .Net XML 序列化?

java - 使用接口(interface)解码复杂类型的 JAXB/Jersey 问题

soap - 如何告诉 JAXB 不要生成 @XmlSchemaType 注释

java - 在 hyperjaxb 中自定义 hibernate 属性

java - 设置 XSSFSheet 的顶行和左列

java - Postgres JDBC 驱动程序 : PSQLException: syntax error at or near RETURNING

java - 从 mysql 检索数据并将其放入 JTables

java - 静态内部类和类的静态成员共享同名?

xml - 如何使用 XSD 导入/包含其他 XSD 文件验证 xml?

c# - 如何在 WCF 服务中使用 RequestContext 映射路径