問題描述
我必須使用包含以下片段的架構,其中名稱 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="http://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 重命名具有重復名稱的類的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!