gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:34:50 25 4
gpt4 key购买 nike

我必须使用包含以下代码段的架构,其中名称 object 是重复的。

<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 类被声明了两次而无法编译源代码。

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

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

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

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

<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>

我如何才能确保这些实例中的一个被重命名而另一个保持不变?

最佳答案

正确的复杂类型 .. 缺少 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>

绑定(bind)

<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);
}

}

}

}

关于java - JaxB 重命名具有重复名称的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29016151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com