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? p>
édité avec des informations supplémentaires: strong> p>
6 Réponses :
Si je devais créer un Donc pour un fichier XML simple et si je devais carte XML Fichier XML aux classes Java strong> (ou vice-versa), j'irais pour Jaxb . Voir ce didacticiel pour voir à quel point il est facile. P>
maintenant. p>
Si je devais créer une sortie XML et enfin. p>
Si je devais créer J'espère que vous comprenez maintenant que vous avez beaucoup de possibilités - choisissez le meilleur match pour vos besoins :) p>
et amusez-vous! p>
Je ne considérerais pas stringbuilder code> 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 code>.
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.
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. P>
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. P>
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. P>
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. P>
Quant aux performances des bibliothèques disponibles, mesurez-les et dites-nous ce que vous découvrez. P>
Vous avez mentionné des aspects importants concernant la performance. Merci.
Essayez xembly , une petite bibliothèque open source qui rend ce processus de création XML très facile et intuitif: < Pré> xxx pré>
xembly est une enveloppe autour de Java Dom natif et est une bibliothèque très légère (je suis un développeur). P> P>
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.
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>
J'ai exécuté un microbenchmark sérialisant un million d'entre eux: p> avec ces résultats: p> < Pré> xxx pré> qui donne: p> 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. P> p>
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
Inspiré par la réponse de Petr, j'ai passé une meilleure partie de la journée à mettre en œuvre une telle référence, en lisant des lots sur JMH dans le processus. Le projet est ici: https://github.com/62MKV/XML-Sériialization-benchmark A> et les résultats étaient les suivants: P> Benchmark (N) Mode Cnt Score Error Units
XmlSerializationBenchmark.testWithJaxb 50 thrpt 5 216,758 ± 99,951 ops/s
XmlSerializationBenchmark.testWithXStream 50 thrpt 5 40,177 ± 1,768 ops/s
XmlSerializationBenchmark.testWithXmlStreamWriter 50 thrpt 5 520,360 ± 14,745 ops/s
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.