2009-05-08 3 views
3

Stellen Sie sich das folgende Szenario vor: Ich habe eine XML-Datei namens person.xml mit den folgenden Daten.Dynamisches Generieren von Java-Klassen aus einem XML-Dokument

<person> 
    <name>MrFoo</name> 
    <age>28</age> 
</person> 

Wenn ich diese XML in ein Java-Objekt lesen möchten, würde ich eine Java-Bean genannt PersonBean erschaffen (mit Getter/Setter für die Attribute) als:

class Person{ 
    String name; 
    int age; 
} 

Und ich konnte verwenden alle APIs zum Lesen der XML und zum Füllen der Java Bean.

Aber die wirkliche Frage hier ist, angenommen, wenn die Struktur der XML-Datei ändert, dh wenn ein neues Attribut 'E-Mail' der XML-Datei hinzugefügt wird, dann muss ich die Java Bean auch ändern, um ein neues Attribut hinzuzufügen . Aber ich möchte vermeiden, den Java-Code zu ändern, selbst wenn sich die XML-Struktur ändert.

Also, was ich versuche zu tun, ich bin eine andere XML-Datei erstellen namens PersonStructure.xml mit dem Inhalt wie:

<class name="Person"> 
    <attributes> 
     <attribute> 
      <name>personName</name> 
      <type>java.lang.String</type> 
     </attribute> 
     ... and it goes like this... 
    </attribute> 
</class> 

Ist es möglich, die PersonStructure.XML-Datei zu lesen und konvertieren es in Person.Java Klassendatei? Der Ansatz, den ich versuche, ist richtig oder gibt es einen anderen Weg, das Gleiche zu tun?

+0

eine kleine Frage, was würde Ihr Java-Code Ihr neues geändertes Objekt tun? Müssten Sie Ihren Geschäftscode nicht anpassen, um die neue Version der Beans zu verwenden? –

+0

Ist der Titel Ihrer Frage korrekt? Es klingt, als ob Sie Java-Objekte und keine Java-Klassen generieren möchten. – skaffman

+0

Ich möchte Java-Klassenstruktur aus der XML-Datei erstellen. :) – Veera

Antwort

7

Während dies nicht genau das ist, was Sie versuchen, sollten Sie sich JAXB ansehen. Es kann eine Reihe von Java-Klassen aus einer Schema-Definition generieren. Ihre PersonStructure.xml-Datei sieht ziemlich wie ein XSD mit einer anderen Syntax aus, so dass Sie JAXB wiederverwenden können.

https://jaxb.dev.java.net/

+0

Sie können auch XMLBeans verwenden, die fast das gleiche wie JAXB http://xmlbeans.apache.org/ – HaBaLeS

4

nicht sehr vertraut mit Java (ich bin meistens ein .NET Typ), aber der gesunde Menschenverstand gilt: Es ist eigentlich sehr wenig Gebrauch in dynamisch generierten Bohnen (es sei denn, Sie diejenigen zu einem gewissen Kontrolle verbindlich werden , in diesem Fall wird Array von Object s ganz gut).

Was logischer ist, ist die Codierung von Java-Beans aus diesen XML-Definitionen, die mit XSLT durchgeführt werden können.

PS. Versuchen Sie nicht, eine Programmiersprache aus XML zu erstellen. Die Hölle wird definitiv ausbrechen, wenn Sie dies tun.

0

Ich laufe irgendwie mehr oder weniger das gleiche Problem durch (ich muss Daten in Java in eine POM.xml Datei umwandeln), eines der Dinge, die für mich nicht funktionierten, aber vielleicht könnte für Sie arbeiten XStream Bibliothek, verwandelt es Java-Klassen in xml, sollten Sie einen Blick:

http://x-stream.github.io/

ich bin sowieso mit ihnen verwendet, nur ein zufälligen Kerl für seine eigenen Antworten suchen. Sollten Sie Fragen zur Verwendung dieser Bibliothek haben, sollten Sie versuchen, sie zu kontaktieren. Hoffe es löst Ihr Problem.

0

Da Sie mögliche neue Felder aufnehmen möchten, wäre eine Map für Sie nützlicher als eine Klasse.

Illustrieren Ihrem Beispiel verwenden, statt dies:

Person person = getPersonFromSomewhere(); 
System.out.printf("%s was %d years old\n", person.name, person.age); 
person.age++; // happy birthday! 

...Sie würden dies tun:

Map<String, Object> person = getPersonFromSomewhere(); 
System.out.printf("%s was %d years old\n", person.get("name"), person.get("age")); 
int currentAge = (Integer) person.get("age"); // real code would sanitise the value first 
person.put("age", currentAge + 1); // happy birthday! 

Ja, es mehr Code und weniger Fehler bedeutet Überprüfung (der Compiler wird Ihnen nicht sagen, wenn Sie ‚Name‘ und es gibt keine Typprüfung falsch schreiben), aber es würde tun, was Sie wollen. Und in Anbetracht der besten Praxis ist es, Getter und Setter zu programmieren, anstatt direkt auf Mitgliederfelder zuzugreifen, im wirklichen Leben würden Sie sowieso mehr Code schreiben.

Wenn Sie sich für diese Route entscheiden, finden Sie unter this question Informationen zur Konvertierung in/aus XML.