如何从xsd模式生成simple-xml java带注释的对象

|| 好的,所以我搜索了stackoverflow并找到了关于此问题的未答复子主题,这就是为什么我想清楚指出这个问题的原因: 是否有任何工具可以从xsd模式生成Simple Xml库的带注释的Java类? 我收到了几个xsd文件,它们描述了别人开发的一个宁静的Web服务返回的对象,目前,我已经将这些模式转换为带简单xml注释的类。这些将在我的Android应用中使用。最好只自动同步对架构的任何更改并从中重新生成类。 ws的人为这些模式提供了与Jackson兼容的类的存储库,但是我不想使用Jackson-我使用的是Spring Android,所以我更喜欢使用首选的simple-xml。一定有一些可以解决问题的方法,例如JAXB的xjc工具。 如果没有这样的工具-在实现从模式生成用于simple-xml的.java文件的脚本时,您会想到任何陷阱吗?也许任何值得扩展的工具提示都只需要定义要生成的注释以及何时生成? 提前-非常感谢您的回答!     
已邀请:
        我不相信JAXB可以在Android上使用,因为缺少软件包要求(请参阅此处),尤其是在早期版本的Android API上。相反,您可以做的是通过xjc发送XSD并获取JAXB类输出,然后编写脚本以将JAXB注释转换为等效的Simple XML注释。这应该完全符合您的期望。 但是,理想情况下,如果有时间,您可以签出xjc的源代码并将其扩展为能够输出JAXB或Simple带注释的类。     
        我编写了一个库,用于从XSD生成带有SimpleXML Java注释的类。 这是链接:https://github.com/yeshodhan/android-jaxb 例如: XML模式
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://person.mickoo.com/\"
            targetNamespace=\"http://person.mickoo.com/\" elementFormDefault=\"qualified\">

    <xsd:element name=\"Person\" type=\"Person\"/>

    <xsd:complexType name=\"Person\">
        <xsd:sequence>
            <xsd:element name=\"FirstName\" type=\"xsd:string\" minOccurs=\"0\" />
            <xsd:element name=\"LastName\" type=\"xsd:string\" minOccurs=\"0\" />
            <xsd:element name=\"Adult\" type=\"xsd:boolean\" minOccurs=\"0\" />
            <xsd:element name=\"Addresses\" type=\"Addresses\" minOccurs=\"0\" />
            <xsd:element name=\"Gender\" type=\"Gender\" minOccurs=\"0\" />
            <xsd:element name=\"Favorite_Fruits\" type=\"Fruits\" minOccurs=\"0\" maxOccurs=\"3\"/>
            <xsd:element name=\"SomeThing_really_whacky-by-the-user\" type=\"xsd:string\" minOccurs=\"0\" />
        </xsd:sequence>
        <xsd:attribute name=\"id\" type=\"xsd:string\"/>
    </xsd:complexType>

    <xsd:complexType name=\"Addresses\">
        <xsd:sequence>
            <xsd:element name=\"Address\" type=\"Address\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name=\"Address\">
        <xsd:sequence>
            <xsd:element name=\"Line1\" type=\"xsd:string\" minOccurs=\"0\" />
            <xsd:element name=\"Line2\" type=\"xsd:string\" minOccurs=\"0\" />
            <xsd:element name=\"City\" type=\"xsd:string\" minOccurs=\"0\" />
            <xsd:element name=\"State\" type=\"xsd:string\" minOccurs=\"0\" />
            <xsd:element name=\"Country\" type=\"xsd:string\" minOccurs=\"1\" />
            <xsd:element name=\"PostalCode\" type=\"xsd:string\" minOccurs=\"0\" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:simpleType name=\"Gender\">
        <xsd:restriction base=\"xsd:string\">
            <xsd:enumeration value=\"MALE\"/>
            <xsd:enumeration value=\"FEMALE\"/>
            <xsd:enumeration value=\"NOT_SPECIFIED\"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name=\"Fruits\">
        <xsd:restriction base=\"xsd:string\">
            <xsd:enumeration value=\"Apple\"/>
            <xsd:enumeration value=\"Banana\"/>
            <xsd:enumeration value=\"Mango\"/>
            <xsd:enumeration value=\"Orange\"/>
            <xsd:enumeration value=\"Grapes\"/>
            <xsd:enumeration value=\"Watermelon\"/>
            <xsd:enumeration value=\"Peach\"/>
            <xsd:enumeration value=\"Apricot\"/>
            <xsd:enumeration value=\"Grapefruit\"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>
生成的Java类
package com.mickoo.person;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;


@Root(name = \"Address\")
@Namespace(reference = \"http://person.mickoo.com/\")
public class Address {

    @Element(name = \"Line1\", required = false)
    private String line1;
    @Element(name = \"Line2\", required = false)
    private String line2;
    @Element(name = \"City\", required = false)
    private String city;
    @Element(name = \"State\", required = false)
    private String state;
    @Element(name = \"Country\", required = true)
    private String country;
    @Element(name = \"PostalCode\", required = false)
    private String postalCode;

    public Address() {
    }

    public String getLine1() {
        return line1;
    }

    public void setLine1(String line1) {
        this.line1 = line1;
    }

    public String getLine2() {
        return line2;
    }

    public void setLine2(String line2) {
        this.line2 = line2;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

}

package com.mickoo.person;

import java.util.List;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;


@Root(name = \"Addresses\")
@Namespace(reference = \"http://person.mickoo.com/\")
public class Addresses {

    @ElementList(name = \"Address\", entry = \"Address\", inline = true, required = false)
    private List<Address> address;

    public Addresses() {
    }

    public List<Address> getAddress() {
        return address;
    }

    public void setAddress(List<Address> address) {
        this.address = address;
    }

}

package com.mickoo.person;

import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;

@Root(name = \"Fruits\")
@Namespace(reference = \"http://person.mickoo.com/\")
public enum Fruits {

    Apple,
    Banana,
    Mango,
    Orange,
    Grapes,
    Watermelon,
    Peach,
    Apricot,
    Grapefruit;

}

package com.mickoo.person;

import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;

@Root(name = \"Gender\")
@Namespace(reference = \"http://person.mickoo.com/\")
public enum GenderEnum {

    MALE(0, \"Men are from Mars\"),
    FEMALE(1, \"Women are from Venus\"),
    NOT_SPECIFIED(2, \"Can\'t say anything\");
    private final Integer id;
    private final String description;

    private GenderEnum(Integer id, String description) {
        this.id = id;
        this.description = description;
    }

    public Integer id() {
        return id;
    }

    public String description() {
        return description;
    }

}


package com.mickoo.person;

import java.util.List;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;


@Root(name = \"Person\")
@Namespace(reference = \"http://person.mickoo.com/\")
public class Person {

    @Element(name = \"FirstName\", required = false)
    private String firstName;
    @Element(name = \"LastName\", required = false)
    private String lastName;
    @Element(name = \"Adult\", required = false)
    private Boolean adult;
    @Element(name = \"Addresses\", required = false)
    private Addresses addresses;
    @Element(name = \"Gender\", required = false)
    private GenderEnum gender;
    @ElementList(name = \"Favorite_Fruits\", entry = \"Favorite_Fruits\", inline = true, required = false)
    private List<Fruits> favoriteFruits;
    @Element(name = \"SomeThing_really_whacky-by-the-user\", required = false)
    private String someThingReallyWhackyByTheUser;
    @Attribute(name = \"id\", required = false)
    private String id;

    public Person() {
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Boolean getAdult() {
        return adult;
    }

    public void setAdult(Boolean adult) {
        this.adult = adult;
    }

    public Addresses getAddresses() {
        return addresses;
    }

    public void setAddresses(Addresses addresses) {
        this.addresses = addresses;
    }

    public GenderEnum getGender() {
        return gender;
    }

    public void setGender(GenderEnum gender) {
        this.gender = gender;
    }

    public List<Fruits> getFavoriteFruits() {
        return favoriteFruits;
    }

    public void setFavoriteFruits(List<Fruits> favoriteFruits) {
        this.favoriteFruits = favoriteFruits;
    }

    public String getSomeThingReallyWhackyByTheUser() {
        return someThingReallyWhackyByTheUser;
    }

    public void setSomeThingReallyWhackyByTheUser(String someThingReallyWhackyByTheUser) {
        this.someThingReallyWhackyByTheUser = someThingReallyWhackyByTheUser;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}
用法
➜  target git:(master) ✗ java -jar android-jaxb-1.0.jar --help
usage: java -jar android-jaxb-1.0.jar [options] your-schema-file.xsd
---------------------------------------------------------------------
 -b,--bindings <arg>      (optional) bindings JSON file
 -d,--destination <arg>   destination directory for generated classes
 -h,--help                Help on usage
 -p,--package <arg>       package name for generated classes. Eg.:
                          com.example.app
 -v,--version             Version
---------------------------------------------------------------------
    
        据我所知,简单XML用于创建带注释的类来编组/解组XML。 Java Web Services框架使用特定的绑定: 例如。 CXF支持(除JAXB之外)宙斯盾,XML Beans等CXF数据绑定 Axis2支持ADB,XMLBeans等Axis2数据绑定 与JAX-WS相同 我不了解Spring WS(但是我怀疑它们是否支持特别简单) 恕我直言,如果您绝对需要使用简单XML,只需自己创建类。在您的情况下,这似乎可行,因为您注意到:
I received a couple of xsd files describing the objects returned by a restful web-service 
因此,可能只需要几个文件。我认为您不必担心Web服务实现者对架构的更改,因为如果他们进行更改,则无论如何都必须重新生成客户端部分。无论如何,一旦部署了Web服务,架构就不会经常更改,否则所有客户端应用都会受到影响。 如果要创建自己的工具,则必须创建一个代码生成器来解析xsd文件并为Simple XML创建带注释的类。在我看来这很费劲 希望这可以帮助     

要回复问题请先登录注册