2

我在两种不同的复杂类型的 xml 中具有相同的元素 id,如果我尝试使用 maven Jaxb 插件进行解析,我会得到以下异常,有没有办法在绑定的帮助下使用元素重命名来解析,因为我在模式中至少有 30 次属性 ID。提前致谢

com.sun.istack.SAXParseException2:属性“Id”已定义。使用 <jaxb:property> 解决此冲突。

            <xs:element name="aliases" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="alias" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element ref="tran" minOccurs="0"/>
                                    <xs:element name="id">
                                        <xs:complexType>
                                            <xs:simpleContent>
                                                <xs:extension base="xs:string">
                                                    <xs:attribute name="old_value" type="xs:string"/>
                                                </xs:extension>
                                            </xs:simpleContent>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                                <xs:attribute name="end" type="xs:string"/>
                                <xs:attribute name="start" type="xs:string"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>



<xs:element name="tin_affiliation">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="tran" minOccurs="0"/>
            <xs:element name="id">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="old_value" type="xs:string"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="end" type="xs:string"/>
        <xs:attribute name="start" type="xs:string"/>
    </xs:complexType>
</xs:element>
4

3 回答 3

1

使用绑定文件的另一种解决方案是单独声明 ID 类型。因为它在两个元素中看起来相同,并且由于这种情况下的冲突是由于重复的类型声明造成的。

Schema 将如下所示。

注意:它已经过测试并且可以工作,但<xs:element ref="tran" minOccurs="0"/>由于我没有定义,所以必须发表评论。

架构

<xs:element name="aliases">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="alias" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <!--<xs:element ref="tran" minOccurs="0"/> -->
                        <xs:element name="id" type="idType" />
                    </xs:sequence>
                    <xs:attribute name="end" type="xs:string"/>
                    <xs:attribute name="start" type="xs:string"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="tin_affiliation">
    <xs:complexType>
        <xs:sequence>
            <!-- <xs:element ref="tran" minOccurs="0"/> -->
            <xs:element name="id" type="idType" />
        </xs:sequence>
        <xs:attribute name="end" type="xs:string"/>
        <xs:attribute name="start" type="xs:string"/>
    </xs:complexType>
</xs:element>

<xs:complexType name="idType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="old_value" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

生成的 Java 类:IdType

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

    @XmlValue
    protected String value;
    @XmlAttribute(name = "old_value")
    protected String oldValue;

    /**
     * Gets the value of the value property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getValue() {
        return value;
    }

    /**
     * Sets the value of the value property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setValue(String value) {
        this.value = value;
    }

    /**
     * Gets the value of the oldValue property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getOldValue() {
        return oldValue;
    }

    /**
     * Sets the value of the oldValue property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setOldValue(String value) {
        this.oldValue = value;
    }

}

生成的 Java 类:TinAffiliation

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "id"
})
@XmlRootElement(name = "tin_affiliation")
public class TinAffiliation {

    @XmlElement(required = true)
    protected IdType id;
    @XmlAttribute(name = "end")
    protected String end;
    @XmlAttribute(name = "start")
    protected String start;

    /**
     * Gets the value of the id property.
     * 
     * @return
     *     possible object is
     *     {@link IdType }
     *     
     */
    public IdType getId() {
        return id;
    }

    /**
     * Sets the value of the id property.
     * 
     * @param value
     *     allowed object is
     *     {@link IdType }
     *     
     */
    public void setId(IdType value) {
        this.id = value;
    }

    /**
     * Gets the value of the end property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getEnd() {
        return end;
    }

    /**
     * Sets the value of the end property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setEnd(String value) {
        this.end = value;
    }

    /**
     * Gets the value of the start property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getStart() {
        return start;
    }

    /**
     * Sets the value of the start property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setStart(String value) {
        this.start = value;
    }

}
于 2013-08-28T08:32:18.873 回答
0

您的 XML 元素中可以有多个同名的 XML 属性/元素,没有任何问题。您看到的例外情况是,这会导致生成的类具有两个同名的属性。这可能发生在以下情况。

  1. 复杂类型包含同名的属性和元素。
  2. 复杂类型包含与作为其扩展的复杂类型的属性/元素同名的属性/元素。
于 2013-08-26T21:22:03.667 回答
0

我可以使用插件 org.codehaus.mojo: jaxb2-maven-plugin: 2.3 和 org.jvnet.jaxb2_commons:jaxb2-basics-annotate:0.6.4 以及以下绑定配置来实现这一点,特别是multiple="true

<jxb:bindings node=".//xs:attribute[@name='abc]"
                multiple="true">
                <jxb:property name="abc_attribute" />
            </jxb:bindings>
        </jxb:bindings>
于 2013-09-09T20:21:30.520 回答