JaxB 重命名具有重复名称的类

JaxB rename class with duplicate name(JaxB 重命名具有重复名称的类)
本文介绍了JaxB 重命名具有重复名称的类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我必须使用包含以下片段的架构,其中名称 object 重复.

I have to use a schema which contains the following snippet where the name object is duplicated.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="param_object_type">
        <xs:sequence>
            <xs:element name="object" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="object" minOccurs="0" maxOccurs="unbounded">
                </xs:sequence>
            </xs:complexType>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

Jaxb 最初很乐意导入它,但由于 Object 类被声明了两次,因此无法编译源代码.

Jaxb was originally happy to import this, but would fail to compile the sources since the Object class was declared twice.

我添加了 globalBindings 选项 localScoping="toplevel" 现在这会导致以下编译时错误:

I added globalBindings option localScoping="toplevel" and this now leads to the following compile time error:

org.xml.sax.SAXParseException;systemId:具有相同名称jaxb.Object"的类/接口已在使用中.使用类自定义来解决此冲突.

所以我尝试添加自定义绑定来重命名对象之一,jaxb:classjaxb:property.两者都产生相同的错误.

So I tried adding a custom binding to rename one of the objects, jaxb:class and jaxb:property. Both produce the same error.

如果有帮助,这是我的绑定文件:

If it helps, here is my bindings file:

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false" fixedAttributeAsConstantProperty="true" choiceContentProperty="true" localScoping="toplevel"/>
    </jaxb:bindings>
    <jaxb:bindings  schemaLocation="../xsd/NodeSchema.xsd" node="/xs:schema">
        <jaxb:bindings node="/xs:schema/xs:complexType[@name='param_object_type']/xs:sequence/xs:element[@name='object']">
            <jaxb:class name="object2"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

如何确保其中一个实例被重命名而另一个保持不变?

How can I make sure that one of these instances gets renamed and the other is left intact?

推荐答案

正确的复杂类型.. xs:element

XSD

<xs:complexType name="param_object_type">
    <xs:sequence>
        <xs:element name="object" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="object" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

绑定

<jxb:bindings node="//xs:schema//xs:complexType[@name='param_object_type']//xs:sequence//xs:element[@name='object']//xs:complexType//xs:sequence//xs:element[@name='object']">
    <jxb:class name="object2" />
</jxb:bindings>

ParamObjectType.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "param_object_type", propOrder = {
    "object"
})
public class ParamObjectType
    implements Serializable
{

    private final static long serialVersionUID = 2L;
    protected List<ParamObjectType.Object> object;

    /**
     * Gets the value of the object property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the object property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getObject().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ParamObjectType.Object }
     * 
     * 
     */
    public List<ParamObjectType.Object> getObject() {
        if (object == null) {
            object = new ArrayList<ParamObjectType.Object>();
        }
        return this.object;
    }


    /**
     * <p>Classe Java per anonymous complex type.
     * 
     * <p>Il seguente frammento di schema specifica il contenuto previsto contenuto in questa classe.
     * 
     * <pre>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="object" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "object"
    })
    public static class Object
        implements Serializable
    {

        private final static long serialVersionUID = 2L;
        @XmlElementRef(name = "object", type = ParamObjectType.Object.Object2 .class, required = false)
        protected List<ParamObjectType.Object.Object2> object;

        /**
         * Gets the value of the object property.
         * 
         * <p>
         * This accessor method returns a reference to the live list,
         * not a snapshot. Therefore any modification you make to the
         * returned list will be present inside the JAXB object.
         * This is why there is not a <CODE>set</CODE> method for the object property.
         * 
         * <p>
         * For example, to add a new item, do as follows:
         * <pre>
         *    getObject().add(newItem);
         * </pre>
         * 
         * 
         * <p>
         * Objects of the following type(s) are allowed in the list
         * {@link ParamObjectType.Object.Object2 }
         * 
         * 
         */
        public List<ParamObjectType.Object.Object2> getObject() {
            if (object == null) {
                object = new ArrayList<ParamObjectType.Object.Object2>();
            }
            return this.object;
        }

        public static class Object2
            extends JAXBElement<java.lang.Object>
        {

            protected final static QName NAME = new QName("", "object");

            public Object2(java.lang.Object value) {
                super(NAME, ((Class) java.lang.Object.class), ParamObjectType.Object.class, value);
            }

            public Object2() {
                super(NAME, ((Class) java.lang.Object.class), ParamObjectType.Object.class, null);
            }

        }

    }

}

这篇关于JaxB 重命名具有重复名称的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)