Scrivi un documento org.w3.dom in un file

1. Panoramica

Una parte importante della gestione dell'XML è la creazione di file XML che possono essere utilizzati da altri.

Quando gestiamo XML in Java, spesso avremo un'istanza di org.w3c.dom.Document che dobbiamo esportare.

In questo rapido tutorial, vedremo come scrivere un documento su un file sia in un formato in linea che in un formato piuttosto stampato .

2. Utilizzo di un trasformatore

L' elemento più importante durante la scrittura di documenti su file è javax.xml.transform.Transformer.

2.1. Creazione del trasformatore

Quindi, iniziamo ottenendo un TransformerFactory . Useremo questa fabbrica per creare il trasformatore:

TransformerFactory transformerFactory = TransformerFactory.newInstance()

La proprietà di sistema javax.xml.transform.TransformerFactory specifica quale implementazione di fabbrica creare. Di conseguenza, questa proprietà denomina una sottoclasse concreta della classe astratta TransformerFactory . Ma, se non definiamo questa proprietà, il trasformatore utilizzerà semplicemente un valore predefinito della piattaforma.

Nota che a partire da Java 9, possiamo usare TransformerFactory. newDefaultInstance () per creare l'implementazione predefinita di sistema incorporata.

Ora che abbiamo la fabbrica, creiamo il Transformer :

Transformer transformer = transformerFactory.newTransformer();

2.2. Specifica dell'origine e del risultato

Il Transformer trasforma una sorgente in un risultato. Nel nostro caso, la fonte è il documento XML e il risultato è il file di output.

Innanzitutto, specifichiamo l'origine della trasformazione. Qui, useremo il nostro documento per costruire una sorgente DOM:

DOMSource source = new DOMSource(document);

Nota che la fonte non deve essere l'intero documento. Finché l'XML è ben formato, possiamo usare un sottoalbero del documento.

Successivamente, specificheremo dove il trasformatore dovrebbe scrivere il risultato della trasformazione:

FileWriter writer = new FileWriter(new File(fileName)); StreamResult result = new StreamResult(writer);

Qui stiamo dicendo al trasformatore che il risultato è un flusso di file. Tuttavia, possiamo utilizzare qualsiasi tipo di java.io.Writer o java.io.OutputStream per creare StreamResult. Ad esempio, potremmo usare uno StringWriter per costruire una String che può quindi essere registrata.

2.3. Creazione del file XML

Infine, diremo al trasformatore di operare sull'oggetto sorgente e di inviare l'output all'oggetto risultato:

transformer.transform(source, result);

Questo creerà finalmente un file con il contenuto del documento XML:

3. Personalizzazione dell'output

Possiamo personalizzare l'XML scritto nel file specificando una varietà di proprietà di output . Esploriamo alcuni di questi.

3.1. Bella stampa dell'output

Ora, il nostro trasformatore predefinito ha semplicemente scritto tutto su una singola riga, che non è così piacevole da leggere. In effetti, sarebbe ancora più difficile da leggere se l'XML fosse di grandi dimensioni.

Possiamo configurare il nostro trasformatore per una stampa carina impostando la proprietà OutputKeys.INDENT sul trasformatore:

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{//xml.apache.org/xslt}indent-amount", "4");

Si noti che insieme a OutputKeys.INDENT , qui abbiamo anche specificato la proprietà indent-amount . Questo farà rientrare correttamente l'output, poiché per impostazione predefinita il rientro è zero spazi.

Con le proprietà di cui sopra impostate, otteniamo un output molto migliore:

3.2. Omettere la dichiarazione XML

A volte, potremmo voler escludere la dichiarazione XML.

Possiamo configurare il nostro trasformatore per farlo impostando la proprietà OutputKeys.OMIT_XML_DECLARATION :

transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

E usando di nuovo il nostro trasformatore, otteniamo:

3.3. Altre proprietà di output

Quindi, a parte la stampa carina e l'omissione della dichiarazione XML, possiamo personalizzare l'output anche in altri modi:

  • Possiamo specificare la versione XML utilizzando OutputKeys.VERSION, il valore predefinito è "1.0"
  • Possiamo indicare la nostra codifica dei caratteri preferita utilizzando OutputKeys.ENCODING , il valore predefinito è "utf-8"
  • Inoltre, possiamo anche specificare altri attributi di dichiarazione tipici come SYSTEM , PUBLIC e STANDALONE .

4. Conclusione

In questo tutorial, abbiamo visto come esportare un org.w3c.Document in un file e come personalizzare l'output.

E, naturalmente, il codice sorgente di accompagnamento è disponibile su GitHub.