Eindtoets XML: Theorie en toepassingen



Vergelijkbare documenten
Aquo Domeintabellen Services (Aquo DS) Handleiding Webservice

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

Tentamen Imperatief Programmeren

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

DOMjudge teamhandleiding

Modelleren en Programmeren

Overerving & Polymorfisme

IMP Uitwerking week 13

ASP.NET Test Jan Van Ryckeghem

Ingebouwde klassen & methodes

NAAM: Programmeren 1 Examen 29/08/2012

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Tentamen in2705 Software Engineering

TENTAMEN Programmeren 1

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Tentamen Inleiding Programmeren (IN1608WI), duur van de toets 2 uur Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Inleiding C++ Coding Conventions

Voortgezet Prog. voor KI

Programmeren (1) Examen NAAM:

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Game of Life in Java

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

DTD - Inleiding. Document Type Definitions (DTDs)

XSL = XSLT + XSL-FO + XPath

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Kleine cursus PHP5. Auteur: Raymond Moesker

Zelftest Programmeren in Java

Aanvullende toets Gameprogrammeren Woensdag 5 januari 2011, uur

Modelleren en Programmeren

Datastructuren Werkcollege Intro

Modelleren en Programmeren

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

Programmeren in Java les 3

Objectgericht programmeren 1.

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Tentamen Programmeren in C (EE1400)

NAAM: Programmeren 1 Examen 21/01/2011

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Implementatie AssurePay ASP.NET. ideal

Datastructuren: stapels, rijen en binaire bomen

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Programmeren 1 20 januari 2012 Prof. T. Schrijvers

Project network. Gebaseerd op paragrafen , uit het boek. We simuleren een sociaal netwerk

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Veel succes! 1. Gegeven is de volgende klasse:

Modelleren en Programmeren

Modelleren en Programmeren

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Zelftest XML Concepten

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Deeltentamen Grammatica s en ontleden 22 december 2005

Hier volgt als hulp wat technische informatie voor de websitebouwer over de werking van de xml web service.

Gegevenskoppeling BoekenRoute

Een fragment wordt afgeleid van de basis klasse "Fragment".

Tentamen Programmeren in C (EE1400)

Design patterns Startbijeenkomst

WCF claims-based authorization

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Dynamische Websites. Week 10

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts

Lessen Java: Reeks pag. 1


Tweede deeltentamen Gameprogrammeren Vrijdag 17 oktober 2014, uur

VI. Klassen en objecten

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

XML Introductie.

XPath voor beginners. HVA-IAM-V1-TDI Internetstandaarden /2009. Fons van Kesteren

INFITT01 - Internettechnologie WEEK 8

Opgaven. Python Assessment

Ministerie van Economische Zaken, Landbouw en Innovatie. Geoboer. Interface Specificatie

Modelleren en Programmeren

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Eindtoets. Opgaven. 1 Gegeven is het domeinmodel van figuur 1. Domeinmodel voor betalingen. Eindtoets I N T R O D U C T I E.

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Inhoud. Revisiehistorie Inleiding... 4

NAAM: Programmeren 1 Examen 31/08/2011

Ontwerp van Informatiesystemen

Lekker snel XML met SQL (.nl)

Programmeren Het gesloten boek examen 1.1

INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN

Inhoud. Eindtoets. Introductie 2. Opgaven 3. Bijlage bij opgaven 9. Terugkoppeling 12

Vakgroep CW KAHO Sint-Lieven

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

Abstracte klassen & Interfaces

Klassen. Hoofdstuk Klassen

Veel succes! 1. Deze opgave bestaat uit een aantal deelvragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

In BlueJ. Doe onderstaande met muis/menu s:

Java Programma structuur

XML Web Services of.net Remoting? W ANNEER GEBRUIK JE WELKE TECHNOLOGIE VOOR DE AANROEP VAN REMOTE SERVICES

Transcriptie:

Eindtoets XML: Theorie en toepassingen Deze eindtoets geeft een indruk, niet meer en niet minder, van mogelijke tentamenvragen. De spreiding over verschillende onderwerpen zal nooit bij elk tentamen hetzelfde zijn. Diverse onderwerpen komen in deze eindtoets niet aan bod, maar dat betekent niet dat er in de echte tentamens ook niets over zal worden gevraagd. Alle opgaven hebben betrekking op het volgende XMLdocument museum.xml: <?xml version="1.0" encoding="utf8"?> <museum> <zalen> <zaal zaalnr="z101">blauwe zaal</zaal> <zaal zaalnr="z102">groene zaal</zaal> <zaal zaalnr="z201">rode zaal</zaal> </zalen> <objecten> <object type="schilderij" zaalnr="z101"> <kunstenaar>rembrandt</kunstenaar > <titel>nachtwacht</titel> </object> <object type="beeld" zaalnr="z101"> <kunstenaar>michelangelo</kunstenaar> <titel>david</titel> </object> <object type="boek" zaalnr="z201"> <auteur>multatuli</auteur> <titel>max Havelaar</titel> <uitgever>schadd</uitgever> <jaar>1871</jaar> </object> <object type="boek" zaalnr="z201"> <auteur>betje Wolff</auteur> <auteur>aagje Deken</auteur> <titel>sara Burgerhart</titel> <jaar>1782</jaar> </object> </objecten> </museum> 1

Opgave 1 (DTD 10 punten) Gegeven is dat museum.xml valide is met betrekking tot de volgende onvolledige DTD museum.dtd. Er zijn twee genummerde stukjes uit de DTD verwijderd. <?xml version="1.0" encoding="utf8"?> <!ELEMENT museum (zalen, objecten)> <!ELEMENT zalen (zaal+)> <!ELEMENT zaal (#PCDATA)> <!ELEMENT objecten (object)+> <!ELEMENT object [..2..]> <!ELEMENT kunstenaar (#PCDATA)> <!ELEMENT titel (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT uitgever (#PCDATA)> <!ELEMENT jaar (#PCDATA)> <!ATTLIST zaal zaalnr ID #REQUIRED> <!ATTLIST object [..1..] zaalnr IDREF #REQUIRED> Vul de ontbrekende stukken aan volgens de gegeven omschrijving. [..1..] het verplichte attribuut type, waarbij uit de volgende lijst van mogelijkheden moet worden gekozen: schilderij, beeld, boek. [..2..] een content model voor het element object, ervan uitgaande dat een object ofwel één kunstenaar en één titel heeft, ofwel één of meer auteurs, één titel, geen of één uitgever en één jaar. De volgorde is hierbij van belang. 2

Opgave 2 (XMLSchema 12 punten) Hieronder ziet u een onvolledig schema voor museum.xml. Er zijn twee stukken uit het schema verwijderd en vervangen door genummerde tekst. Geef de ontbrekende stukken code (en niet meer dan dat). <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:element name="museum" type="museumtype"/> <xsd:complextype name="museumtype"> [..1.. Een element van type museumtype bevat één element zalen van type zalentype en één element objecten van type objectentype, in willekeurige volgorde ] </xsd:complextype> <xsd:complextype name="zalentype"> <xsd:sequence> <xsd:element name="zaal" type="zaaltype" minoccurs="1" maxoccurs="unbounded"/> </xsd:sequence> </xsd:complextype> <xsd:complextype name="objectentype"> <xsd:sequence> <xsd:element name="object" type="objecttype" minoccurs="1" maxoccurs="unbounded"/> </xsd:sequence> </xsd:complextype> <xsd:complextype name="zaaltype"> <xsd:simplecontent> <xsd:extension base="xsd:string"> <xsd:attribute name="nr" type="xsd:string"/> </xsd:extension> </xsd:simplecontent> </xsd:complextype> <xsd:complextype name="objecttype"> [..2.. Een element van type objecttype bevat óf een groep beeldendekunstgroup of een groep boekgroup. Verder bevat het een stringattribuut type en een stringattribuut zaalnr ] </xsd:complextype> <xsd:group name="beeldendekunstgroup"> <xsd:sequence> <xsd:element name="kunstenaar" type="xsd:string" minoccurs="1" maxoccurs="1"/> <xsd:element name="titel" type="xsd:string" minoccurs="1" maxoccurs="1"/> </xsd:sequence> </xsd:group> <xsd:group name="boekgroup"> <xsd:sequence> <xsd:element name="auteur" type="xsd:string" minoccurs="1" maxoccurs="unbounded"/> <xsd:element name="titel" type="xsd:string" minoccurs="1" maxoccurs="1"/> <xsd:element name="uitgever" type="xsd:string" minoccurs="0" maxoccurs="1"/> <xsd:element name="jaar" type="xsd:decimal" minoccurs="1" maxoccurs="1"/> </xsd:sequence> </xsd:group> </xsd:schema> 3

Opgave 3 (XPath 6 punten) a Geef precies aan welke nodeset van museum.xml wordt geselecteerd door de volgende XPathexpressie: //object[2]/followingsibling::*/auteur b Schrijf de expressie van onderdeel a in volledig geëxpandeerde vorm. c Schrijf een XPathexpressie die het aantal objecten uit zaal z101 selecteert. Opgave 4 (XSLT 6 punten) De volgende, onvolledige XSLTstylesheet moet, in de vorm van een HTMLtabel, een overzicht opleveren van alle schilderijen met hun kunstenaar, titel en zaal. Welk code moet in de plaats komen van het commentaar? <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/museum"> <html><body> <h3>overzicht schilderijencollectie</h3> <p /> <table border="1" cellpadding="5"> <tr> <th>kunstenaar</th> <th>titel</th> <th>zaal</th> </tr> <! vervang dit commentaar door de juiste code > </table> </body></html> </xsl:template> </xsl:stylesheet> 4

Opgave 5 (Namespaces/target namespace 8 punten) We voorzien het museumdocument van namespaces, als volgt: <?xml version="1.0" encoding="utf8"?> <museum xmlns="http://www.rijksmuseum.nl/gebouw" xmlns:mc="http://www.rijksmuseum.nl/collectie > <zalen> <zaal zaalnr="z101">blauwe zaal</zaal> <zaal zaalnr="z102">groene zaal</zaal> <zaal zaalnr="z201">rode zaal</zaal> </zalen> <mc:objecten> <object>... </object>...... </mc:objecten> </museum> Geef voor elk der namen museum, zalen, zaal, zaalnr en object aan welke mogelijkheid (A, B of C) van toepassing is: A de naam behoort tot de namespace http://www.rijksmuseum.nl/gebouw B de naam behoort tot de namespace http://www.rijksmuseum.nl/collectie C de naam behoort niet tot een namespace. Geef uw antwoord in de vorm van een lijstje met de namen en achter elke naam de juiste letter, zonder toelichting. 5

Opgave 6 (Stax 15 punten) We maken een Javaprogramma KunstZoeker dat de namen van alle zalen afdrukt waarin een object van kunstenaar Rembrandt zich bevindt. We willen in het programma gebruik maken van XMLStreamReader. Globaal ziet de code er aldus uit: Lees de informatie over zalen, maak Zaalobjecten en voeg ze toe aan ArrayList<Zaal> zalen. Lees de informatie over objecten, zoek daarin naar kunstenaar Rembrandt en leg het betreffende zaalnr vast. Zoek op basis van dit zaalnr het overeenkomende Zaalobject en druk daarvan de naam van de zaal af. Herhaal dit voor ieder object met kunstenaar Rembrandt. Voor het gemak van deze opgave beginnen we na het lezen van de zalen weer aan het begin van het document om de kunstobjecten te lezen. public class KunstZoeker { en public static final String FILENAAM = "museum.xml"; public static final String ZOEKKUNSTENAAR = "Rembrandt"; public static final String KUNSTENAAR = "kunstenaar"; public static final String OBJECT = "object"; public static final String ZAALNR = "zaalnr"; public static final String ZAAL = "zaal"; private ArrayList<Zaal> zalen = new ArrayList<Zaal>(); public static void main(string[] args) throws Exception { KunstZoeker k = new KunstZoeker(); XMLInputFactory inpf = XMLInputFactory.newInstance(); InputStream is = new FileInputStream(new File(FILENAAM)); XMLStreamReader xr = inpf.createxmlstreamreader(is); String zaalnr = ""; String zaalnaam = ""; // Lees Zalen uit XMLdocument, maak Zaalobjecten en voeg toe aan zalen [[..1..]] is = new FileInputStream(new File(FILENAAM)); xr = inpf.createxmlstreamreader(is); // begin weer opnieuw boolean kunstenaargevonden = false; // Lees Objecten en druk zaalnamen af van kunstenaar Rembrandt [[..2..]] public Zaal getzaal(string nr) { Zaal z = null; for (Zaal zz : zalen) { if (zz.getzaalnr().equals(nr)) { z = zz; return z; public void addzaal(string zaalnr, String zaalnaam) { Zaal z = new Zaal(zaalnr, zaalnaam); zalen.add(z); public class Zaal { private String zaalnr = ""; private String zaalnaam = ""; public Zaal(String zaalnr, String zaalnaam) { super(); this.zaalnr = zaalnr; 6

this.zaalnaam = zaalnaam; public String getzaalnr() { return zaalnr; public String getzaalnaam() { return zaalnaam; a Geef de code voor onderdeel 1 b Geef de code voor onderdeel 2 Opgave 7 (Jaxb 15 punten) We gaan hetzelfde probleem oplossen als van opgave 6 maar gebruiken nu JAXB. museum.xml heeft een bijbehorend schema museum.xsd. Op basis van dit schema laten we XJC klassen genereren. De relevante benodigde klassen hebben de volgende code (we hebben allerlei niet relevante zaken weggelaten) public class Museum { protected Zalen zalen; protected Objecten objecten; public Zalen getzalen() { return zalen; public Objecten getobjecten() { return objecten; public class Zalen { protected List<Zaal> zaal; public List<Zaal> getzaal() { if (zaal == null) { zaal = new ArrayList<Zaal>(); return this.zaal; public class Zaal { protected String content; protected String zaalnr; public String getcontent() { return content; public String getzaalnr() { return zaalnr; 7

public class Object { protected String kunstenaar; protected String type; protected String zaalnr; public String getkunstenaar() { return kunstenaar; public String gettype() { return type; public String getzaalnr() { return zaalnr; We maken een klasse JaxbKunstZoeker met de volgende code: public class JaxbKunstZoeker { public static final String FILENAAM = "museum.xml"; public static final String ZOEKKUNSTENAAR = "Rembrandt"; public static final String TYPE = "schilderij"; public static void main(string[] args) throws Exception{ JAXBContext context = JAXBContext.newInstance("generated"); Unmarshaller um = context.createunmarshaller(); File file = new File(FILENAAM); // Lees bestand en maak List<Zaal> zalenlijst [[..1..]] // Maak List<Object> en doorloop deze. Als type = schilderij en // kunstenaar = Rembrandt, zoek zaalnaam op en druk af [[..2..]] public static String getzaalnaam(list<zaal> lijst,string zaalnr){ String zaalnaam = ""; for (Zaal z:lijst){ if(z.getzaalnr().equals(zaalnr)){ zaalnaam = z.getcontent(); return zaalnaam; a Geef de code voor onderdeel 1 b Geef de code voor onderdeel 2 c Zowel de code van opgave 6 als de code van deze opgave is vrij omvangrijk. Als laatste maken we een programma op basis van een XQueryexpressie die opgeslagen is in een document q1.xquery. Het resultaat van de XQueryexpressie met museum.xml als uitgangsdocument luidt: <?xml version="1.0" encoding="utf8"?> <zalen> <zaal>blauwe zaal</zaal> </zalen> We maken met XOM een programma XOMKunstZoeker dat gebruik maakt van q1.xquery. We willen als uitvoer : Rembrandt gevonden in Blauwe zaal. Gegeven de volgende code public class XOMKunstZoeker { public static final String QUERYNAAM = "q1.xquery"; public static final String TEKST = "Rembrandt gevonden in "; public static void main(string[] args) throws Exception { 8

[[..1..]] public static String getxquery(string filenaam) throws Exception { BufferedReader br = new BufferedReader(new FileReader(new File(QUERYNAAM))); StringBuffer sb = new StringBuffer(); String s = null; while ((s = br.readline())!= null) { sb.append(s); return new String(sb); Geef de benodigde code voor [[..1..]] Opgave 8 (XQuery 12 punten) We willen op basis van museum.xml een nieuw XMLdocument maken. In het nieuwe document zijn de objecten gegroepeerd naar type, waarbij de verschillende typen alfabetische zijn gesorteerd. Uitgaande van museum.xml zijn de mogelijke typen: beeld, boek en schilderij. De resulterende XMLfile op basis van museum.xml ziet er als volgt uit: <?xml version="1.0" encoding="utf8"?> <objectenpertype> <beeld> <titel>david</titel> </beeld> <boek> <titel>max Havelaar</titel> <titel>sara Burgerhart</titel> </boek> <schilderij> <titel>nachtwacht</titel> </schilderij> </objectenpertype> Opdracht Vervang het grijs gemarkeerde deel in onderstaande query door een expressie, zodat de gevraagde output wordt gegenereerd. element objectenpertype { [ ontbrekende code ] 9

Opgave 9 (WSDL 8) Gegeven is het onderstaande WSDLdocument: <wsdl:definitions xmlns:wsdl=http://schemas.xmlsoap.org/wsdl/ xmlns:ns1=http://org.apache.axis2/xsd xmlns:wsaw=http://www.w3.org/2006/05/addressing/wsdl xmlns:http=http://schemas.xmlsoap.org/wsdl/http/ xmlns:ns0=http://ws.apache.org/axis2 xmlns:xs=http://www.w3.org/2001/xmlschema xmlns:mime=http://schemas.xmlsoap.org/wsdl/mime/ xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:soap12=http://schemas.xmlsoap.org/wsdl/soap12/ targetnamespace="http://ws.apache.org/axis2"> <wsdl:types> <xs:schema xmlns:ns=http://ws.apache.org/axis2 attributeformdefault="qualified" elementformdefault="qualified" targetnamespace="http://ws.apache.org/axis2"> <xs:element name="getboekenresponse"> <xs:complextype> <xs:sequence> <xs:element maxoccurs="unbounded" minoccurs="0" name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> </wsdl:types> <wsdl:message name="getboekenrequest"/> <wsdl:message name="getboekenresponse"> <wsdl:part name="parameters" element="ns0:getboekenresponse"/> </wsdl:message> <wsdl:porttype name="museumserviceporttype"> <wsdl:operation name="getboeken"> <wsdl:input message="ns0:getboekenrequest" wsaw:action="urn:getboeken"/> <wsdl:output message="ns0:getboekenresponse" wsaw:action="urn:getboekenresponse"/> </wsdl:operation> </wsdl:porttype> <wsdl:service name="museumservice"> <wsdl:port name="museumservicesoap11port_http" binding="ns0:museumservicesoap11binding"> <soap:address location="http://localhost:8080/axis2/services/museumservice"/> </wsdl:port> <wsdl:port name="museumservicesoap12port_http" binding="ns0:museumservicesoap12binding"> <soap12:address location="http://localhost:8080/axis2/services/museumservice"/> </wsdl:port> <wsdl:port name="museumservicehttpport" binding="ns0:museumservicehttpbinding"> <http:address location="http://localhost:8080/axis2/services/museumservice"/> </wsdl:port> </wsdl:service> </wsdl:definitions> Vragen a Geef een gedetailleerde functionele beschrijving van de service(s) die volgens dit WSDL document wordt (worden) beschreven, dat wil zeggen: Welke methode(n) wordt(worden) geboden? Welke input en output parameters horen daarbij en wat is het type van deze parameters? b Motiveer waarom het element <wsdl:message name="getboekenrequest"/> een leegelemnent is. c In hoeverre is dit WSDL document compleet? Als het incompleet is, welke onderdelen worden gemist? 10

Opgave 10 (SOAP 8 punten) Geef aan welke fouten voorkomen in het volgende SOAP request respectievelijk responsebericht bij de aanroep van getboeken. Let daarbij op het WSDL document uit de vorige opgave. Motveer uw antwoorden. a SOAP requestbericht: POST /axis2/services/museumservice HTTP/1.1 ContentType: application/soap+xml; charset=utf8; action="urn:getboeken" UserAgent: Axis2 Host: 127.0.0.1:8082 TransferEncoding: chunked <?xml version='1.0' encoding='utf8'?> <soapenv:envelope xmlns:soapenv="http://www.w3.org/2003/05/soapenvelope"> <soapenv:body> <ns1:getboeken xmlns:ns1="http://ws.apache.org/axis2"> <ns1:nummer>101</ns1:nummer> </ns1:getboeken> </soapenv:body> </soapenv:envelope> b SOAP responsebericht: HTTP/1.1 200 OK Server: ApacheCoyote/1.1 ContentType: application/soap+xml; action="urn:getboekenresponse";charset=utf8 TransferEncoding: chunked Date: Thu, 18 Mar 2010 13:07:56 GMT <?xml version='1.0' encoding='utf8'?> <soapenv:envelope xmlns:soapenv= http://www.w3.org/2003/05/soapenvelope xmlns:xsd= http://www.w3.org/2001/xmlschema xmlns:xsi= http://www.w3.org/2001/xmlschemainstance"> <soapenv:body> <ns:getboekenresponse xmlns:ns="http://ws.apache.org/axis2"> <ns:return xsi:type="xsd:token>max Havelaar</ns:return> <ns:return xsi:type="xsd:token >Sara Burgerhart</ns:return> </ns:getboekenresponse> </soapenv:body> </soapenv:envelope> 11

Uitwerking van de opgaven Opgave 1 (10 punten) <?xml version="1.0" encoding="utf8"?> <!elementen en attributen> <!ELEMENT museum (zalen, objecten)> <!ELEMENT zalen (zaal+)> <!ELEMENT zaal (#PCDATA)> <!ELEMENT kunstenaar (#PCDATA)> <!ELEMENT titel (#PCDATA)> <!ELEMENT objecten (object)+> <!ELEMENT object ((kunstenaar, titel) (auteur+, titel, uitgever?, jaar))> <!ELEMENT auteur (#PCDATA)> <!ELEMENT uitgever (#PCDATA)> <!ELEMENT jaar (#PCDATA)> <!ATTLIST object type (schilderij beeld boek) #REQUIRED zaalnr IDREF #REQUIRED)> <!ATTLIST zaal zaalnr ID #REQUIRED> Opgave 2 (12 punten) Fragment 1: <xsd:all> <xsd:element name="zalen" type="zalentype" minoccurs="1" maxoccurs="1"/> <xsd:element name="objecten" type="objectentype" minoccurs="1" maxoccurs="1"/> </xsd:all> Omdat binnen een xsd:allelement minoccurs en maxoccurs defaultwaarden 1 hebben, mogen de minocurs en maxoccursaanduidingen ook worden weggelaten. Fragment 2: <xsd:choice minoccurs="1" maxoccurs="1"> <xsd:group ref="beeldendekunstgroup"/> <xsd:group ref="boekgroup"/> </xsd:choice> <xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="zaalnr" type="xsd:string"/> Opgave 3 (6 punten) a Geselecteerde node set: de auteurnodes horende bij Multatuli, Betje Wolff, Aagje Deken b In geëxpandeerde vorm: /descendantorself::node()/child::object[2.0]/followingsibling::*/child::auteur c Maximaal verkorte vorm: count(//object[@zaalnr="z101"]) Bij c zijn meer of minder geëxpandeerde vormen natuurlijk ook goed. De maximaal geëxpandeerde vorm is: count(/descendantorself::node()/child::object[(attribute::zaalnr="z101")]) Verder mag //object worden vervangen door onder meer: /museum/objecten/object (of een geëxpandeerde vorm daarvan). 12

Opgave 4 (6 punten) We tonen twee mogelijke oplossingen: één zonder en één met gebruik van templates. <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/museum"> <html><body> <h3>overzicht schilderijencollectie</h3> <p /> <table border="1" cellpadding="5"> <tr> <th>kunstenaar</th> <th>titel</th> <th>zaal</th> </tr> <xsl:foreach select="objecten/object" > <xsl:if test="@type='schilderij'" > <tr> <td> <xsl:valueof select="kunstenaar" /> </td> <td> <xsl:valueof select="titel" /> </td> <td> <xsl:valueof select="@zaal" /> </td> </tr> </xsl:if> </xsl:foreach> </table> </body></html> </xsl:template> </xsl:stylesheet> Voor de XPathexpressies zijn verschillende varianten mogelijk, bijvoorbeeld: @ mag worden vervangen door attribute:: objecten/object mag worden vervangen door //object. Verder kan de test ook worden opgenomen in de XPathexpressie. De gevraagde code wordt dan: <xsl:foreach select="objecten/object[@type='schilderij']" > <tr> <td> <xsl:valueof select="kunstenaar" /> </td> <td> <xsl:valueof select="titel" /> </td> <td> <xsl:valueof select="@zaal" /> </td> </tr> </xsl:foreach> 13

Een alternatief met gebruik van templates is als volgt: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/museum"> <html><body> <h3>overzicht schilderijencollectie</h3> <p /> <table border="1" cellpadding="5"> <tr> <th>kunstenaar</th> <th>titel</th> <th>zaal</th> </tr> <xsl:applytemplates select="objecten/object[@type='schilderij']"/> </table> </body></html> </xsl:template> <xsl:template match="object[@type='schilderij']"> <tr> <td> <xsl:valueof select="kunstenaar" /> </td> <td> <xsl:valueof select="titel" /> </td> <td> <xsl:valueof select="@zaal" /> </td> </tr> </xsl:template> </xsl:stylesheet> Opgave 5 (8 punten) Wanneer attribuutnamen niet expliciet zijn gekwalificeerd (colonized), horen ze niet tot een namespace (unqualified). Daarom hoort zaalnr niet tot een namespace (C). Alle overige namen horen tot de default namespace (A). Opmerkingen 1 Ook object hoort tot de default namespace; elementen erven immers niet de namespace van hun ouderelement. 2 De namespacealias mc wordt gedefinieerd via een attribuut van het element museum. Dat houdt echter geen koppeling in aan de bij mc horende namespace. De naam museum valt daarom onder de default namespace. Opgave 6 (15 punten) a // Lees Zalen while (xr.hasnext()) { if ((xr.next() == XMLStreamConstants.START_ELEMENT) && xr.getlocalname().equals(zaal)) { zaalnr = xr.getattributevalue(null, ZAALNR); zaalnaam = xr.getelementtext(); k.addzaal(zaalnr, zaalnaam); 14

b boolean kunstenaargevonden = false; // Lees Objecten en druk zalen af while (xr.hasnext()) { if ((xr.next() == XMLStreamConstants.START_ELEMENT) && xr.getlocalname().equals(object)) { zaalnr = xr.getattributevalue(null, ZAALNR); while (xr.hasnext() &&!kunstenaargevonden) { kunstenaargevonden = ((xr.next() == XMLStreamConstants.START_ELEMENT) && xr.getlocalname().equals(kunstenaar) && xr.getelementtext().equals(zoekkunstenaar)); if (kunstenaargevonden) { zaalnaam = k.getzaal(zaalnr).getzaalnaam(); System.out.println("gevonden en hangt in " + zaalnaam); kunstenaargevonden = false; Opgave 7 (15 punten) a Museum museum = (Museum) um.unmarshal(file); Zalen zalen = museum.getzalen(); List<Zaal> zalenlijst = zalen.getzaal(); b Objecten objecten = museum.getobjecten(); List<Object> objectenlijst = objecten.getobject(); for (Object ob:objectenlijst){ if(ob.gettype().equals(type) && ob.getkunstenaar().equals(zoekkunstenaar)){ String zaalnr = ob.getzaalnr(); System.out.println(getZaalNaam(zalenlijst,zaalnr)); c public static void main(string[] args) throws Exception { Nodes nodes = XQueryUtil.xquery(null, getxquery(querynaam)); for (int i = 0; i < nodes.size(); i++) { Node n = nodes.get(i); System.out.println(TEKST + n.getvalue()); Opgave 8 (12 punten) element objectenpertype { for $t in distinctvalues(doc("museum.xml")//object/@type) order by $t ascending return element {$t { for $o in doc("museum.xml")//object where $o/@type = $t return $o/titel Opgave 9 (8 punten) a Er wordt één service geboden, namelijk: String[] getboeken(); Dus een methode getboeken, die geen input parameters heeft en een output parameter (een array van strings of iets dergelijks). b Methode getboeken heeft geen inputparameters. Daarom is het message element leeg. c Dit WSDL document is incompleet. Gemist worden de bindingelementen voor SOAP en HTTP. 15

Opgave 10 (8 punten) a In het request bericht wordt een inputparameter meegegeven van het type int. Deze is er volgens het WSDL document niet. b In het responsebericht is het terugkeertype een array van tokens, terwijl dat volgens het WSDL document een array van strings moet zijn. 16