Cómo generar simple-xml java objeto anotado desde el esquema xsd

Ok, así que he buscado stackoverflow y encontré subtópicos no respondidos con respecto a este problema, por eso me gustaría tener esta pregunta claramente señalada:

¿Hay alguna herramienta que generará la clase java anotada de la biblioteca Simple Xml desde un esquema xsd?

Recibí un par de archivos xsd que describen los objetos devueltos por un servicio web reparador que otra persona ha desarrollado y actualmente he traducido esos esquemas a las clases anotadas con simple-xml. Los que se utilizarán en mi aplicación de Android. Sería mejor sincronizar automáticamente cualquier cambio a los esquemas y regenerar las clases de ellos. Los ws chicos tienen un repositorio de Jackson compliant clases para esos esquemas, sin embargo no quiero usar Jackson – Estoy usando Spring Android, así que prefiero ir con el preferido de xml simple . Debe haber algo que haga el truco como la herramienta xjc de JAXB.

Si no existe tal herramienta, ¿puedes pensar en trampas en la implementación de un script que genere un archivo .java para simple-xml desde el esquema? Tal vez cualquier sugerencia de herramientas vale la pena ampliar que sólo se requiere definir qué anotaciones para generar y cuándo?

Por adelantado – muchas gracias por sus respuestas!

No creo que JAXB pueda utilizarse en Android debido a los requisitos de paquete que faltan ( consulte aquí ), especialmente con las versiones anteriores de la API de Android. Lo que podría hacer en su lugar es enviar su XSD a través de xjc y obtener la salida de la clase JAXB y luego escribir un script para convertir las anotaciones JAXB en las anotaciones XML Simples equivalentes. Esto debería hacer exactamente lo que estaba buscando.

Sin embargo, idealmente, y si usted tenía el tiempo, usted podría comprobar hacia fuera la fuente para xjc y ampliarlo para poder producir JAXB o las clases anotadas simples.

Escribí una biblioteca para generar clases analizadas de SimpleXML Java desde XSD.

Aquí está el enlace: https://github.com/yeshodhan/android-jaxb

P.ej:

Esquema 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> 

Generated Java Classes

 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; } } 

Uso

 ➜ 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 --------------------------------------------------------------------- 

Por lo que sé, Simple XML se utiliza para crear clases anotadas para marshall / demarshall XML.
Los marcos de Java Web Services, utilizan enlaces específicos:
Ej. CXF soporta (además de JAXB) Aegis, XML Beans etc CXF enlaces de datos
Axis2 soporta ADB, XMLBeans, etc. Enlaces de datos Axis2
Lo mismo para JAX-WS
No sé acerca de Spring WS (pero dudo que apoyen específicamente simple)
IMHO, si usted necesita absolutamente utilizar XML simple, apenas cree las clases usted mismo. Esto parece factible en su caso ya que usted nota:

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

Así que para algunos archivos puede ser que sea posible. No creo que deba preocuparse por los cambios en el esquema por parte de los implementadores de servicios web, ya que si hacen cambios, tendría que regenerar su parte de cliente de todos modos. En cualquier caso, una vez que se despliega un servicio web, los esquemas no cambian a menudo, de lo contrario todas las aplicaciones de cliente se verían afectadas.
Si desea crear su propia herramienta, entonces tendría que crear un generador de código que analizaría los archivos xsd y crearía clases anotadas para XML simple. Esto me parece mucho esfuerzo
Espero que esto ayude

  • config.xml problema de formato
  • Sombra larga de Android TextView
  • Cómo tener selectableItemBackground en Imageview?
  • Android: ¿es posible agregar un enlace que se puede hacer clic en un recurso de cadena
  • ¿Puede Android Studio extraer automáticamente las referencias de un archivo XML de diseño en el archivo de actividad java?
  • Android EditText para la contraseña con android: sugerencia
  • Pantalla Android Parpadea en mostrar / ocultar barras del sistema
  • Cambiar el tinte de dibujable en el selector xml
  • SimpleXML con Retrofit 1.9, 'Atributo' versión 'no tiene una coincidencia en la clase'
  • ¿Existe un estándar de documentación para atributos personalizados de estilo XML en Android?
  • TEXTVIEW sustanciación ubicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.