29 jun 2007

JAXB java en xml

In de huidige development van applicaties kun en wil je niet meer om xml als datasource heen.
Veelvuldig is bijvoorbeeld het gebruik van xml als dataopslag, en het tonen van de data regelen we dan met xsl(t).

Nu ben ik geen grote liefhebber van xsl, maar dat is een ander verhaal. Dit verhaal gaat over xml en wat doe je er dan mee in de verscheidene backend processen.

In mijn geval maak ik gebruik van Java in de verschillende backend processen. Wat is dan het meest praktische om met de xml data te kunnen werken?

Natuurlijk kun je met de standaard Dom of SAX parser door de xml heen en de verschillende waarden uit de xml gebruiken. Je kan zelfs, om het jezelf makkelijker te maken, XPath gebruiken om snel bij de verschillende data te komen. Na het verwerken van de data moet je dan weer de nieuwe waarden in de xml opslaan en klaar ben je.

Een andere mogelijkheid is gebruik maken van xml binding. Omdat xml qua structuur heel veel overeenkomt met objecten in een programmeer taal zou het mooi zijn als je de xml zou kunnen transformeren naar objecten. Nog mooier zou het zijn als dit proces ook vice versa zou werken.
Bovenstaande noemen we xml binding.

Voor Java zijn er verschillend xml binding mogelijkheden maar ik kwam uit op JAXB van Sun.
(Java Architecture for Xml Binding ). De oudere versies zijn opensource met een licentie die het toestaat het vrijelijk te gebruiken in je eigen software.

Omdat ik op Domino 7.02 werk en dus een jvm 1.4 tot mijn beschikking heb, heb ik gekozen voor JAXB versie 1.6.

Na het downloaden en installeren ( het is een Class bestand die je met java -cp kunt installeren ) krijg je een geinstalleerde JAXB omgeving op je machine. In de bin dir van deze software staan een aantal .bat programma's die je in staat stellen snel met JAXB aan de slag te gaan.

De werkwijze is als volgt:
Zorg ervoor dat je een schema van je xml hebt ( xsd ). Als je die niet hebt dan kunnen programma's als
OxYgen of XmlSpy je daar heel goed bij ondersteunen. Mijn voorkeur ligt trouwens bij OxyGen vanwege de, in mijn beleving, betere userinterface. Met behulp van deze programma's kun je je xml bestand converteren naar xsd. Kijk nog wel even handmatig naar de xsd en controleer de minOcc en maxOcc attributen van alle elementen. Zorg er ook voor dat de beschrijving van de elementen op dezelfde chronologische volgorde plaatsvind als in de xml.

Waarom nu xsd en geen dtd? Voor ons als domino developers zou dat makkelijker zijn omdat domino alle domino xml beschrijft in dtd's. De JAXB site schrijft hier hetvolgende over:




Why W3C XML Schema Language?
The W3C XML Schema Language is not the only schema language. In fact, the XML specification describes document-type definitions (DTDs) as the way to express a schema. In addition, pre-release versions of the JAXB Reference Implementation worked only with DTDs -- that is, not with schemas written in the XML Schema Language. However, the XML Schema Language is much richer than DTDs. For example, schemas written in the XML Schema Language can describe structural relationships and data types that can't be expressed (or can't easily be expressed) in DTDs. There are tools available to convert DTDs to the W3C XML Schema Language, so if you have DTD-based schemas that you used with an earlier version of the JAXB Reference Implementation, you can use these tools to convert the schemas to XML Schema Language.




Ok, xsd dus en nu we deze hebben kunnen we verder in het proces om onze applicatie JAXB compliant te maken. De truc is nu Java classes te genereren vanuit deze xsd. Het xjc.bat bestand in de bin directory gaat je hier bij helpen. Als je in een commandbox de volgende commandline invoert "xjc.bat -p " zal het programma een directory structuur voor je aanmaken met daarin alle benodigde classes.



In eclipse kun je vervolgens deze directory importeren in je java project. Wel heeft eclipse dan nog een aantal jar bestanden nodig om de geimporteerde code te kunnen compileren. Deze jar bestanden kun je vinden in de lib directory van JAXB en zijn:


  • jax-qname.jar,

  • namespace.jar,

  • relaxngDatatype.jar

  • jaxb-api.jar

  • jaxb-impl.jar

  • jaxb-libs.jar

  • jaxb-xjc.jar

Het onderstaaande schema geeft de bovenstaande stappen schematisch weer:





Nu we alles in eclipse hebben zitten kunnen we gaan werken met de javaclasses. Dit doen we via de meegeleverde JAXB Api. De eerste stap is het unmarshallen( i= het inlezen van de xml in java objecten ). Met deze objecten kun je aan de slag. Properties kun je wijzigen data kun je aanpassen en als je klaar bent kun je de objecten marshallen ( = terugschrijven naar xml ).

Al met al een krachtige manier om met xml te werken binnen domino.

Geen opmerkingen: