Wie generiere ich einfach-xml java annotated Objekt aus xsd Schema

Ok, also habe ich Stackoverflow gesucht und unbeantwortete Unterthemen zu diesem Thema gefunden, deshalb möchte ich diese Frage klar darauf hinweisen:

Gibt es irgendwelche Werkzeuge, die die Simple Xml Bibliothek 's kommentierte Java-Klasse aus einem xsd-Schema generieren?

Ich erhielt ein paar xsd-Dateien, die die Objekte beschreiben, die von einem erholsamen Web-Service zurückgegeben wurden, den jemand anderes entwickelt hat und derzeit habe ich diese Schemata in die einfach-xml kommentierten Klassen übersetzt. Die werden in meiner Android-App verwendet. Es wäre besser, alle Änderungen an den Schemata automatisch zu synchronisieren und die Klassen von ihnen zu regenerieren. Die ws Jungs haben ein Repository von Jackson kompatiblen Klassen für diese Schemata, aber ich möchte nicht Jackson verwenden – ich benutze Spring Android, also würde ich lieber mit dem bevorzugten simple-xml gehen . Es muss etwas geben, das den Trick wie das Xjc-Tool von JAXB macht.

Wenn es kein solches Tool gibt – können Sie sich an irgendwelche Fallen bei der Implementierung eines Skripts denken, das eine .java-Datei für einfach-xml aus dem Schema erzeugt? Vielleicht irgendwelche Hinweise für Werkzeuge, die es sich lohnt, das zu verlangen, würde nur definieren, welche Annotationen zu generieren und wann?

Im voraus – vielen Dank für Ihre Antworten!

  • XMLSchema-Validierung auf Android
  • Wie konvertiert man InputStream in Quelle?
  • Verwenden Sie JAXB (xjc) generierte Klassen in Android
  • Unmarshalling XML-Dateien in Java-Objekte in Android?
  • Grund, warum Style-Attribut nicht die android: namespace prefix verwendet
  • SchemaFactory unterstützt W3C XML Schema nicht auf Plattformebene 8?
  • Android-Schema-Validierung
  • 3 Solutions collect form web for “Wie generiere ich einfach-xml java annotated Objekt aus xsd Schema”

    Ich glaube nicht, dass JAXB auf Android wegen fehlender Paketanforderungen verwendet werden kann ( siehe hier ), besonders bei früheren Versionen der Android API. Was Sie stattdessen tun könnten, ist, senden Sie Ihre XSD über xjc und erhalten Sie JAXB Klasse Ausgabe und dann schreiben Sie ein Skript, um die JAXB Annotationen in die entsprechenden Simple XML Annotationen zu konvertieren. Das sollte genau das tun, was du gesucht hast.

    Allerdings, idealerweise, und wenn du die Zeit hättest, könntest du die Quelle für xjc ausprobieren und verlängern, um JAXB oder Einfache annotierte Klassen ausgeben zu können.

    Ich habe eine Bibliothek geschrieben, um SimpleXML Java annotierte Klassen von XSD zu generieren.

    Hier ist der Link: https://github.com/yeshodhan/android-jaxb

    Z.B:

    XML-Schema

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

    Generierte Java-Klassen

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

    Verwendung

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

    Soweit ich weiß, wird Simple XML verwendet, um annotierte Klassen zu marshall / demarshall XML zu erstellen.
    Die Java Web Services Frameworks verwenden spezifische Bindungen:
    ZB CXF unterstützt (neben JAXB) Aegis, XML Bohnen etc. CXF Datenbindungen
    Axis2 unterstützt ADB, XMLBeans usw. Axis2 Datenbindungen
    Gleich für JAX-WS
    Ich weiß nicht über Spring WS (aber ich bezweifle, dass sie spezifisch einfach unterstützen)
    IMHO, wenn Sie absolut brauchen, um einfaches XML zu verwenden, erstellen Sie einfach die Klassen selbst. Dies scheint in Ihrem Fall machbar, da Sie beachten:

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

    Also für ein paar Dateien kann es sein, dass es möglich ist. Ich glaube nicht, dass Sie sich über Änderungen im Schema durch die Web-Service-Implementierer Sorgen machen sollten, denn wenn sie Änderungen vornehmen, müssten Sie Ihren Client-Teil irgendwie regenerieren. In jedem Fall, sobald ein Web-Service eingesetzt wird, ändern sich die Schemata nicht, sonst würden sonst alle Client-Apps betroffen sein.
    Wenn du dein eigenes Tool erstellen möchtest, musst du einen Codegenerator erstellen, der die xsd-Dateien analysieren und annotierte Klassen für Simple XML erstellen soll. Das scheint mir viel Aufwand
    Hoffe das hilft

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.