2012-01-28 3 views
6

Quel est le moyen le plus rapide et le plus efficace de créer des documents XML en Java? Il y a une pléthore de bibliothèques (woodstox, xom, xstream ...), se demandant si quelqu'un a quelque chose à ajouter. Dois-je utiliser une approche de génération de code (puisque le schéma xml est bien connu)? Ou approche de réflexion à l'exécution?Manière la plus rapide et la plus efficace de créer du code XML

édité avec Informations complémentaires:

  1. schéma XML bien défini est disponible et change rarement
  2. exigence est de convertir un objet Java en XML, et non vice versa
  3. Des milliers d'objets java en XML par seconde
  4. La génération de code, la complexité du code, la configuration, la maintenance, etc.
+1

Comment définissez-vous efficace? Au moins l'utilisation de la mémoire? Moins de lignes de code à utiliser? Le plus rapide à faire quoi? Marshaling? Unmarshaling grands documents? Jolie impression? Que faites-vous qui nécessite la bibliothèque "la plus rapide"? Assurez-vous de choisir une bibliothèque en fonction de ce qui est vraiment important et non d'un critère qui n'a pas d'importance. Vous pouvez trouver qu'il est préférable de choisir une bibliothèque qui est "assez rapide" parce qu'elle est plus facile à utiliser qu'une bibliothèque qui est "la plus rapide", mais c'est un mal de tête complet à utiliser et à maintenir. – Paul

+0

La phrase "la plus efficace" n'est pas claire. Le plus efficace pour la mémoire ou le processeur aide à la clarification. –

+1

duplication possible de [Quelle bibliothèque de sérialisation xml est axée sur les performances?] (Http://stackoverflow.com/questions/5918665/which-xml-serialization-library-is-performance-oriented) – skaffman

Répondre

11

Si je devais créer un contenu XML très simple, je tiens à l'api que JDK, l'introduction d'aucun tiers des dépendances du parti. Donc pour le XML simple et si je devais mapper le fichier XML aux classes Java (ou vice-versa), je choisirais JAXB. See this tutorial pour voir comme c'est facile.

Maintenant.

Si je devais créer quelque sortie XML plus sophistiquée avec schéma constant, j'utiliserais un moteur de template, Freemarker peut-être. Thymeleaf semble bien aussi.

Et enfin.

Si je devais créer d'énormes fichiers XML très efficacement, j'utiliserais SAX parser.

J'espère que vous comprenez maintenant que vous avez beaucoup de possibilités - choisir le meilleur match pour vos besoins :)

et amusez-vous!

+6

Je ne considérerais pas 'StringBuilder' comme un moyen simple de créer un fichier XML valide. Je pense que c'est la façon la plus complexe, parce que vous devez tout faire vous-même. Regardez comme il est facile de créer du XML à partir d'objets en utilisant EclipseLink MOXy, par exemple: [MOXy: Getting Started] (http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics) C'est beaucoup plus facile que d'utiliser ' StringBuilder'. – Paul

+0

@Paul, bon point. En disant le plus simple que je voulais dire - n'introduire aucune dépendance de tiers et éviter SAX. Je vais modifier la réponse. –

+1

Merci Lukas, comme mentionné dans le commentaire précédent, je veux des performances plus rapides. Le XML n'est pas énorme. Je n'ai pas besoin de mapper des fichiers XML aux objets Java. Cela aide donc à l'affiner. J'aime l'idée de moteurs de modèles, que je vais examiner. Je posterai mon expérience ici. – arrehman

2

Premièrement, il est important que la sérialisation soit correcte. Les sérialiseurs écrits à la main ne le sont généralement pas. Par exemple, ils ont tendance à oublier que la chaîne "]]>" ne peut pas apparaître dans un noeud de texte. Il n'est pas trop difficile d'écrire votre propre sérialiseur qui soit à la fois correct et rapide, si vous êtes un programmeur Java capable, mais puisque certains programmeurs Java très compétents ont été ici avant que je pense que vous avez peu de chances de les battre une marge suffisante pour que cela vaille la peine d'écrire votre propre code. Sauf peut-être que la plupart des bibliothèques à usage général pourraient être un peu ralenties en offrant des options de sérialisation - comme l'indentation, l'encodage ou le choix de vos fins de ligne. Vous pourriez juste presser une once supplémentaire de performance en évitant les fonctionnalités indésirables.

En outre, certaines bibliothèques polyvalentes peuvent vérifier la bonne forme de ce que vous leur lancez, par exemple en vérifiant que les préfixes d'espace de noms sont déclarés (ou en les déclarant sinon). Vous pourriez le rendre plus rapide s'il ne vérifie pas. D'un autre côté, vous pouvez créer une bibliothèque rapide, mais un cochon avec lequel travailler. Mettre la performance au-dessus de tous les autres objectifs est presque toujours une erreur.En ce qui concerne les performances des bibliothèques disponibles, mesurez-les et dites-nous ce que vous avez découvert.

+0

Vous avez mentionné certains aspects importants concernant les performances. Merci. – arrehman

4

Essayez Xembly, une petite bibliothèque open source qui rend ce processus de création XML très simple et intuitive:

String xml = new Xembler(
    new Directives() 
    .add("root") 
    .add("order") 
    .attr("id", "553") 
    .set("$140.00") 
).xml(); 

Xembly est une surcouche de Java natif DOM, et est une bibliothèque très légère (je suis développeur).

+1

J'ai trouvé cet article aussi utile: http://www.yegor256.com/2014/04/09/xembly-intro.html –

+0

Votre bibliothèque a l'air utile mais est-elle efficace? C'est bien de se débarrasser de la verbosité lorsque cela est approprié, mais la question est de savoir comment utiliser le XML le plus rapidement et le plus efficacement possible. En regardant l'exemple ci-dessus, je dirais que ce n'est pas une bonne solution pour écrire de gros fichiers XML efficacement.Même si j'aime votre bibliothèque pour d'autres cas d'utilisation, j'ai envie de suggérer cela car il est le plus rapide et le plus efficace n'est pas précis et vous faites la promotion de votre produit au lieu de fournir la meilleure réponse. Mais corrigez-moi si j'ai tort. –

1

La meilleure façon que je connaisse est d'utiliser un moteur XPath capable de créer des nœuds. XMLBeam est en mesure de le faire (dans un test JUnit ici):

public interface Projection { 

    @XBWrite("/create/some/xml/structure[@even='with Predicates']") 
    void demo(String value); 
} 

@Test 
public void demo() { 
    Projection projection = new XBProjector(Flags.TO_STRING_RENDERS_XML).projectEmptyDocument(Projection.class); 
    projection.demo("Some value"); 
    System.out.println(projection); 
} 

Ce programme imprime:

<create> 
    <some> 
     <xml> 
     <structure even="with Predicates">Some value</structure> 
     </xml> 
    </some> 
</create> 
Questions connexes