8
votes

Moyen le plus rapide et plus efficace de créer XML

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 là-bas (Woodstox, Xom, Xstream ...), se demandant simplement si quelqu'un a une contribution. Devrais-je aller avec une approche de génération de code (puisque XML Schema est bien connue)? Ou approche de réflexion au moment de l'exécution?

édité avec des informations supplémentaires:

  1. Schema XML bien défini est disponible et change rarement
  2. L'exigence est de convertir un objet Java en XML et non inversement
  3. des milliers d'objets Java à XML par seconde
  4. Génération de code, la complexité de code, la configuration, la maintenance, etc. est une seconde à des performances supérieures.

4 commentaires

Comment définissez-vous efficacement? Moindre utilisation de la mémoire? Moins de lignes de code à utiliser? Le plus rapide à faire quoi? Le marshaling? Nâblé de gros documents? Jolie impression? Que faites-vous cela nécessite la bibliothèque "la plus rapide"? Assurez-vous de choisir une bibliothèque basée sur ce qui est vraiment important et non un critère qui n'a pas d'importance. Vous trouverez peut-être qu'il est préférable de choisir une bibliothèque «suffisamment rapide», car il est plus facile d'utiliser qu'une bibliothèque qui est le "le plus rapide", mais est un cas de tête complet à utiliser et à entretenir.


La phrase "la plus efficace" n'est pas claire. Plus efficace pour la mémoire ou la CPU aident à clarifier.


Dupliqué possible de Quelle bibliothèque de sérialisation XML est axée sur la performance?


Paul: Mon besoin est d'être vraiment rapide, de prendre le moins de temps possible. Quantité de codage ou de configuration, la maintenance n'a pas d'importance. Le schéma XML est également disponible. Signification efficace, utilisation de la mémoire raisonnable, fonctionne parfaitement sans faille, aucune fuite de mémoire, car elle traite des milliers d'enregistrements PE deuxième, bien connu dans l'industrie, etc. J'espère que cela clarifie.


6 Réponses :


15
votes

Si je devais créer un contenu XML très simple , j'en collerais uniquement à l'API JDK, introduisant aucune dépendance tierce.

Donc pour un fichier XML simple et si je devais carte XML Fichier XML aux classes Java (ou vice-versa), j'irais pour Jaxb . Voir ce didacticiel pour voir à quel point il est facile.

maintenant.

Si je devais créer une sortie XML plus sophistiquée avec un schéma constant, j'utiliserais un moteur de modèles, Freemarker < / a> peut-être. thymeleaf a l'air bien aussi.

et enfin.

Si je devais créer énormes fichiers XML très efficacement, j'utiliserais Sax Parser .

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

et amusez-vous!


7 commentaires

Je ne considérerais pas stringbuilder pour être le moyen simple de créer XML valide. Je pense que c'est la manière la plus complexe, car vous devez tout faire vous-même. Regardez à quel point il est facile de créer XML à partir d'objets à l'aide de Eclipselink Moxy, par exemple: Moxy : Mise en route de manière plus facile que d'utiliser stringbuilder .


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 mappage de fichiers XML sur des objets Java. Donc, cela aide à le réduire. J'aime l'idée de moteurs de modèles que je vais regarder. Je posterai mon expérience ici.


@Paul, bon point. En disant le plus simple, je voulais dire - introduire aucune dépendance tierce partie et éviter saxo. Je vais éditer une réponse.


L'exemple cité par @Paul fonctionnerait avec n'importe quelle implémentation JAXB et l'une est incluse dans le JDK / JRE commençant par Java SE 6.


Vous avez raison. J'ai sauté le fait que Jaxb est introduit à JDK. J'ai modifié ma réponse.


+1 pour inclure la variante de modèles, cela est souvent ignoré


Vous mentionnez à l'aide de l'analyseur SAX pour écrire d'énormes fichiers XML. Comment voulez-vous faire ça? L'analyseur SAX n'a ​​pas de méthodes de sortie. Bien pour lire de gros fichiers mais pas pour écrire. Vous envisagez peut-être d'utiliser le Frame-SAX comme dans Stackoverflow.com/questions/4898590/... Mais vous devriez alors corriger votre réponse pour résoudre ce point.



2
votes

Premièrement, il est important que la sérialisation soit correcte. Les sérialistes écrits à la main ne sont généralement pas. Par exemple, ils ont tendance à oublier que la chaîne "]]>" ne peut pas apparaître dans un nœud texte.

Il n'est pas trop difficile d'écrire votre propre sérieliseur qui est à la fois correct et rapide, si vous êtes un programmeur Java capable, mais que des programmeurs Java très compétents ont été ici avant de penser que vous ne le pensez peu probable d'un une marge suffisante pour faire valoir l'effort d'écrire votre propre code.

Sauf peut-être que la plupart des bibliothèques à usage général pourraient être ralenties un peu en offrant des options de sérialisation - comme une indentation ou un codage, ou comme le choix de vos fins de ligne. Vous pourriez simplement serrer une once supplémentaire de performances en évitant les caractéristiques indésirables.

En outre, certaines bibliothèques à usage général peuvent vérifier la bienfaitement de ce que vous les jetez, par exemple en vérifiant que les préfixes d'espace de noms sont déclarés (ou les déclarant sinon). Vous pourriez le rendre plus rapide si cela ne vérifie pas. D'autre part, vous pourriez créer une bibliothèque rapide, mais un cochon à travailler. Mettre la performance au-dessus de tous les autres objectifs est presque invariablement une erreur.

Quant aux performances des bibliothèques disponibles, mesurez-les et dites-nous ce que vous découvrez.


1 commentaires

Vous avez mentionné des aspects importants concernant la performance. Merci.



6
votes

Essayez xembly , une petite bibliothèque open source qui rend ce processus de création XML très facile et intuitif: < Pré> xxx

xembly est une enveloppe autour de Java Dom natif et est une bibliothèque très légère (je suis un développeur).


2 commentaires

J'ai trouvé ce post utile aussi: YEGOR256.COM/2014/04/09 /xeubly-intro.html


Votre bibliothèque est utile mais est-ce efficace? C'est agréable de se débarrasser de la verbosité le cas échéant, mais la question concerne le moyen le plus rapide et le plus efficace d'écrire XML. 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 comme il le plus rapide et efficace n'est pas précis et que vous promouvez votre produit au lieu de fournir la meilleure réponse. Mais corrigez-moi si je me trompe.



2
votes

La meilleure façon que je connaisse consiste à utiliser un moteur XPath capable de créer des nœuds. xmlbeam est capable de le faire (dans un test JUNIT ici):

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


0 commentaires

1
votes

Utilisez xmlstreamwriter.

J'ai exécuté un microbenchmark sérialisant un million d'entre eux: xxx

avec ces résultats: < Pré> xxx

qui donne:

  • StringBuilder: 60 MS
  • XMLSTREAMWRITE: 1604 MS
  • JAXB: 3464 MS
  • Stringbuilder w / Excaping très primitif: 3806 MS
  • xembly: 25832 MS
  • et beaucoup d'autres que je n'ai pas essayé

    StringBuilder est le plus efficace, mais c'est parce qu'il n'a pas besoin de traverser tout le texte à la recherche de ", et <, et> et de les convertir en entités XML.


1 commentaires

Salut Petr, la réponse la plus pertinente, tbh. Mais quel xmlstreamwriter était-ce? Je vois que JDK 8 ne contient que comme une interface qui a un "com.sun". implémentations. Et aussi Apache Commons semble en avoir un. Lequel avez-vous utilisé pour cette référence? Merci