【问题标题】:ATTRIBUTE GROUP - Property "Value" is already defined. Use <jaxb:property> to resolve this conflict属性组 - 属性“值”已定义。使用 <jaxb:property> 解决此冲突
【发布时间】:2025-12-30 04:20:11
【问题描述】:

问题陈述

我已经定义了以下 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xc="XmlCache" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import namespace="XmlCache" schemaLocation="mdml/com/mycompany/mds/mdml/schema/xc.xsd"/>
    <xs:element name="MarketData">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="xc:XmlCache" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

元素xc:XmlCache在文件mdml/com/mycompany/mds/mdml/schema/xc.xsd中定义。

我想基于这个 XSD 生成 Java 类,使用 jaxb(带有插件 jaxb2-maven-plugin)。

错误

我在编译过程中不断收到以下错误:

[错误] jar:file:/C:/Users/miannizzotto/.m2/repository/com/sun/xml/bind/jaxb-xjc/2.1.13/jaxb-xjc-2.1.13.jar!/ com/sun/xml/xsom/impl/parser/datatypes.xsd[14,33] com.sun.istack.SAXParseException2; systemId: jar:file:/C:/Users/miannizzotto/.m2/repository/com/sun/xml/bind/jaxb-xjc/2.1.13/jaxb-xjc-2.1.13.jar!/com/sun/ xml/xsom/impl/parser/datatypes.xsd;行号:14;列号:33;属性“值”已定义。使用 解决此冲突。

紧随其后

[错误] 文件:/D:/v3.1.build.dev.asset.x.91253.5.4.dev/component/legacy/sdk/product-api/api/src/main/xsd/mdml/ com/mycompany/mds/mdml/schema/xc.xsd[57,63] com.sun.istack.SAXParseException2; systemId: 文件:/D:/v3.1.build.dev.asset.x.91253.5.4.dev/component/legacy/sdk/product-api/api/src/main/xsd/mdml/com/mycompany/ mds/mdml/schema/xc.xsd;行号:57;列号:63;以下位置与上述er相关

有罪档案的结构

文件mdml/com/mycompany/mds/mdml/schema/xc.xsd 非常大,但我将只在下面列出有罪的部分(第 57 行及其树的主要节点):

<?xml version="1.0"?>
<!DOCTYPE xs:schema>
    ...
    <xs:attributeGroup name="valueAtt">
        <xs:attribute name="value" use="optional" form="qualified"/> <!--this is line 57-->
    </xs:attributeGroup>
    ...
</xs:schema>

到目前为止我尝试了什么?

我尝试过使用我的绑定文件,但以下所有尝试仍会导致相同的错误。

尝试 1 (灵感来自this question and its answers

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               jaxb:extensionBindingPrefixes="xjc"
               jaxb:version="1.0">

    <jaxb:bindings schemaLocation="../xsd/MarketData.xsd" >

        <jaxb:bindings node=".//xs:attributeGroup[@name='valueAtt']">
            <jaxb:bindings node=".//xs:attribute[@name='value']">
                <jaxb:property name="ValueAttribute"/>
            </jaxb:bindings>
        </jaxb:bindings>

    </jaxb:bindings>
</jaxb:bindings>

(尝试获取“attributeGroup”类型的节点“valueAtt”,然后获取“attribute”类型的节点“value”,并将其重命名为“ValueAttribute”。

尝试 2 (灵感来自this question

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               jaxb:extensionBindingPrefixes="xjc"
               jaxb:version="1.0">

    <jaxb:bindings schemaLocation="../xsd/MarketData.xsd" >

        <jaxb:bindings node=".//xs:element[@name=MarketData]/xs:complexType/xs:sequence/xs:element[@ref=XmlCache]">
            <jaxb:bindings node=".//xs:attributeGroup[@name='valueAtt']">
                <jaxb:bindings node=".//xs:attribute[@name='value']">
                    <jaxb:property name="ValueAttribute"/>
                </jaxb:bindings>
            </jaxb:bindings>
        </jaxb:bindings>

    </jaxb:bindings>
</jaxb:bindings>

(与上一次尝试的主要区别是这里我尝试使用@ref通过引用选择节点XmlCache,因为问题发生在另一个XSD中)。

尝试 3 (灵感只是直觉问题发生在另一个 XSD 中,这只是在我的 XSD 中引用):

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               jaxb:extensionBindingPrefixes="xjc"
               jaxb:version="1.0">

    <jaxb:bindings schemaLocation="../xsd/mdml/com/mycompany/mds/mdml/schema/xc.xsd"
    node="//xs:attributeGroup[@name=valueAtt]/xs:attribute[@name=value]">
        <jaxb:property name="ValueAttribute"/>
    </jaxb:bindings>
</jaxb:bindings>

我做错了什么?有人可以帮忙吗?

【问题讨论】:

    标签: java xsd jaxb jaxb2-maven-plugin


    【解决方案1】:

    最后,解决方案如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                   xmlns:xs="http://www.w3.org/2001/XMLSchema"
                   xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                   jaxb:extensionBindingPrefixes="xjc"
                   jaxb:version="1.0">
    
        <jaxb:bindings schemaLocation="../xsd/mdml/com/mycompany/mds/mdml/schema/xc.xsd"
        node="//xs:attributeGroup[@name='valueAtt']/xs:attribute[@name='value']">
            <jaxb:property name="ValueAttribute"/>
        </jaxb:bindings>
    </jaxb:bindings>
    

    基本上这是我的尝试 3,将属性名称包裹在单引号周围。

    【讨论】: