繁体   English   中英

JAXB自定义绑定问题-序列属性名称

[英]JAXB Custom Binding Issue - sequence property name

给定给定的xsd模式:

<xsd:complexType name="webCheckType">
    <xsd:sequence maxOccurs="unbounded">
        <xsd:element name="baseUrl" />
        <xsd:element name="beginAt" />
        <xsd:element name="gotoPage" />
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:ID" use="required" />
    <xsd:attribute name="extends" type="xsd:IDREF" use="optional" />
    <xsd:attribute name="displayName" type="xsd:string" use="required" />
</xsd:complexType>

Xjc将产生如下内容:

@XmlElements({
    @XmlElement(name = "baseUrl", type = BaseUrl.class),
    @XmlElement(name = "beginAt", type = BeginAt.class),
    @XmlElement(name = "gotoPage", type = GotoPage.class)
})
protected List<Object> baseUrlOrBeginAtOrGotoPage;

如何在我的binding.xjb文件中更改此属性名称?

使用JAXB绑定定制,您可以使用XPath指定具有特定名称的节点,并定制其属性名称。 该代码将与此类似(未经测试,但您知道了)

<jxb:bindings node=".//xs:element[@name='name']">
        <jxb:property name="toName"/>
</jxb:bindings>

这是我的样本xsd-customer.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="customer">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element
                    name="phone-number"
                    type="xsd:string"
                    maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element> 
</xsd:schema>

在此架构上运行xjc会创建以下类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "phoneNumber"
})
@XmlRootElement(name = "customer")
public class Customer {

    @XmlElement(name = "phone-number", required = true)
    protected List<String> phoneNumber;

public List<String> getPhoneNumber() {
        if (phoneNumber == null) {
            phoneNumber = new ArrayList<String>();
        }
        return this.phoneNumber;
    }

现在,我创建了一个自定义绑定

<jxb:bindings schemaLocation="customer.xsd">
    <jxb:bindings node="//xs:element[@name='customer']/xs:complexType/xs:sequence/xs:element[@name='phone-number']">
        <!--<jxb:property name="" collectionType="java.util.LinkedList"/>-->
        <jxb:property name="number"/>
    </jxb:bindings>
</jxb:bindings>

在这里,我将列表属性的名称更改为“ number”

当我使用此绑定运行xjc时,得到以下带有正确更新的list属性的Customer类

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "number"
})
@XmlRootElement(name = "customer")
public class Customer {

    @XmlElement(name = "phone-number", required = true)
    protected List<String> number;

public List<String> getNumber() {
        if (number == null) {
            number = new ArrayList<String>();
        }
        return this.number;
    }

使用您的架构,您可以尝试按照以下步骤给出自己的属性名称

<jxb:bindings node="//xs:complexType/xs:sequence[xs:element[@name='baseUrl' or @name='beginAt' or @name='gotoPage']]">
            <jxb:property name="yourpropertyname"/>
        </jxb:bindings>

在模式上运行

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "webCheckType", propOrder = {
    "number"
})
public class WebCheckType {

    @XmlElementRefs({
        @XmlElementRef(name = "beginAt", type = JAXBElement.class),
        @XmlElementRef(name = "gotoPage", type = JAXBElement.class),
        @XmlElementRef(name = "baseUrl", type = JAXBElement.class)
    })
    protected List<JAXBElement<Object>> number;
    @XmlAttribute(required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String id;
    @XmlAttribute(name = "extends")
    @XmlIDREF
    @XmlSchemaType(name = "IDREF")
    protected Object _extends;
    @XmlAttribute(required = true)
    protected String displayName;

........................
.......................

public List<JAXBElement<Object>> getNumber() {
        if (number == null) {
            number = new ArrayList<JAXBElement<Object>>();
        }
        return this.number;
    }

当然,就我而言,它是JAXBElement,因为在我的xsd中,我没有给出这些元素的类型,但是在您的情况下应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM