xsd到jaxb添加了特殊字符

时间:2013-12-17 00:54:49

标签: java eclipse maven jaxb xsd

我有xsd文件,如下所示:

<xs:complexType name="sampleTest">
        <xs:sequence>
            <xs:element name="testName" type="xs:string"/>
            <xs:element name="actualData" type="tns:actualData"/>
            <xs:element name="expectedDataAPI" type="xs:string"/>
            <xs:element name="actualDataPostStatus" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

通过使用JAXB xjc插件,它生成适当的bean类。但是,如果我将minOccurance和maxOccurance添加到元素中,它会添加一个特殊字符。

<xs:element name="actualData" type="tns:actualData" minOccurs="1" maxOccurs="unbounded"/>

即生成

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "sampleTest", propOrder = {
        "testName",
        "actualDatas",
        "expectedDataAPI",
        "actualDataPostStatus"
    })

    ....
    ...
        @XmlElement(name = "actualData", required = true)
        protected List<ActualData> actualDatas;
...
...
public List<ActualData> getActualDatas() {
        if (actualDatas == null) {
            actualDatas = new ArrayList<ActualData>();
        }
        return this.actualDatas;
    }

而不是actualData,它变为actualDatas。是否需要过滤器?我需要做些什么改变以避免特殊性。

我正在使用Maven在eclipse中使用xjc插件生成jaxb。我使用的是Java 1.6和Jaxb 2.2.7

更新

我绑定为:

<jaxb:bindings version="2.0" 
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jaxb:extensionBindingPrefixes="xjc">

    <jaxb:globalBindings  xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <jaxb:serializable uid="1"/>
        <xjc:simple />
    </jaxb:globalBindings>

</jaxb:bindings>

1 个答案:

答案 0 :(得分:2)

您必须包含一个扩展名(可能是意外)才会导致此行为。我的猜测是xjc:simple,这将导致为重复的元素生成复数名称。


标准JAXB行为

下面是一个显示标准JAXB行为的示例。

XML架构(schema.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <xs:complexType name="sampleTest">
        <xs:sequence>
            <xs:element name="actualData" type="tns:actualData" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="actualData"/>

</xs:schema>

XJC致电

xjc schema.xsd

生成的类(SampleTest)

生成的字段和属性是单数actualData

package org.example.schema;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "sampleTest", propOrder = {"actualData"})
public class SampleTest {

    @XmlElement(required = true)
    protected List<ActualData> actualData;

    public List<ActualData> getActualData() {
        if (actualData == null) {
            actualData = new ArrayList<ActualData>();
        }
        return this.actualData;
    }

}

使用您的绑定文件

绑定文件(binding.xml)

这是你问题的绑定文件。

<jaxb:bindings version="2.0" 
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jaxb:extensionBindingPrefixes="xjc">

    <jaxb:globalBindings  xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <jaxb:serializable uid="1"/>
        <xjc:simple />
    </jaxb:globalBindings>

</jaxb:bindings>

XJC致电

xjc -extension -b binding.xml schema.xsd

生成的类(SampleTest)

生成的字段和属性不是单数actualDatas

package org.example.schema;

import java.io.Serializable;
import java.util.*;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "sampleTest", propOrder = {"actualDatas"})
public class SampleTest
    implements Serializable
{

    private final static long serialVersionUID = 1L;
    @XmlElement(name = "actualData", required = true)
    protected List<ActualData> actualDatas;

    public List<ActualData> getActualDatas() {
        if (actualDatas == null) {
            actualDatas = new ArrayList<ActualData>();
        }
        return this.actualDatas;
    }

}