我有一些旧版 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 个解决方案:
- 什么都不改变
- 通过声明所有可能的元素(和子元素)来完成 XSD,使我能够对
Param
类中的每个元素进行特定访问。 - 在
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/