在Java代码中改进xsd:any的使用

时间:2015-07-22 13:45:32

标签: java xsd jaxb

我在我的一个软件中导入了一些遗留的XML文档。导致我一些麻烦的部分是 Param 元素的内容:

sample.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中列出所有这些元素,这已被声明如下:

Schema.xsd

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

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

Param.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">的情况可能会有问题。
  4. 所以,我正在寻找一些建议,通过提出另一种解决方案来选择这三种解决方案中的一种 OR

1 个答案:

答案 0 :(得分:1)

我的意见;

  • 我想说,如果你知道什么可能100%肯定,选项2是你的选择。然而,对XSD进行建模可能会很痛苦。
  • 选项3对我来说似乎不可行,深度为&gt;的反例。 2是一个例子。
  • 最后,我参与了选项1的项目,并且也应该考虑它(你需要编写和维护代码,但要使其工作非常简单)。