XML Extensible Markup Language Program XML hvordan ser

XML Extensible Markup Language

Program • XML – hvordan ser et XML dokument ut? • Programmatisk behandling av XML • SAX – Simple API for XML • DOM – Document Object Model • JDOM – Java DOM • Transformasjonsbasert XML behandling • XSLT

Hvorfor • Integrasjon • Interne systemer i bedrifter • Hele næringskjeder/nettverk • Konsolidering av informasjonkilder • Innhold vs presentasjon – dekobling • Datalagring

Hva • Tekst-basert • Bestanddeler • Elementer – start-tag og slutt-tag • Attributter – tilhører elementer • Tekst – inneholdt i et element • Kommentarer, direktiver, CDATA • XML-standarden (W 3 C) • Definere velformede dokumenter

XML Definition (prolog) Opening tag Closing tag Eksempel Processor Instruction <? xml version=” 1. 0”? > <? xml-stylesheet href=”stylesheet. xsl"? > Root element <documentroot> <first-subelement> Nested element Text-contents (no contain special characters) </first-subelement> <second-subelement attributename=”attributevalue”> <subsubelement>Some more text</subsubelement> </second-subelement> Textual content Attribute <empty-element attr=”value”/> Empty element can be collapsed Namespace definition <namespace-element xmlns: xlink=”http: //www. w 3. org/1999/xlink”> <refering-element xlink: href=”http: //www. systek. no/”/> </namespace-element> </documentroot> Namespace usage

Begrensninger i forhold til HTML <ol> <li>List item text <li>Second list item text </ol> First <li> not closed Some normal text <b>some bold text <i>some bold-italic</b> some italic</a> <body> <img src=”mypicture. gif”> </body> Empty element must be explicitly closed <a href=http: //www. systek. no>Systek</a> All attribute values must be ”quoted” Incorrectly nested elements

Document Type Definitions • Definerer lovlige dokumenter for en dokumenttype (”XML-språk”) • Kan definere – for element-noder: • Tillatte underelementer, inkludert rekkefølge • Tekst tillatt? (ellers blir whitespace ignorert) • Tillatte og påkrevde attributter • For attributter • Tillatte verdier • Id-semantikk (unike per dokument)

DTD Eksempel (oppskrifthefte) <? xml encoding="UTF-8"? > <!ELEMENT recipes (recipe)+> <!ELEMENT <!ATTLIST recipe (indexing*, ingredients, directions, link *)> id ID #IMPLIED> title ID #REQUIRED> transcripted CDATA #IMPLIED> <!ELEMENT indexing EMPTY> <!ATTLIST indexing value CDATA #REQUIRED> <!ELEMENT ingredients (ingredient+)> <!ATTLIST ingredients servings CDATA #IMPLIED> <!ELEMENT ingredient (#PCDATA)> <!ATTLIST ingredient amount CDATA #IMPLIED> …

Alfabetsuppe: XML standarder • DTD – Document Type Definition • XSLT – Extensible Style Language Tranformations • XLink/XPointer/XPath • DOM – Document Object Model • SAX – Simple API for XML • SOAP – Simple Object Access Protocol • Java-spesifikk: JAXP, JAXM, JAXB, Tr. AX, JDOM

Eksempler på XML-språk • • XSLT er selv et XML språk XHTML 1. 0 Voice. XML SOAP SVG SMIL Math. ML WML

Organisasjoner • XML Fokus. IBM, Microsoft, Sun, og Oracle • Java XML parsere: Oracle, OASIS og ASF ++ • Xml. Apache. Org: Bygger på kildekode donert fra Sun (Project X/Crimson) og IBM (XML 4 J) • Xerces: XML Parser (DOM & SAX) • Xalan: XSL Processor (XSLT & XPath) • Cocoon: Servlet-based XSL processor (uses Xalan) • SOAP • Batik (SVG processor)

Hvordan • Event-basert (f. eks. for å bygge en struktur) • SAX • Tre-basert (f. eks. for å manipulere et dokument) • DOM og JDOM • Transformasjon-basert (f. eks. for å vise i HTML eller PDF) • XSLT

Demo: Konstruere et JTree fra et XML dokument

SAX - Fremgangsmåte 1. Definér en dokument hånterer (Document. Handler) 2. Assosiert håntereren med en parser 3. Angi dokument 4. Parseren vil kalle Document. Handler’s metoder

Rull opp ermene! public interface Document. Handler { void start. Element(String name, Attribute. List atts) void end. Element(String name) void characters(char ch[], int start, int length) void start. Document() void end. Document() void ignorable. Whitespace(char ch[], int start, int length) void processing. Instruction(String target, String data) void set. Document. Locator (Locator locator); }

Eksempel: Konstruerer en JTree public void start. Element (String ns. URI, String local. Name, String q. Name, Attributes attrs) { String. Buffer node. Text = new String. Buffer("<" + local. Name); for ( int i=0; i<attrs. get. Length(); i++ ) node. Text. append(" " + attrs. get. Local. Name(i) + "='" + attrs. get. Value(i) + "'"); node. Text. append(">"); Default. Mutable. Tree. Node new. Node = new Default. Mutable. Tree. Node (node. Text. to. String()); this. current. Node. add(new. Node); this. current. Node = new. Node; this. current. Text = new String. Buffer(); } public void characters (char ch[], int start, int length) { this. current. Text. append(ch, start, length); } public void end. Element(String ns. URI, String local. Name, String q. Name) { String contents = this. current. Text. to. String(). trim(); if ( contents. length() != 0 ) this. current. Node. add(new Default. Mutable. Tree. Node (contents)); this. current. Node = (Default. Mutable. Tree. Node )current. Node. get. Parent(); }

Start parsingen Sax. Tree. Viewer(String doc. Name) { Tree. Inserting. Doc. Handler my. Doc. Handler = new Tree. Inserting. Doc. Handler(); String parser. Class = "org. apache. xerces. parsers. SAXParser"; try { XMLReader parser = XMLReader. Factory. create. XMLReader(parser. Class); parser. set. Content. Handler(my. Doc. Handler); parser. parse(doc. Name); } catch (SAXException se) { se. print. Stack. Trace(); } catch (IOException ioe) { ioe. print. Stack. Trace(); } get. Content. Pane(). add(new JTree(my. Doc. Handler. current. Node. get. First. Child())); }

SAX – forklaring • Høy performance • Har ingen intern tre-struktur • Vi lager istedet vår egen (javax. swing. tree. Default. Tree. Model) • Går gjennom dokumentet én gang • Lineært: Fra begynnelse til slutt

DOM • • W 3 C standard DOM Level 2 på over 400 sider Definerer et dokument som et tre Sentrale klasser: • Node + subklasser (Attr, Character, Element. . . ) • Named. Node. List (for Attributes) • Node. List (for subtrær)

Fra Xerces’ DOM javadoc interface org. w 3 c. dom. Named. Node. Map interface org. w 3 c. dom. Node interface org. w 3 c. dom. Attr interface org. w 3 c. dom. Character. Data interface org. w 3 c. dom. Comment interface org. w 3 c. dom. Text interface org. w 3 c. dom. CDATASection interface org. w 3 c. dom. Document. Fragment interface org. w 3 c. dom. Document. Type interface org. w 3 c. dom. Element interface org. w 3 c. dom. Entity. Reference interface org. w 3 c. dom. Notation interface org. w 3 c. dom. Processing. Instruction interface org. w 3 c. dom. Node. List

Org. w 3 c. dom. Node Aksessorer: • Node. Name • Node. Value (rw) • Parent. Node • Child. Nodes • First, Last Child • Previous, Next Sibling • Attributes • Owner. Document Operasjoner • insert. Before • replace. Child • remove. Child • append. Child • clone. Node

DOMTree. Model v. 1 • Bruker Adaptor patternet • Gir innblikk i både DOM og JTree • Se vedlagt kode JTree. Model DOMTree. Model org. w 3 c. dom. Document

DOMTree. Model v. 2 • Har XPath støtte • Apache Xalan • Skriv inn en XPath • Trykk return • Matchende noder velges

DOMTree. Model v. 3 • Demonstrerer endringer i et DOM tre • Koden er ikke spesielt pen, men ligger vedlagt alikevel • Operasjoner: • Legge til Element-node • Legge til Tekst-node • Endre eller sette attributt • Remove node • Lagre

JDOM • JDOM er utviklet av Brett Mc. Laughlin, forfatter av ”Java and XML” • Gir en mer Java-vennlig DOM enn DOM • Bruker overloading • Bruker eksisterende Java-klasser, som List • Mangler mye av det mer avanserte relatert til DOM, f. eks. XPath • Kildekode for JDom. Tree. Viewer ligger vedlagt

XPath • En del av familien med referanser i XML • Brukes til å velge ut deler av et dokument-tre f. eks. under Transformasjoner (XSLT) • Minner om filstruktur • . er ”denne node” • . . er • / skiller noder på forskjellig nivåer • / angir dokument-rot • // finner noder på ALLE undernivåer • * er alle element-noder • text() finner tekst-noder

XPath eksempler • • • person. /person (samme som forrige). /person/*/text(). /person//*/text() //text()
![XPath • Begrensninger/filter angis i [] • //person[. /name/family/text() = "Worker"] • //person[name/family/text()='Worker']/email/text() • XPath • Begrensninger/filter angis i [] • //person[. /name/family/text() = "Worker"] • //person[name/family/text()='Worker']/email/text() •](http://slidetodoc.com/presentation_image/197f7642fb5976015735bea628a770de/image-28.jpg)
XPath • Begrensninger/filter angis i [] • //person[. /name/family/text() = "Worker"] • //person[name/family/text()='Worker']/email/text() • Default – nodenummer • //person[1]/name/* • Attributter angis med @ • //person[@id='two. worker']/name/*/text() • Dersom DTD angir id attributter, kan disse brukes: • id(//person/link/@manager)/name/*

XPath – the full story • Formene vi har sett er forenklinger • Full XPath bruker akser – syntaks: aksenavn: : nodetest • <navn> == child: : <name> • . == self: : node() • . . == parent: : node() • @<navn> == attribute: : <navn> • //<navn> == descendant: : <navn>

XPath akser eksempler • . /person == self: : */child: : person • //link[@manager = "Big. Boss"]/. . == descendant: : link[attribute: : manager = "Big. Boss"]/parent: :

XSLT • Transformerer fra et XML språk til et annet • Bruker templates for å behandle segmenter • Bruker XPath for å velge ut segmenter • Vi skal lage tre XSL stylesheets som alle skal oversette et XML språk (recipe. ML) til XHTML 1. 0

Eksempel <xsl: stylesheet xmlns: xsl="http: //www. w 3. org/1999/XSL/Transform" version="1. 0"> <xsl: param name="navn"/> <xsl: param name="navn" select="expression"/> <xsl: template match="XPath pattern" [name="name" priority="number" mode="mode"]> <xsl: param name="navn"/> Tekst, <tag>XML tekst</tag>, <xsl: value-of select="XPath expression"/> <xsl: value-of select="$parameter"/> <xsl: apply-templates select="Xpath" mode = qname> <xsl: sort select="string-expression" order=. . . > <xsl: with-param name="navn" select="expression"/> </xsl: apply-templates> </xsl: template> </xsl: stylesheet>

Workshop – Delicatessen from the Kitchen of Mrs. Brodwall • • For oppgaven er det definert et oppskriftshefte 10 Gode Oppskrifter Oppskriftene bruker et DTD Vi skal lage tre stylesheets 1. List alle kategorier 2. List alle oppskrifter i en kategori 3. Vi én oppskift

Organisasjon • Hver gruppe har ett område på STEP serveren • Se http: //jonatan: port/group. X/ for instruksjoner og tips • . . . /group. X/recipes/stylesheet? param=value. . . • Eksempel. . . /recipes/list? type=Chinese • Bruker list. xsl med parameter type satt til Chinese • Stylesheet’ene ligger rett under group. X-sharet på jonatan • types. xsl, list. xsl, og show. xsl er definert • Dere kan godt definere egne stylesheets
- Slides: 34