如何在xjc生成的类中访问xs:anySimpleType元素的xsi:type属性?

How to access xsi:type attribute of a xs:anySimpleType element in xjc generated class?

提问人:Hernando Scheidl 提问时间:11/14/2023 更新时间:11/14/2023 访问量:34

问:

我需要封送和取消封送包含如下结构的 XML:

<Parameter>
    <Name>Country</Name>
    <Value xsi:type="xsd:string">Uruguay</Value>
</Parameter>

在以下架构片段中定义:

<xs:complexType name="Parameter">
    <xs:sequence>
        <xs:element name="Name">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:maxLength value="256"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="Value" type="xs:anySimpleType"/>
    </xs:sequence>
</xs:complexType>

为上述架构生成的带有 xjc 的类如下:

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

    @XmlElement(name = "Name", required = true)
    protected String name;
    @XmlElement(name = "Value", required = true)
    protected Object value;

    public String getName() {
        return name;
    }

    public void setName(String value) {
        this.name = value;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

}

如您所见,元素中的属性在类中不存在。我需要将其作为业务需求进行访问。xsi:typeValueParameter

我尝试过像这样修改原始架构:

<xs:complexType name="ParameterValue">
    <xs:simpleContent>
        <xs:extension base="xs:anySimpleType">
            <xs:attribute name="type" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:complexType name="Parameter">
    <xs:sequence>
        <xs:element name="Name">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:maxLength value="256"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="Value" type="ParameterValue"/>
    </xs:sequence>
</xs:complexType>

因此,类中的属性是同时包含类型和实际值的类型。这样我就有了类型的 getter,但类型和值现在是“解耦”的。我的意思是,在封送时,必须手动设置类型,而不是从值推断出来的。valueParameterParameterValue

有没有更好的方法来处理 anySimpleType 元素?

java xsd jaxb xjc

评论

0赞 Karsten 11/15/2023
在 XML 文档中使用多态值时,会隐式使用 xsi:type。它充当解析器将值映射到特定(在本例中为 Java 类型)的提示。在编组过程中完成类型转换后,它被认为是不必要的,这就是为什么你在 Java 类中看不到它的原因。我不知道你的商业案例,也无法想象你想从属性中得出什么信息,所以我不能在这里进一步提供帮助。

答: 暂无答案