【发布时间】:2017-06-22 14:59:29
【问题描述】:
我有以下 Map 包含 Double 或 Integer 实例作为值,它们都扩展了抽象类 Number,注释如下:
@XmlElement(name="settings")
private Map<String,Number> settings;
它被编组到 XML 中:
<settings>
<entry>
<key>SETTING_A</key>
<value xsi:type="xs:double">0.03</value>
</entry>
<entry>
<key>SETTING_B</key>
<value xsi:type="xs:int">1000</value>
</entry>
</settings>
我还需要为这种类型的 XML 提供 XSD,这就是我遇到问题的地方。我试图用一个选项定义一个 complexType,但它不起作用,因为包含 int 的元素和包含 double 的元素不能具有相同的名称(即它们不能都命名为“value” ),这正是 JAXB 生成的 XML 所做的。
以下 XSD 可以使用,但我不想使用不同的元素名称(或):
<xsd:complexType name="Entry">
<xsd:sequence>
<xsd:element name="key" type="NimrodSettingKey" minOccurs="1" maxOccurs="1"/>
<xsd:choice>
<xsd:element name="double" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<xsd:element name="int" type="xsd:integer" minOccurs="1" maxOccurs="1"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
关于如何在我的 XSD 文档中指定元素可以是 int 或 double 的任何建议?
谢谢!
编辑#1
@svasa 建议在我的 XSD 中使用以下方法,它为选项中的元素赋予相同的名称:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Settings"/>
<xsd:complexType name="Settings">
<xsd:sequence>
<xsd:element name="key" type="xsd:string" minOccurs="1" maxOccurs="1" />
<xsd:choice>
<xsd:element name="value" xs:type="xsi:double" minOccurs="1" maxOccurs="1" />
<xsd:element name="value" xs:type="xsi:integer" minOccurs="1" maxOccurs="1" />
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
但我的 XSD 编辑器抱怨此错误:
complex type 'Settings' violates the unique particle attribution rule in its components 'value' and 'value'
我认为这意味着下面的两个元素必须各自具有不同的名称,它们不能都被命名为“值”。
【问题讨论】:
-
the values that contain an int and those that contain a number can't have the same name是指key不能与int和double同名吗? -
是的,例如 key=SETTING_A value=0.5d(双精度)和 key=SETTING_B value=1000(和 int)。
标签: java xml xsd jaxb abstract-class