2012-01-28 16 views
6

¿Cuál es la forma más rápida y eficiente de crear documentos XML en Java? Hay una gran cantidad de bibliotecas por ahí (woodstox, xom, xstream ...), solo me pregunto si alguien tiene alguna entrada. ¿Debo ir con el enfoque de generación de código (dado que el esquema xml es bien conocido)? ¿O enfoque de reflexión en tiempo de ejecución?La forma más rápida y eficiente de crear XML

Editado con la información adicional:

  1. esquema XML bien definido está disponible y rara vez cambia
  2. requisito es convertir un objeto de Java para XML, y no al revés
  3. Miles de objetos Java a XML por segundo
  4. La generación de código, la complejidad del código, la configuración, el mantenimiento, etc., es el segundo para un mayor rendimiento.
+1

¿Cómo se define eficiente? ¿Menos uso de memoria? ¿Menos líneas de código para usar? Lo más rápido en hacer qué? ¿Marshaling? ¿Desasignando documentos grandes? Bonita impresión? ¿Qué estás haciendo que requiere la biblioteca "más rápida"? Asegúrese de elegir una biblioteca basada en lo que es realmente importante y no un criterio que no importe. Puede que encuentre que es mejor elegir una biblioteca que sea "lo suficientemente rápida" porque es más fácil de usar que una biblioteca que es la "más rápida", pero es un dolor de cabeza completo para usar y mantener. – Paul

+0

La frase "más eficiente" no está clara. Más eficiente para la memoria o la CPU ayuda a la aclaración. –

+1

posible duplicado de [¿Qué biblioteca de serialización xml está orientada al rendimiento?] (Http://stackoverflow.com/questions/5918665/which-xml-serialization-library-is-performance-oriented) – skaffman

Respuesta

11

Si tuviera que crear un contenido muy simple XML, me quedo con sólo el API del JDK, la introducción de ninguna dependencia de terceros.

Así que para XML simple y si fuera mapa de archivo XML a las clases Java (o viceversa), me gustaría JAXB. See this tutorial para ver qué fácil es.

Ahora.

Si tuviera que crear alguna salida XML más sofisticada con un esquema constante, usaría algún motor de plantillas, Freemarker quizás. Thymeleaf se ve bien también.

Y finalmente.

Si tuviera que crear enormes archivos XML con mucha eficacia, usaría SAX parser.

espero que entender ahora, que tiene un montón de posibilidades - elegir la mejor opción para sus necesidades :)

y divertirse!

+6

No consideraría que 'StringBuilder' fuera la manera más sencilla de crear un xml válido. Creo que esa es la forma más compleja, porque tienes que hacer todo tú mismo. Mire qué fácil es crear xml de objetos usando EclipseLink MOXy, por ejemplo: [MOXy: Getting Started] (http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics) Eso es mucho más fácil que usar ' StringBuilder'. – Paul

+0

@Paul, buen punto. Al decir lo más simple, quise decir: no introducir dependencias de terceros y evitar SAX. Editaré la respuesta. –

+1

Gracias Lukas, como se menciona en el comentario anterior quiero un rendimiento más rápido. El XML no es enorme. No necesito el mapeo de archivos XML a objetos Java. Entonces esto ayuda a reducirlo. Me gusta la idea de los motores de plantillas, que investigaré. Publicaré mi experiencia aquí. – arrehman

2

En primer lugar, es importante que la serialización sea correcta. Los serializadores escritos a mano generalmente no lo son. Por ejemplo, tienden a olvidar que la cadena "]]>" no puede aparecer en un nodo de texto.

No es demasiado difícil escribir su propio serializador que sea correcto y rápido, si usted es un programador de Java capaz, pero como algunos programadores de Java muy hábiles han estado aquí antes, creo que es poco probable que los venza un margen suficiente para que valga la pena el esfuerzo de escribir su propio código.

Excepto tal vez que la mayoría de las bibliotecas de uso general pueden ralentizarse un poco al ofrecer opciones de serialización, como sangrías o codificación, o como elegir las terminaciones de línea. Puede exprimir una onza extra de rendimiento al evitar las características no deseadas.

Además, algunas librerías de uso general pueden verificar la buena formación de lo que les arrojas, por ejemplo verificando que los prefijos del espacio de nombres están declarados (o declararlos si no). Puede hacerlo más rápido si no realiza ninguna comprobación. Por otro lado, puede crear una biblioteca que sea rápida, pero un cerdo con quien trabajar. Poner el rendimiento por encima de todos los demás objetivos es casi siempre un error.

En cuanto al rendimiento de las bibliotecas disponibles, mídalas y cuéntenos qué averigua.

+0

Usted mencionó algunos aspectos importantes con respecto al rendimiento. Gracias. – arrehman

4

Trate Xembly, una pequeña biblioteca de código abierto que hace que este proceso de creación de XML muy fácil e intuitivo:

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

Xembly es una envoltura alrededor nativa de Java DOM, y es una biblioteca muy ligero (yo soy un desarrollador).

+1

Encontré esta publicación útil también: http://www.yegor256.com/2014/04/09/xembly-intro.html –

+0

Su biblioteca es útil pero ¿es eficiente? Es bueno deshacerse de la verbosidad cuando sea apropiado, pero la pregunta es sobre la forma más rápida y eficiente de escribir XML. Mirando el ejemplo anterior, diría que no es una buena solución para escribir grandes archivos XML de manera eficiente.Aunque me gusta su biblioteca para otros casos de uso, me gustaría sugerir esto porque lo más rápido y eficiente no es preciso y está promocionando su producto en lugar de ofrecer la mejor respuesta. Pero corrígeme si estoy equivocado. –

1

La mejor forma que conozco es usar un motor XPath que sea capaz de crear Nodos. XMLBeam es capaz de hacer esto (en una prueba unitaria aquí):

impresiones
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); 
} 

Este programa fuera:

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