Parsing con JAXP


1. Configurazione del Parser

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.

Footer BGFooter BG
Tito Flagella - © 2007-2015