问题描述
我必须使用包含以下片段的架构,其中名称 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:class
和 jaxb: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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="object" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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 重命名具有重复名称的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!