5 votes

Générer des classes Java dynamiquement à partir d'un document XML

Considérez ce scénario: J'ai un fichier XML appelé person.xml avec les données suivantes dedans.

    MrFoo
    28

Si je veux lire ce XML dans un objet Java, je créerais une classe Java appelée PersonBean (avec des getters/setters pour les attributs) comme suit:

class Person{
    String name;
    int age;
}

Et je pourrais utiliser n'importe quelle API pour lire le XML et peupler le bean Java.

Mais la vraie question ici est, supposons que la structure du fichier XML change, c'est-à-dire si un nouvel attribut 'email' est ajouté au fichier XML, alors je dois modifier le Bean Java pour ajouter un nouvel attribut. Mais, je veux éviter de modifier le code Java même si la structure XML change.

Donc, ce que j'essaie de faire, c'est de créer un autre fichier XML appelé PersonStructure.xml avec le contenu suivant:

          personName
          java.lang.String

      ... et ainsi de suite...

Est-il possible de lire le fichier PersonStructure.XML et le convertir en fichier de classe Person.Java? L'approche que j'essaie de suivre est-elle correcte ou existe-t-il une autre façon de faire la même chose?

7voto

Guillaume Points 8549

Alors que ce n'est pas exactement ce que vous essayez de faire, vous devriez jeter un œil à JAXB. Il peut générer un ensemble de classes Java à partir d'une définition de schéma. Votre fichier PersonStructure.xml ressemble beaucoup à un XSD avec une syntaxe différente, vous pourriez donc réutiliser JAXB.

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

4voto

Anton Gogolev Points 59794

Je ne suis pas très familier avec Java (je suis surtout un mec .NET), mais le bon sens s'applique : il y a en réalité très peu d'utilisation pour des beans générés dynamiquement (à moins que vous ne les liiez à un contrôle, auquel cas un tableau d'Object fera très bien l'affaire).

Ce qui est plus logique, c'est la génération de Java beans à partir de ces définitions XML, ce qui peut être fait avec XSLT.

PS. Ne pensez pas à faire un langage de programmation à partir de XML. L'enfer se déchaînera certainement si vous le faites.

0voto

Random Points 413

Je suis confronté à peu près au même problème (je dois transformer des données en Java en un fichier POM.xml), l'une des choses qui n'a pas fonctionné pour moi, mais qui pourrait peut-être fonctionner pour vous, c'est la bibliothèque XStream, elle transforme les classes java en xml, vous devriez jeter un coup d'œil :

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

Je n'ai aucun lien avec eux, juste un gars qui cherche ses propres réponses. Si vous avez des questions sur l'utilisation de cette bibliothèque, vous devriez essayer de les contacter. J'espère que cela résoudra votre problème.

0voto

Michael Scheper Points 552

Comme vous souhaitez pouvoir accommoder de nouveaux champs possibles, une Map vous serait plus utile qu'une classe.

En utilisant votre exemple, au lieu de cela :

Personne personne = obtenirPersonneDeQuelquePart();
System.out.printf("%s avait %d ans\n", personne.nom, personne.age);
personne.age++; // joyeux anniversaire!

... vous feriez ceci :

Map personne = obtenirPersonneDeQuelquePart();
System.out.printf("%s avait %d ans\n", personne.get("nom"), personne.get("age"));
int ageActuel = (Integer) personne.get("age"); // le code réel devrait d'abord assainir la valeur
personne.put("age", ageActuel + 1); // joyeux anniversaire!

Oui, cela signifie plus de code et moins de vérification d'erreurs (le compilateur ne vous le dira pas si vous épellez mal 'nom' et il n'y a pas de vérification de type), mais cela ferait ce que vous voulez. Et étant donné que la meilleure pratique consiste à coder des getters et setters au lieu d'accéder directement aux champs membres, dans la vraie vie, vous seriez de toute façon en train d'écrire plus de code.

Si vous choisissez d'emprunter cette voie, référez-vous à cette question pour savoir comment convertir de/vers XML.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X