2012-01-28 2 views
6

Qual è il modo più rapido ed efficiente per creare documenti XML in Java? C'è una pletora di librerie là fuori (woodstox, xom, xstream ...), chiedendosi solo se qualcuno ha qualche input. Dovrei andare con l'approccio alla generazione del codice (dato che lo schema xml è ben noto)? O approccio alla riflessione in fase di esecuzione?Il modo più veloce ed efficiente per creare XML

modificati con Ulteriori informazioni:

  1. ben definito XML Schema è disponibile e cambia raramente
  2. requisito è quello di convertire un oggetto Java in XML, e non viceversa
  3. Migliaia di oggetti Java XML al secondo
  4. La generazione del codice, la complessità del codice, la configurazione, la manutenzione ecc. è seconda a prestazioni più elevate.
+1

Come si fa a definire efficiente? Meno utilizzo della memoria? Meno linee di codice da usare? Il più veloce nel fare cosa? Marshalling? Unmarshalling di documenti di grandi dimensioni? Bella stampa? Cosa stai facendo che richiede la libreria "più veloce"? Assicurati di scegliere una libreria basata su ciò che è veramente importante e non su un criterio che non ha importanza. Potresti scoprire che è meglio scegliere una libreria che sia "abbastanza veloce" perché è più facile da usare rispetto a una libreria che è la "più veloce", ma è un mal di testa completo da usare e mantenere. – Paul

+0

La frase "Più efficiente" non è chiara. Il più efficiente per memoria o CPU aiuta a chiarire. –

+1

possibile duplicato di [Quale libreria di serializzazione xml è orientata al rendimento?] (Http://stackoverflow.com/questions/5918665/which-xml-serialization-library-is-performance-orientated) – skaffman

risposta

11

Se dovessi creare un molto semplice contenuto XML, vorrei bastone solo l'API JDK, l'introduzione di alcun terze parti dipendenze.

Quindi per XML semplice e se si fosse a mappare il file XML in classi Java (o viceversa), vorrei andare per JAXB. See this tutorial per vedere come è facile.

Ora.

Se dovessi creare qualche output XML più sofisticato con uno schema costante, userei un po 'di motore di template, Freemarker forse. Thymeleaf sembra bello.

E infine.

Se dovessi creare enormi file XML in modo molto efficace, vorrei usare SAX parser.

Spero che tu capisca ora, che hai un sacco di possibilità - scegliere la migliore corrispondenza per le vostre esigenze :)

e buon divertimento!

+6

Non considererei 'StringBuilder' il modo semplice per creare xml validi. Penso che sia il modo più complesso, perché devi fare tutto da solo. Guarda come è facile creare xml dagli oggetti usando EclipseLink MOXy, ad esempio: [MOXy: Getting Started] (http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics) È molto più semplice dell'uso ' StringBuilder'. – Paul

+0

@Paul, buon punto. Dicendo il più semplice intendevo: non introdurre dipendenze da terze parti ed evitare SAX. Modificherò la risposta. –

+1

Grazie Lukas, come menzionato nel commento precedente, voglio prestazioni più veloci. L'XML non è enorme. Non ho bisogno di mappare i file XML sugli oggetti java. Quindi questo aiuta a restringerlo. Mi piace l'idea dei motori dei modelli, che esaminerò. Pubblicherò la mia esperienza qui. – arrehman

2

In primo luogo, è importante che la serializzazione sia corretta. I serializzatori scritti a mano di solito non lo sono. Ad esempio, hanno la tendenza a dimenticare che la stringa "]]>" non può apparire in un nodo di testo.

Non è troppo difficile da scrivere il proprio serializer che sia corretto e veloce, se sei un programmatore Java in grado, ma dal momento che alcuni programmatori Java molto capaci sono stati qui prima che io pensi di essere improbabile per batterli da un margine sufficiente per far valere lo sforzo di scrivere il proprio codice.

Tranne forse che la maggior parte delle librerie generiche potrebbe essere rallentata un po 'offrendo opzioni di serializzazione - come il rientro, o la codifica, o come scegliere le terminazioni di linea. Potresti semplicemente spremere un extra di prestazioni evitando le funzionalità indesiderate.

Inoltre, alcune librerie di uso generale potrebbero verificare la correttezza di ciò che si lancia su di esse, ad esempio controllando che i prefissi dei namespace siano dichiarati (o dichiarandoli se non lo sono). Potresti renderlo più veloce se non esegue alcun controllo. D'altra parte, potresti creare una libreria che è veloce, ma un maiale con cui lavorare. Mettere le prestazioni al di sopra di tutti gli altri obiettivi è quasi sempre un errore.

Per quanto riguarda le prestazioni delle librerie disponibili, misurarle e comunicarci cosa si trova.

+0

Hai menzionato alcuni aspetti importanti riguardanti le prestazioni. Grazie. – arrehman

4

Prova Xembly, una piccola libreria open source che rende questo processo la creazione di XML molto semplice ed intuitivo:

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

Xembly è un wrapper Java nativo DOM, ed è una libreria molto leggero (io sono un sviluppatore).

+1

Ho trovato utile anche questo post: http://www.yegor256.com/2014/04/09/xembly-intro.html –

+0

La tua biblioteca è utile ma è efficiente? È piacevole sbarazzarsi della verbosità quando appropriato, ma la domanda riguarda il modo più veloce ed efficiente di scrivere XML. Osservando l'esempio sopra, direi che non è una buona soluzione per scrivere file XML di grandi dimensioni in modo efficiente.Anche se mi piace la tua libreria per altri casi di utilizzo, mi sembra di suggerire questo perché il più veloce ed efficiente non è accurato e stai promuovendo il tuo prodotto invece di fornire la migliore risposta. Ma correggimi se sbaglio. –

1

Il modo più piacevole che conosco è utilizzare un motore XPath in grado di creare nodi. XMLBeam è in grado di fare questo (in un test JUnit qui):

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

Questo programma fuori:

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