objeto convertir java android xml xsd simple-framework

java - convertir - xmlbeans jar



Cómo generar un objeto anotado java simple-xml desde el esquema xsd (3)

Escribí una biblioteca para generar clases anotadas de Java SimpleXML 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>

Clases Java generadas

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

Ok, entonces busqué stackoverflow y encontré subtemas sin respuesta con respecto a este problema, por eso me gustaría que esta pregunta sea claramente señalada:

¿Existe alguna herramienta que genere la clase java anotada de la biblioteca Xml simple a partir de un esquema xsd?

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

Si no existe tal herramienta, ¿puede pensar en alguna trampa al implementar un script que genere un archivo .java para simple-xml a partir del esquema? Tal vez, ¿alguna sugerencia de herramientas que valga la pena extender que solo requeriría definir qué anotaciones generar y cuándo?

De antemano, muchas gracias por sus respuestas!


No creo que JAXB pueda usarse en Android debido a que faltan requisitos de paquetes ( consulte aquí ), especialmente con 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 el resultado 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 estabas buscando.

Sin embargo, idealmente, y si tuviera tiempo, podría revisar la fuente de xjc y extenderla para poder generar clases anotadas JAXB o Simple.


Que yo sepa, el XML simple se usa para crear clases anotadas para organizar / demarshall XML.
Los frameworks Java Web Services, utilizan enlaces específicos:
Por ejemplo, CXF soporta (además de JAXB) Aegis, XML Beans, etc. Enlaces de datos CXF
Axis2 admite enlaces de datos ADB, XMLBeans, etc. Axis2
Lo mismo para JAX-WS
No sé acerca de Spring WS (pero dudo que sean específicamente simples)
En mi humilde opinión, si necesita usar XML simple, simplemente cree las clases usted mismo. Esto parece factible en su caso ya que nota:

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

Así que para algunos archivos puede ser 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ían que volver a generar la parte del cliente de todos modos. En cualquier caso, una vez que se implementa un servicio web, los esquemas no cambian, ya que de lo contrario se verían afectadas todas las aplicaciones cliente.
Si desea crear su propia herramienta, entonces tendría que crear un generador de código que analice los archivos xsd y cree clases anotadas para XML simple. Esto me parece mucho esfuerzo.
Espero que esto ayude