Il modo più semplice di trasformare un documento XML nel corrispondente albero DOM, è quello di eseguirne il parsing con le API JAXP.
L'uso di queste librerie è semplice ed intuitivo, ma ci sono alcune opzioni di configurazione che se non impostate possono portare a comportamenti non previsti. Vediamone un esempio:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse( new File("test.xml") );
Il codice mostrato esegue il parsing del documento XML contenuto nel file test.xml
:
<?xml version="1.0" encoding="UTF-8"?> <tns:nome xmlns:tns="http://www.prova.org/prova">nomenome</tns:nome>
Se il DOM prodotto lo riportiamo in Stringa, otteniamo l'XML di partenza. Se configuriamo il parsar per eseguire la validazione durante la costruzione del DOM ci viene ritornato un errore di validazione:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setSchema(mySchema); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse( new File("test.xml") ); ------ Output ------ org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'tns:nome'.
Un indizio lo da l'errore stesso che riferisce l'elemento nome
come tns:nome
e non come {http://www.prova.org/prova}:nome
. Il problema sta infatti nel non aver istruito la factory per
creare Builder che supportino i namespace usando il metodo setNamespaceAware
.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setSchema(mySchema); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse( new File("test.xml") );
Altre opzioni di parsing dei documenti sono configurabili da altri metodi della factory documentati
nelle javadoc della DocumentBuilderFactory
.