Archivi categoria: XML

La categoria contiene articoli dedicati al formato XML

JAXB: manca un’annotazione @XmlRootElement

L’eccezione com.sun.istack.SAXException2: impossibile eseguire il marshalling del tipo come elemento poichè manca un’annotazione @XmlRootElement capita quando si prova a fare il marshalling di un oggetto non annotato come root element.

Per risolvere questo problema basta annotare l’elemento con la annotation @XmlRootElement

E’ la soluzione più semplice ma se le classi sono ottenute in modo automatico, magari tramite un plugin maven ad ogni iterazione si presenta nuovamente il problema.

In questo caso vi viene in soccorso la classe ObjectFactory generata dal plugin che vi offre dei metodi create* che restituisco l’oggetto annidato dentro il wrapper JAXBElement e il gioco è fatto.

JAXBElement createTrasferimentoDati = new ObjectFactory().createTrasferimentoDati(trasferimentoDati);

XML TUTORIAL – 6 – USARE XMLBEANS

Con l’articolo di oggi vediamo in dettaglio come sfruttare una delle librerie più note nella gestione dei file XML, ovvero XMLBEANS dell’Apache Software Foundation.

Questa libreria permette di generare a partire dallo schema XSD tutte le classi per la manipolazione di file xml che rispettino lo schema dato.

Per l’installazione rimando alla guida esauriente presente sul sito di XMLBEANS. Per l’utilizzo vediamo invece quali sono gli step da seguire.

Individuiamo uno schema XSD, da cui generare le nostre classi e scegliamo la struttura libro.

Tramite la direttiva scomp posso generare la libreria contenente le classi per la manipolazione dei file.

Con questo comando dico a XmlBeans di generare un jar che libro.jar secondo gli standard di java 1.5

A questo punto importanto la libreria dentro un qualsiasi progetto posso creare file xml in accordo con lo schema definito o validare dei file xml esistenti.

Lettura File XML

In questo modo posso instanziare un oggetto libro ottenuto dalla lettura del file xml

Creazione File XML

In questo modo posso creare un file xml a partire dall’oggetto java.

Validazione File XML

Ultimo caso, ma non per questo meno interessante, prevede lo scenario in cui l’utente vuole verificare se il file da analizzare rispetta lo schema e in caso negativo in quali punti non è corretto.

 

XML TUTORIAL – 5 – XSD E PARSER

Per poter validare un file XML occorre indicare al parser dove recuperare lo schema. Tale informazione può essere indicata  nell’elemento radice del file usando i tag xmlns:xsi e xsi:noNamespaceSchemaLocation.

L’attributo xmlns:xsi indica un URL che specifica la modalità con cui si indicherà il riferimento allo schema XML, mentre l’attributoxsi:noNamespaceSchemaLocation indica il nome e l’eventuale percorso del file contenente lo schema XML di riferimento.

Concetto fondamentale è quello del namespace, che permette di individuare univocamente un tipo all’interno del file xml, qualora all’interno del file sia presenti grammatiche diverse.

Per namespace si intende un insieme di nomi di elementi e nomi di attributi identificati univocamente da un identificatore.

Per definire un namespace si usa l’attributo xmlns associato al root element, come nel seguente esempio:

Questa formula indica che l’elemento articolo ed i suoi sottoelementi utilizzano i nomi definiti nel namespace identificato dall’identificatore http://www.valeriofinazzo.it/libro. Il valore del namespace è una stringa libera, che per prassi, viene indicata tramite una URI, Uniform Resource Identifier.

È possibile creare delle abbreviazioni per fare riferimento ai namespace, costituite da caratteri alfanumerici seguiti da due punti (:) dichiarati nel root element ed utilizzati come prefissi dei nomi degli elementi.

Es. <lib:libro titolo=”Titolo” xmlns:lib=”http://www.valeriofinazzo.it/libro”  >

XML TUTORIAL – 4 – XML SCHEMA DEFINITION

Dopo aver visto i limiti del DTD analizziamo l’altra soluzione che li supera e permette una definizione univoca di tutte le caratteristiche di un file xml.

L’XML Schema introduce il concetto di tipo di dato semplice per definire gli elementi che non possono contenere altri elementi e non prevedono attributi. Tali dati semplici possono essere utilizzati per definire elementi più complessi.

Sono previsti dei dati predefiniti come ad esempio l’integer, che definisce un numero intero oppure è possibile definire altri tipi semplici.

Ad esempio <xs:element name=”nome” type=”xs:string” /> preveve che l’elemento name in un documento XML possa contenere una sequenza di caratteri.

A partire dai dati predefiniti è possibile definire altri tipi di dati semplici, potendo aggiungere ulteriori restrizioni. Ad esempio possiamo ridefinire l’elemento nome aggiungendo che sia una stringa di almeno 5 caratteri. La definizione di un tipo semplice utilizza il tag simpleType.

In altre parole, la dichiarazione indica che l’elemento <quantita> è di tipo semplice e prevede una restrizione sul tipo di dato intero predefinito accettando valori compresi tra 1 e 100.

Per dato complesso si intende un elemento che possa contenere altri elementi o avere attributi. La definizione di un elemento complesso si avvale del tag complexType. Per definire gli elementi che un elemento complesso sono disponibili 3 costruttori diversi:

  • <xs:sequence> Consente di definire una sequenza ordinata di sottoelementi
  • <xs:choice> Consente di definire un elenco di sottoelementi alternativi
  • <xs:all> Consente di definire una sequenza non ordinata di sottoelementi

Per ciascuno di questi costruttori e per ciascun elemento è possibile definire il numero di occorrenze previste utilizzando gli attributi minOccurs e maxOccurs.

Per definire gli attributi di un elemento si usa il tag <xs:attribute>, che può essere dichiarato opzionale o obbligatorio.

XML TUTORIAL – 3 – DOCUMENT TYPE DEFINITION

Il Document Type Definitio, detto Dtd, è un documento che descrive i tag previsti in un documento XML, la loro relazione e le informazioni sugli attributi di ciascun tag.

All’interno di un Dtd si individuano essenzialmente 2 tag:

  • <!ELEMENT>
  • <!ATTLIST>

<!ELEMNT> definisce gli elementi del documento, la loro relazione e di conseguenza la struttura del documento.

<!ATTLIST> definisce la lista di attributi di ciascun elemento.

La sintassi del Dtd prevede l’utilizzo di alcuni operatori per individuare l’occorrenza degli elementi in uno schema.

  • + indica che l’elemento è presente una o più volte

  • * indica che l’elemento è presente zero o più volte

  • ? indica che l’elemento è presente zero o una sola volta

Dunque un DTD del genere <!ELEMENT libro(autore, capitolo+)> indica che un libro contiene un elemento autore e una o più occcorenze di un elemente capitolo.

Per gestire il contenuto di un elemento si posso usare le parole chiavi EMPTY, PCDATA, CDATA e ANY.

Un tag vuoto viene definito come <!ELEMENT vuoto EMPTY>, un tag che contiene solo testo prevede una definizione del tipo <!ELEMENT text (#PCDATA)>, se non sono noti valori a priori si usa ANY con una dichiarazione del tipo <!ELEMENT jolly ANY>

Per definire gli attributi di un elemento si usa il tag <!ATTLIST>, con l’ausilio delle parole chiavi

  • #REQUIRED (obbligatorio)
  • #IMPLIED     (opzionale)

  • #FIXED        (valore fisso)

Ad esempio la dichiarazione <!ATTLIST libro titolo   CDATA #REQUIRED > indica che l’elemento libro ha un attributo obbligatorio di tipo testo denominato titolo.

Per indicare il Dtd cui fa riferimento un file XML è possibile seguire 2 approcci: inserire il Dtd all’interno del file XML utilizzando il tag !DOCTYPE oppure inserendo il path del file Dtd, che può essere un path locale o un indirizzo web.

es. 1  <?xml version=”1.0″><!DOCTYPE libro[…Definizioni del Dtd…]>

es. 2  <?xml version=”1.0″><!DOCTYPE libro SYSTEM “articolo.dtd”>

es.3  <?xml version=”1.0″><!DOCTYPE articolo SYSTEM http://www.valeriofinazzo.it/libro.dtd”>

Con l’uso dei Dtd un parser può verificare la correttezza sintattica di un file xml, tuttavia alcune limitazioni del Dtd ne sconsigliano l’uso in favore di un altro approccio, quello dell’XML Schema.

XML TUTORIAL – 2 – ELEMENTI BASE

partiamo da un esempio di file xml per evidenziare le caratteristiche basi di un file xml

La prima riga del documento  <?xml version=”1.0″ ?> identifica il file documento XML specificando la versione.

XML permette di definire quanti tag si voglia purchè essi vengano sempre chiusi. Inoltre è possibile specificare un attributo inserendo il nome dell’attributo con il relativo valore all’interno del tag di apertura dell’elemento.

XML prevede una sintassi abbreviata per gli elementi vuoti che evita di dover specificare il tag di chiusura, terminando il tag di apertura con la sequenza di caratteri “/>”, come nel seguente esempio.

Le due notazioni per gli elementi vuoti sono equivalenti.

Riassumendo tutti i documenti XML devono essere ben formati e affinchè un documento XML sia ben formato deve rispettare le seguenti regole:

  • Ogni documento XML deve contenere un unico elemento di massimo livello (root) che contenga tutti gli altri elementi del documento.
  • Ogni elemento deve avere un tag di chiusura o, se vuoti, possono prevedere la forma abbreviata (/>)
  • Gli elementi devono essere opportunamente nidificati, cioè i tag di chiusura devono seguire l’ordine inverso dei rispettivi tag di apertura
  • XML fa distinzione tra maiuscole e minuscole, per cui i nomi dei tag e degli attributi devono coincidere nei tag di apertura e chiusura anche in relazione a questo aspetto
  • I valori degli attributi devono sempre essere racchiusi tra singoli o doppi apici

La scelta dei nomi dei tag deve seguire alcune regole: un tag può iniziare con un lettera o un underscore (_) e può contenere lettere, numeri, il punto, l’underscore (_) o il trattino (-). Non sono ammessi spazi o altri caratteri. Inoltre XML è sensibile all’uso di maiuscolo e minuscolo.

Per quanto riguarda il contenuto, un documento XML può contenere potenzialmente qualsiasi carattere dell’alfabeto latino, cifre e punteggiatura. L’encoding deve essere specificato nell’intestazione del documento, es.

E’ possibile inserire dei commenti tramite le sequenze di caratteri <!– e –> e possono trovarsi in qualsiasi punto del documento.

Infine per poter inserire caratteri chiavi dell’xml in modo che vengano considerati come semplice testo si fa ricorso alla sezione CDATA.

La sezione CDATA (Character DATA) è un blocco di testo che viene considerato sempre come testo, anche se contiene codice XML o altri caratteri speciali. Per indicare una sezione CDATA è sufficiente racchiuderla tra le sequenze di caratteri <![CDATA[ e ]]>.

XML TUTORIAL – 1 – INTRODUZIONE

Inizia una serie di articoli dedicati a quel componente che ha influenzato pesantemente lo sviluppo delle applicazioni in ambito enterprise, ovvero l’XML, acronimo di eXtensible Markup Language.

Esso è un linguaggio che permette di definire altri linguaggi di markup. Definisce un insieme standard di regole sintattiche per modellare la struttura di documenti e dati. Tali specifiche ufficiali sono state definite dal W3C (Worl Wide Web Consortium) e sono consultabili all’indirizzo http://www.w3.org/XML.

XML è dunque un meta-linguaggio per definire la struttura di documenti e dati, dove per documento XML si intende un file di testo contenente una serie di tag, attributi e testo secondo regole sintattiche ben definite.

Il documento XML è caratterizzato da una struttura gerarchica, composto da componenti denominati elementi. Ciascun elemento rappresenta un componente logico del documento e può contenere altri elementi (sottoelementi) o del testo. Ad ogni elemento possono essere associate informazioni dette attributi, che descrivono le proprietà dell’elemento.

L’organizzazione degli elementi presenta un ordine gerarchico con un elemento principale detto root element e gli elementi che compongono l’albero vengono definiti tag.

Nel prossimo articolo vedremo in dettaglio una struttura xml per approfondire i contetti espressi