Java JAXB,如何为元素具有重复属性的模式生成类

Java JAXB,如何为元素具有重复属性的模式生成类,java,xsd,jaxb,Java,Xsd,Jaxb,我有一个模式,即。我希望使用Maven-Maven-jaxb2-plugin为其生成类 此模式允许以属性或元素的形式输入版本,因此它具有重复的属性。如何使用Jaxb为这种模式生成Java类(甚至可能),而不重命名属性或元素。基本上,我希望这个复制属性映射到某种复杂类型,内部指示它是属性还是元素。至少在我看来,这样的解决方案是XML最接近的表示形式 这样的事情能实现吗?如果是的话,怎么办 下面是有问题的xsd片段 <xs:complexType name="metalinkType">

我有一个模式,即。我希望使用Maven-Maven-jaxb2-plugin为其生成类

此模式允许以属性或元素的形式输入版本,因此它具有重复的属性。如何使用Jaxb为这种模式生成Java类(甚至可能),而不重命名属性或元素。基本上,我希望这个复制属性映射到某种复杂类型,内部指示它是属性还是元素。至少在我看来,这样的解决方案是XML最接近的表示形式

这样的事情能实现吗?如果是的话,怎么办

下面是有问题的xsd片段

<xs:complexType name="metalinkType">
    <xs:all>
        <xs:element minOccurs="0" name="description" type="xs:string"/>
        <xs:element minOccurs="0" name="identity" type="xs:string"/>
        <xs:element minOccurs="0" name="license" type="licenseType"/>
        <xs:element minOccurs="0" name="publisher" type="publisherType"/>
        <xs:element minOccurs="0" name="releasedate" type="RFC822DateTime"/>
        <xs:element minOccurs="0" name="tags" type="xs:string"/>
        <xs:element minOccurs="0" name="version" type="xs:string"/>
        <xs:element name="files" type="filesType"/>
    </xs:all>
    <xs:attribute name="version" type="xs:string" default="3.0"/>
    <xs:attribute name="origin" type="xs:anyURI"/>
    <xs:attribute name="type" default="static">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="dynamic"/>
                <xs:enumeration value="static"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="pubdate" type="RFC822DateTime"/>
    <xs:attribute name="refreshdate" type="RFC822DateTime"/>
    <xs:attribute name="generator" type="xs:string"/>
</xs:complexType>

编辑

对于这种模式,我希望Jaxb生成一个Java模型,如:

public class Metalink {
    private PropertyType<String> version;
    ...
}

public class PropertyType<T> {
    private T val;
    private boolean isAttribute;
    ...
}
公共类Metalink{
私有财产类型版本;
...
}
公共类属性类型{
私人旅行社;
私有布尔属性;
...
}

是否有可能实现类似的功能,或者是在Java模型中具有两个不同属性的唯一解决方案?

是的,可以通过

这是我为解决您的问题(属性和元素之间的名称冲突)而制作的一个小XSD:


是的,这个解决方案可以使模式编译,但它不是我所期望的。我试图实现的是,在Java模型中只有一个属性
version
,如果它是xml元素或属性,则以某种方式标记为info。这就是为什么主要的问题是它是否可能。如果你能做到,你希望如何设定这样的分数?通过某种setter方法??如果通过setter方法,我的解决方案有效,我将给你一个例子……你可以使用
@XmlJavaTypeAdapter
创建你想要的结构,但你总是会以基于两个属性的Jaxb Java模型结束。。。。我建议采取我的方法。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://hello"
    elementFormDefault="qualified"
    xmlns:tns="http://hello"
>
    <xs:element name="metalink" type="tns:metalinkType" />
    <xs:complexType name="metalinkType">
        <xs:sequence>
            <xs:element name="version" type="xs:string" minOccurs="1" />
        </xs:sequence>
        <xs:attribute name="version" type="xs:string" use="required" />
    </xs:complexType>
</xs:schema>
[ERROR] Property "Version" is already defined. Use <jaxb:property> to resolve this conflict
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://hello"
    elementFormDefault="qualified"
    xmlns:tns="http://hello"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" <!-- ADDED -->
    jaxb:version="1.0" <!-- ADDED -->
>
    <xs:element name="metalink" type="tns:metalinkType" />
    <xs:complexType name="metalinkType">
        <xs:sequence>
            <xs:element name="version" type="xs:string" minOccurs="1" />
        </xs:sequence>
        <xs:attribute name="version" type="xs:string" use="required" >
            <xs:annotation>
                <xs:appinfo>
                    <jaxb:property name="version2"/> <!-- ADDED! -->
                </xs:appinfo>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
</xs:schema>
// xml annotations
public class MetalinkType {
     ...
    @XmlElement(name = "version)
    private String version;
    ...
    @XmlAttribute(name = "version")
    private String version2;
    ...
    public void setVersion(String version, boolean asElem) {
        If (asElem) {
            this.version = version;
        } else {
            this.version2 = version;
        }
    }
    // individual setter as setVersion and setVersion2 are not exposed
}