Java & XML - XSL-FO
Vrijwel alle namen van software- en hardwareproducten die in deze cursus worden genoemd, zijn tegelijkertijd ook handelsmerken en dienen dienovereenkomstig te worden behandeld. Alle rechten voorbehouden. Niets uit deze uitgave mag worden verveelvuldigd, opgeslagen in een geautomatiseerd gegevensbestand of openbaar worden gemaakt in enige vorm of op enige wijze, hetzij elektronisch, mechanisch, door fotokopieën, opnamen of op enige andere manier, zonder voorafgaande schriftelijke toestemming van de auteur. De enige uitzondering die hierop bestaat, is dat eventuele programma’s en door de gebruiker te typen voorbeelden mogen worden ingevoerd opgeslagen en uitgevoerd op een computersysteem, zolang deze voor privé-doeleinden worden gebruikt, en niet bestemd zijn voor reproductie of publicatie. Correspondentie inzake overnemen of reproductie kunt u richten aan: Noël Vaes Roode Roosstraat 5 3500 Hasselt België Tel: +32 474 38 23 94
[email protected] www.noelvaes.eu Ondanks alle aan de samenstelling van deze tekst bestede zorg, kan de auteur geen aansprakelijkheid aanvaarden voor eventuele schade die zou kunnen voortvloeien uit enige fout, die in deze uitgave zou kunnen voorkomen. 06/07/2015
Copyright© 2015 Noël Vaes
Inhoudsopgave Hoofdstuk 1.Java & XML......................................................2 1.1.Inleiding........................................................................................................................ 2 1.1.1.XML in de Java Standard Edition..........................................................................2 1.2.JDOM........................................................................................................................... 3 1.2.1.Inleiding.................................................................................................................3 1.2.2.Algemeen overzicht...............................................................................................4 1.2.3.Een document rechtstreeks aanmaken.................................................................5 1.2.4.Een JDOM-document wegschrijven....................................................................10 1.2.5.Een JDOM-document inlezen.............................................................................11 1.2.6.Navigeren in JDOM-documenten........................................................................12 1.2.7.Namespaces.......................................................................................................15 1.2.8.Schema's............................................................................................................ 17 1.3.JAXB.......................................................................................................................... 19 1.3.1.Inleiding............................................................................................................... 19 1.3.2.Schema omzetten naar klassen..........................................................................19 1.3.3.Marshalling.......................................................................................................... 22 1.3.4.Unmarshalling.....................................................................................................23 1.4.XSLT transformaties...................................................................................................24
Hoofdstuk 2.XSL-FO...........................................................29 2.1.Inleiding...................................................................................................................... 29 2.2.Apache FOP............................................................................................................... 30 2.3.Mijn eerste XSL-FO document...................................................................................32 2.4.Pagina layout.............................................................................................................. 33 2.4.1.Enkelvoudige layout............................................................................................34 2.4.2.Meervoudige pagina layout.................................................................................37 2.4.3.Invulling van de layout.........................................................................................40 2.5.Formattering............................................................................................................... 44 2.6.Lijsten......................................................................................................................... 47 2.7.Tabellen...................................................................................................................... 49 2.8.Afbeeldingen............................................................................................................... 50 2.9.Verwijzingen............................................................................................................... 50 2.10.XSL Transformaties..................................................................................................51
Copyright© 2015 Noël Vaes
-1-
www.noelvaes.eu
Java & XML
Hoofdstuk 1. Java & XML 1.1. Inleiding 1.1.1. XML in de Java Standard Edition Voor het omgaan met XML documenten zijn er in de Java Standard Edition twee technologieën: 1. JAXP: Java API for XML Processing 2. JAXB: Java API for XML Binding JAXB zullen we in een afzonderlijk hoofdstuk behandelen. JAXP wordt gebruikt om bestaande XML-documenten te parsen, aan te maken en te transformeren m.b.v. XSLT. JAXP is enkel een specificatie en kan gebruik maken van verschillende implementaties van de parsers die ingeplugd kunnen worden. JAXP valt op zijn beurt uiteen in drie technieken om XML-documenten te behandelen: 1. SAX: Simple API for XML Hierbij wordt een XML-document van het begin tot het einde overlopen door een SAX Reader en bij ieder element, attribuut of processing instruction wordt een event gegenereerd dat door een event-handler wordt afgehandeld. Op die manier wordt het gehele document verwerkt door verschillende event-handlers. Deze techniek is snel en vraagt weinig geheugen. Het is echter niet mogelijk hiermee documenten te wijzigen. Bovendien is het een verwerking die op laag niveau gebeurt en dat is niet steeds wat men nodig heeft.
events
Content Handler
Error Handler XML
SAX Reader DTD Handler
Entity Resolver
Copyright© 2015 Noël Vaes
-2-
www.noelvaes.eu
Java & XML
2. DOM: Document Object Model Hierbij wordt van het XML-document een representatie in het geheugen gemaakt. Ieder element, attribuut enz.. wordt vertegenwoordigd door een Java-object (node). Deze objecten zijn aan elkaar gekoppeld en vormen zo een boomstructuur die overeenkomt met de structuur van het XML-document. Deze techniek maakt het mogelijk aanpassingen te doen en bovendien kan men makkelijk navigeren in de boomstructuur om het gewenste element te manipuleren. Het opbouwen van dit object-model vraagt wel de nodige processortijd en geheugen. Dit is vooral een probleem bij heel grote XMLdocumenten. DOM is in vele gevallen de meest aangewezen techniek als men XML-documenten wil manipuleren of creëren. De DOM API is bovendien gestandaardiseerd door W3C en is beschikbaar in verschillende programmeertalen. De DOM API is echter complex en onhandig in gebruik. Om die reden zijn er in de Java wereld een alternatieven ontwikkeld die makkelijker hanteerbaar zijn: JDOM, DOM4J 3. XSLT: Extensible Stylesheet Language Transformation Deze technologie dient om XML documenten te transformeren a.h.v. XSL-stylesheet documenten. In deze cursus gaan we een alternatief voor DOM bekijken, namelijk JDOM. Daarnaast behandelen we summier JAXB, XSLT en XSL-FO.
1.2. JDOM 1.2.1. Inleiding JDOM is een open source project waarbij het de bedoeling is XML documenten op een eenvoudige wijze te behandelen en manipuleren en dit op een manier die voor Java programmeurs vertrouwd is. In tegenstelling tot DOM vertrekt JDOM helemaal vanuit de Java programmeertaal. JDOM kan bovendien samenwerken met SAX en DOM.
Document Object
XML
DOM Builder
Object
Object
Object
Object
JDOM bouwt net als DOM een hiërarchie van Java-objecten die de structuur van een XMLdocument vertegenwoordigen. JDOM is beschikbaar op volgende website: www.jdom.org
Opdracht 1: JDOM installeren In deze opdracht gaan we het pakket JDOM integreren in een nieuw project. Copyright© 2015 Noël Vaes
-3-
www.noelvaes.eu
Java & XML
Indien je gebruik maakt van Maven voeg je de volgende dependency in de POM toe: <dependency>
jdom <artifactId>jdom
1.1 jar <scope>compile
Indien je geen gebruik maakt van Maven, volg je volgende stappen: Haal het pakket JDOM 1.1 van de website en pak het bestand uit in een lokale map. Lokaliseer het bestand jdom.jar en de documentatie in de map apidocs.
Maak een nieuw project met de naam JDOM in je favoriete IDE. Plaats het bestand jdom.jar in de map lib van je project en zorg dat dit JAR-bestand opgenomen is in het classpath van het project. Koppel ook de API documentatie zodat je makkelijk vanuit de IDE deze kan openen. Genereer eventueel de documentatie eerst met ant javadoc
1.2.2. Algemeen overzicht JDOM maakt gebruik van een objectmatige voorstelling van een XML-document. We noemen dit een JDOM-document. In onderstaand overzicht wordt aangegeven hoe een dergelijk JDOM-document gecreëerd wordt op basis van andere representaties van XMLdocumenten. Tevens wordt weergegeven hoe men van dit JDOM-document terug andere representaties kan genereren. Direct Build XML Document
SAX Builder
XML Outputter
XML Document
JDOM Document SAX Events
SAX Handler
SAX Outputter
SAX Events
DOM Nodes
DOM Builder
DOM Outputter
DOM Nodes
Voor het aanmaken van een JDOM-document hebben we volgende mogelijkheden: 1. Direct Build: We kunnen het document zelf programmatorisch aanmaken. Dit is nodig als we een nieuw XML-document moeten genereren. Hierbij wordt de documentstructuur stap voor stap opgebouwd in het geheugen. 2. SAX Builder: Via de SAX Builder kunnen we een bestaand XML-document lezen en hiervan een JDOM-document maken. Het parsen van het XML-document gebeurt op basis van een SAX-parser. Het XML-document kan aangeleverd worden via o.a. een bestand, stream of reader. 3. SAX Handler: Indien het XML document aangeleverd wordt in de vorm van een aantal SAX-events kunnen we gebruik maken van de SAX Handler. Deze zal op basis van de events het JDOM-document opbouwen. Copyright© 2015 Noël Vaes
-4-
www.noelvaes.eu
Java & XML
4. DOM Builder: Indien we reeds beschikken over een DOM-structuur, kunnen we deze omzetten naar een JDOM-document. De DOM Builder zorgt voor deze conversie. Eens we een JDOM-document in het geheugen hebben, kunnen we de verschillende elementen manipuleren. Zo kunnen we de inhoud en attributen van tags wijzigen, tags toevoegen of verwijderen enz... Na deze manipulaties kunnen we het JDOM-document terug omzetten naar een ander formaat: 1. XML Outputter: Hiermee kunnen we terug een XML-document in tekstvorm genereren en wegschrijven via een outputstream of writer. 2. SAX Outputter: Hiermee kunnen we SAX events genereren die dan op hun beurt afgehandeld kunnen worden door één of andere SAX Handler. 3. DOM Outputter: Hiermee kunnen we het JDOM-document omzetten naar een DOMstructuur. In volgende paragrafen zullen we de meest gebruikte mogelijkheden verder onder de loep nemen.
1.2.3. Een document rechtstreeks aanmaken Direct Build
JDOM Document
In sommige omstandigheden is het nodig een nieuw XML document aan te maken. In dat geval gaan we rechtstreeks in het geheugen een JDOM-document aanmaken. Zo'n JDOM-document wordt voorgesteld door een object van de klasse Document. In onderstaand klasse-diagram worden de verschillende klassen en hun onderlinge relaties weergegeven:
Copyright© 2015 Noël Vaes
-5-
www.noelvaes.eu
Java & XML
Attribute 0..* attribute 1
Document 1
1 root element
1 Element
1
1
child 0..*
doctype
0..1
DocType
Content
EntityRef
0..*
ProcessingInstruction
0..*
Comment
Text
CDATA
Een JDOM-document bestaat dus uit een object van de klasse Document. Dit is de top van de boomstructuur. Dit Document-object heeft één root-element van de klasse Element. Daarnaast zijn eventueel nog één of meerdere objecten van de klassen Comment en ProcessingInstruction mogelijk. Tevens kan er één object van de klasse DocType zijn. We richten ons nu op de klasse Element. Een element komt overeen met een tag in het XML-document. Zo'n tag kan naast attributen (Attribute) ook nog een inhoud hebben. Deze inhoud wordt heel algemeen voorgesteld door de klasse Content. Dit is een abstracte klasse met volgende concrete subklassen: 1. 2. 3. 4.
Element: Dit stelt een (sub)-tag voor. EntityRef: Dit stelt een Entity Reference voor. Bijvoorbeeld ë Comment: Dit is een commentaarblok. Text: Dit is gewone tekst als inhoud van een tag. Tekst die vervat is in een CDATAsectie wordt voorgesteld door een object van de subklasse CDATA.
De klasse Element heeft methoden om Content-elementen en Attribute-elementen toe te voegen. We illustreren dit alles met een concreet voorbeeld. Stel dat we volgend XML document willen opbouwen a.h.v. JDOM: <message language="en">
Hello World
Copyright© 2015 Noël Vaes
-6-
www.noelvaes.eu
Java & XML
Hiermee komt volgende DTD overeen: We kunnen dit XML-document als volgt met JDOM opbouwen: import java.io.*; import org.jdom.*; import org.jdom.output.*; public class CreateMessage { public static void main(String[] args) throws Exception{ Document doc = new Document(); DocType dtd = new DocType("message","Message.dtd"); doc.setDocType(dtd); Element message = new Element("message"); doc.setRootElement(message); Attribute att = new Attribute("language","en"); message.setAttribute(att); Element greeting = new Element("greeting"); Text gText= new Text("Hello"); greeting.addContent(gText); message.addContent(greeting); Comment comment = new Comment("This is comment"); message.addContent(comment); Element audience = new Element("audience"); Text aText = new Text("World"); audience.addContent(aText); message.addContent(audience); Element footer = new Element("footer"); EntityRef ent = new EntityRef("cr"); footer.addContent(ent); message.addContent(footer); }
}
printDoc(doc);
public static void printDoc(Document doc) throws IOException{ XMLOutputter out = new XMLOutputter(Format.getPrettyFormat()); out.output(doc,System.out); }
We maken vooreerst een object van de klasse Document en aan dit object wijzen we een DocType en een Element (root element) toe. We kunnen dit root element van een attribuut voorzien door een object van de klasse Attribuut te maken en toe te voegen met de methode setAttribute(). Ieder element Copyright© 2015 Noël Vaes
-7-
www.noelvaes.eu
Java & XML
kan tevens subelementen hebben. Hiervoor instantiëren we telkens een object van één of andere subklasse van Content en voegen vervolgens dit object toe met de methode addContent(). Voor het toevoegen van attributen kunnen we ook een variant van de methode setAttribute() van Element gebruiken waarbij we onmiddellijk de naam en de inhoud van het attribuut meegeven. Deze vorm is veel korter. message.setAttribute("language","en"); Zo kunnen we ook voor het instellen van de tekstuele inhoud van een element gebruik maken van de methode setText(). greeting.setText("Hello"); De verdere opbouw van de documentstructuur verloopt telkens op dezelfde wijze. Attributen worden geïnstantieerd en toegevoegd met setAttribute() en inhoudelijke elementen worden geïnstantieerd en toegevoegd met setContent(). Het feit dat we aan onze documentstructuur een DocType toevoegen wil evenwel niet zeggen dat de structuur van het document gecontroleerd wordt door JDOM. We voegen in het document enkel de verwijzing naar de DTD toe. Het is de verantwoordelijkheid van de programmeur een document te maken dat beantwoordt aan de DTD of het schema. Tenslotte krijgen we volgende objectstructuur:
Copyright© 2015 Noël Vaes
-8-
www.noelvaes.eu