XmlBeans namespace bug! switch to JAXB 2.1

Quando si cerca di utilizzare un file xml sarebbe importante associarlo ad un file xsd (conformita’ dei dati). Spesso tale xsd non e’ implementato da noi stessi e spesso manca. Ci sono varie soluzioni per ottenere (“infer”) lo schema da un file xml e una delle migliori e sicuramente il tool XmlBeans – riporto un mini HowTo

################################
mini-HowTo XMLbeans
################################
http://xmlbeans.apache.org/

Installare il tool e settare le variabili d’ambiente:
XMLBEANS_HOME – directory di installazione di xmlbeans

Creare dal file xml lo schema attraverso il tool “inst2xsd”:

inst2xsd -outPrefix <nome_file_schema> <xml_di_esempio>

Utilizzare il tool “scomp”:
scomp -out <nome_file_jar.jar> -noupa <nome_file_schema.xsd> <nome_file_config.xsdconfig>

Per ottenere un xml di esempio, utilizzare il tool “xsd2inst”:
xsd2inst -name <nome_file_xml> <nome_file_schema.xsd>

################################

Il problema nasce quando si cerca di utilizzare 2 schema con stessi elementi definiti al livello di root: il jar che utilizziamo per eseguire il parser non riesce a riconoscere le classi nonostante queste siano definite con package differenti nel file .xsdconfig che riporto sotto:

<xb:config xmlns:xb=”http://xml.apache.org/xmlbeans/2004/02/xbean/config”>
<xb:namespace>
<xb:package>x.y.z</xb:package>
</xb:namespace>
</xb:config>

Questo bug e’ riportato qui: https://issues.apache.org/jira/browse/XMLBEANS-346?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12540314

Questo problema puo’ essere(?) risolto utilizzando correttamente il file .xsdconfig:’utilizzo corretto del file xsdconfig e’ spiegato qui. Riporto le parti piu’ importanti:

<xb:config xmlns:xb=”http://xml.apache.org/xmlbeans/2004/02/xbean/config”
xmlns:ep=”http://openuri.org/easypo”>

<xb:namespace uri=”http://openuri.org/easypo”>
<xb:package>com.easypo</xb:package>
</xb:namespace>

<xb:namespace uriprefix=”http://openuri.org/eas”>
<xb:prefix>Xml</xb:prefix>
</xb:namespace>

<xb:namespace uriprefix=”http://openuri.org/easy”>
<xb:suffix>Bean</xb:suffix>
</xb:namespace>

</xb:config>

Sinceramente non ho verificato di persona se tale bug puo’ essere superato utilizzando correttamente il file .xsdconfig e sono passato ad un altra tecnologia: JAXB 2.1.

Vantaggi:

- prestazioni soprattutto su grandi mole di dati

- uso delle annotations

- jar piu’ snelli

- piu’ semplice

Anch’ esso presenta un problemino relativo al namespace ma facilmente risolvibile con un cast forzato (JAXBElement), vedi http://forums.sun.com/thread.jspa?threadID=748615

Leave a Reply