2010-12-10 13 views
5

¿Cuál es la mejor solución de rendimiento para la generación XML?Custom Java XMLBuilder vs Standard classes-based

Mi objetivo es crear unos pocos XML simples a partir del código. Voy a implementar una implementación simple basada en StringBuffer de XML Builder. Desde el otro lado hay varias bibliotecas como http://code.google.com/p/java-xmlbuilder/ y http://code.google.com/p/xmltool/ que tiene un buen DSL, pero creo que la falta de rendimiento.

Dado que mi objetivo es construir XMLBuilder suficientemente simple con un gran rendimiento, creo que construiré una solución personalizada. Se ofrece:

  • DSL basada en Java Niza para las construcciones XML (añadiendo etiquetas básicamente)
  • Gran StringBuffer rendimiento basada.
  • Manejo de escape de datos de cadena al agregar etiquetas XML.
  • Auto-guión

Para sugerir si estoy equivocado en las expectativas de rendimiento y sus Probablemente es mejor utilizar las bibliotecas ya hechos.

ACTUALIZACIÓN. Por qué creo que el rendimiento de los constructores xml estándar no es muy bueno.

Los constructores XML estándar utilizan Document Builder Factory y trabajan con clases detrás de escena. También estas clases optimizadas para adaptarse a todos los usuarios. Por ejemplo, yo no necesito el apoyo de espacio de nombres, etc.

<?xml version="1.0" encoding="utf-8"> 
<root> 
<testdata>value</testdata> 
</root> 
</xml> 

Considere código XML muy simple anteriormente. Si construye con herramientas estándar, implicará tantos trabajos solo para hacer este simple XML. Considero que es mejor generarlo solo usando String.

ACTUALIZACIÓN 2. El requisito de rendimiento es que el código debe hacer tantas cosas como se requiera para generar XML simple y no más.

ACTUALIZACIÓN 3. Gracias ¡todos por excelentes comentarios! Ahora entiendo mejor lo que necesito y que mi objetivo inicial no se configuró muy correctamente con la palabra "rendimiento". Mi verdadero objetivo es utilizar una solución lo suficientemente simple con DSL conveniente para describir la estructura XML y generar el resultado XML.

Utilizaré objetos planos de Java como DSL para XML y generaré XML utilizando la biblioteca XStream, que es una solución bastante sencilla.

ACTUALIZACIÓN 4. JAXB. Discutí XStream vs JAXB y descubrí que JAXB es más rápido que XStream. Además, ya uso JAXB en mi proyecto y me gustan sus anotaciones estándar. Cambio de opinión e iré con JAXB por ahora porque XStream originalmente estaba muy desarrollado en el momento en que JAXB no era tan bueno como hoy.

+0

¿Qué es DSL? ¿Que significa? –

+0

@Elite: Idioma específico del dominio – skaffman

+4

¿Cuál es su requisito de rendimiento? Incluso si es un poco más lento, es probable que sea lo suficientemente rápido. El rendimiento no es el único criterio que elige una solución. –

Respuesta

4

voy a sugerir algo muy controvertido, pero aún así ...

realizar pruebas de rendimiento de perfiles y con las dos bibliotecas.

Si no tienes tiempo para eso, asumir que algo es lento sería una opción incorrecta en mi opinión. Porque si resulta que en realidad no es lento, le ahorraría mucho tiempo utilizar una biblioteca/marco ya construido y compatible.

Otra idea. Deberá probar su solución completa de alto rendimiento contra las soluciones ya disponibles de todos modos, para comprobar si realmente es de alto rendimiento. Por lo tanto, le sugiero que mida el rendimiento de las bibliotecas disponibles antes de comenzar la suya propia.

+0

Estoy de acuerdo contigo, pero como dijiste, no tengo tiempo para eso. Debo elegir una solución basada en la experiencia existente. Una vez que elijo el camino correcto, no iré por otros caminos, incluso si van a ser un poco mejores. – Vladimir

+4

@Vladimir, si no tiene tiempo para analizar, tampoco tiene tiempo para codificar. Busque una solución donde genere eventos SAX a un transformador generando su resultado. –

+2

@Vladimir puede terminar perdiendo tiempo si no los prueba. Es posible que no pueda elegir en la experiencia existente si no la tiene, que actualmente es el caso con estas 2 bibliotecas. Si puedo hacer una analogía, sería que actualmente tienes las opciones A, B y C. Vas por la opción C sin saber qué opciones son A y B. Que podría terminar lastimándote. Si no tiene tiempo para verificar, vaya con cualquiera ya que ahora hay forma de saber si esa es la opción correcta. – Simeon

2

Hay NodeBuilder de Groovy potente y flexible (http://groovy.codehaus.org/GroovyMarkup).

def root = new NodeBuilder() 
    .people(kind:'folks', groovy:true) { 
    person(x:123, name:'James', cheese:'edam') { 
     project(name:'groovy') 
     project(name:'geronimo') 
    } 
    person(x:234, name:'bob', cheese:'cheddar') { 
     project(name:'groovy') 
     project(name:'drools') 
    } 
    } 
XmlUtil.serialize(root, System.out) 

Esto se traduce en un documento XML:

<?xml version="1.0" encoding="UTF-8"?> 
<people kind="folks" groovy="true"> 
    <person x="123" name="James" cheese="edam"> 
    <project name="groovy"/> 
    <project name="geronimo"/> 
    </person> 
    <person x="234" name="bob" cheese="cheddar"> 
    <project name="groovy"/> 
    <project name="drools"/> 
    </person> 
</people> 
+1

que se ve genial! Incluso si no es súper rápido se ve bien. – Vladimir

+0

Parece, sin embargo, como construir un equivalente de árbol DOM en la memoria, y solo luego escribir. Esto significa rendimiento de salida basada en DOM así como limitaciones de memoria. – StaxMan

3

Con respecto a:

constructores XML estándar utiliza Documento Constructor de fábrica y trabaja con clases detrás de las escenas. También estas clases optimizadas para adaptarse a todos los usuarios. Por ejemplo No necesito el apoyo de espacio de nombres etc.

Una alternativa a DOM es StAX (JSR-173). Es una API de Streaming para XML que es bastante rápida. Hay varias implementaciones, he encontrado que Woodstox es bastante eficiente.

+0

gracias por esta respuesta bastante apreciar. Repensé ligeramente mi objetivo en la dirección de una solución más simple y conveniente en lugar de más rendimiento. – Vladimir

+0

No hay problema. Admitiré mi prejuicio por adelantado de que llevo la implementación de EclipseLink JAXB (MOXy). Pero JAXB es el estándar para la asignación de objetos a XML (varias implementaciones: Metro, MOXy, JaxMe, etc.). En su pregunta, hizo un gran hincapié en el rendimiento, y XStream (como todos los serializadores XML) tuvo un impacto en el rendimiento porque no hay un tiempo inicial de inicialización. Google y echa un vistazo a mi blog para obtener más información: http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

+0

. Estoy revisando tu blog. Por cierto, yo estaba usando TopLink 5 años después - buena API comparando con Hibernate :-) – Vladimir

1

Una sugerencia más de alto rendimiento: use StaxMate - es tan rápido como el escritor XML basado en Stax subyacente, que es bastante rápido (40 - 80 megabytes por segundo, sostenido). Solo asegúrate de NO utilizar la implementación predeterminada de Stax JDK 6 (Sun sjsxp) sino algo más rápido como Woodstox o Aalto.

Recomiendo encarecidamente que no escriba su propia grabadora de XML; por lo general es arriesgado (es muy probable que se olvide de alguna parte del escape) como otros mencionaron, y no es probable que sea más rápido que soluciones eficientes (no todas las soluciones existentes son eficientes, necesita encontrar las que son) Y al final ... a menos que realmente quieras escribir estas cosas, ¿por qué no trabajas en algo más interesante y significativo?

Pero si desea hacer algo más allá de los escritores existentes, podría considerar el uso de un escritor simple y aumentarlo con la funcionalidad adicional que necesita. Por ejemplo, si solo usa Stax XMLStreamWriter como base, es bastante fácil agregar abstracciones simples pero eficientes. O si le gustan los paquetes existentes, vea si puede sugerir mejoras a sus autores (o incluso contribuciones de código).