如何从xsd模式生成简单的xml java注释对象

好的,所以我search了stackoverflow,发现了关于这个问题的未答复的子主题,这就是为什么我想清楚地指出这个问题:

有什么工具可以从xsd模式生成Simple Xml库的带注释的java类吗?

我收到了一些xsd文件,这些文件描述了别人开发的一个平静的web服务返回的对象,目前我已经将这些模式转换为simple-xml注释类。 这些将用于我的Android应用程序。 只是自动同步对模式的任何更改并从中重新生成类将会更好。 ws的人有一个jackson兼容的类为这些模式的存储库,但我不想使用jackson – 我使用的是Spring的Android,所以我宁愿select首选的simple-xml 。 必须有一些像JAXB的xjc工具那样的技巧。

如果没有这样的工具 – 你能想到在实现一个脚本的任何陷阱,从模式生成simple-xml的.java文件吗? 也许任何值得扩展的工具的提示,只需要定义什么样的注释生成和什么时候?

提前 – 非常感谢您的答案!

Solutions Collecting From Web of "如何从xsd模式生成简单的xml java注释对象"

我不相信JAXB可以在Android上使用,因为缺less包需求( 参见这里 ),特别是在早期版本的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 --------------------------------------------------------------------- 

据我所知,Simple XML被用来创build注释类到marshall / demarshall XML。
Java Web服务框架使用特定的绑定:
例如CXF支持(除了JAXB)Aegis,XML Beans等CXF数据绑定
Axis2支持ADB,XMLBeans等Axis2数据绑定
JAX-WS也一样
我不知道Spring WS(但我怀疑他们支持特别简单)
恕我直言,如果你绝对需要使用简单的XML,只需自己创build类。 由于你注意到这在你的情况下似乎是可行的:

 I received a couple of xsd files describing the objects returned by a restful web-service 

所以对于一些文件可能是可能的。 我不认为你应该担心Web服务实现者对模式的改变,因为如果他们做了修改,你将不得不重新生成你的客户端部分。 在任何情况下,一旦部署了Web服务,模式不会经常更改,否则所有的客户端应用程序都将受到影响。
如果你想创build自己的工具,那么你将不得不创build一个代码生成器来parsingxsd文件并为Simple XML创build注释类。 这在我看来很费力
希望这可以帮助