SAX Simple API for XML.

Størrelse: px
Starte visningen fra side:

Download "SAX Simple API for XML."

Transkript

1 SAX Simple API for XML. En API (Application Programming Interface) et bibliotek eller et sæt af funktioner eller metoder. SAX er et sådant bibliotek af abstrakte metoder som f. eks. startdocument() eller startelement(). SAX API er ikke noget program men en standard som så er blevet implementeret af mange forskellige SAX parsere f. eks. Microsofts MSXML eller Xerces. SAX blev oprindeligt i skrevet for sproget Java men er siden implementeret i næsten alle de anerkendte programmerings sprog. SAX er en push model: d.v.s. at når SAX parseren læser XML dokumentet læser den hele filen tegn for tegn og sender det hele videre. Man kan altså ikke i SAX vælge kun at læse dele af XML dokumentet. Det hele bliver pushet videre til den applikation som bruger SAX parseren. Dette er i modsætning til en såkaldt reader som normalt kan vælge at læse f. eks. kun de første 10 tegn i en fil! SAX er en event baseret model på den måde at hver gang SAX parseren støder på et bestemt objekt affyrer den en event som så sendes videre til det program som bruger SAX parseren som et redskab. En event kan f. eks. være startelement som SAX affyrer når den f.eks. støder på disse tegn i filen (NB det som SAX parseren læser er jo simpelt hen karakter koder som #97 ( a ) eller #0A (linjeskift): <parcel_hus>... DOM modellen en pull model er det modsatte af SAX modellen. I DOM læses hele filen, der opbygges et binært DOM træ i RAM (i hukommelsen). I SAX læses eller parses dokumentet simpelthen tegn for tegn: 1. SAX kan ikke springe rundt i dokumentet, kan ikke gå tilbage 2. SAX kan ikke huske hvad der tidligere er læst 3. SAX opbygger intet træ eller nogen RAM struktur Af disse grunde er det oftest meget hurtigere og mere effektivt at læse et XML dokument med SAX end med DOM. Især hvis XML dokumentet er stort som på 25 MegaBytes! fungerer SAX meget hurtigere end DOM. Hvis man skal finde nogle få data i et meget stort XML dokument er SAX meget hurtigere end DOM. I SAX kan man begynde at bruge data som ER afsendt fra SAX parseren også selv om den endnu ikke har læst hele dokumentet! SAX modsat DOM er ikke en W3C standard men et privat initiativ skabt af amerikaneren Megginson - som siden er blevet bredt anerkendt. Men SAX har som nævnt sine begrænsninger. SAX affyrer sine evnts i real time mens DOM arbejder med en opbygget træ struktur som kan anvendes igen og igen når den først er opbygget.

2 Hvis der skal foretages lidt mere indviklede søgninger i dokumentet er DOM modellen klart overlegen. Dette gælder også hvis der skal foretages mere omfattende redigeringer i dokumentet! Funktioner: Alle SAX parsere skal implementere (definere) disse funktioner eller metoder: 1. characters() som resturnerer nodens tekst 2. startdocument() og enddocument() 3. startelement() og endelement() 4. ignorablewhitespace() som definerer hvad der skal ske med mellemrum, tabulator og linjeskift 5. processinginstruction() 6. startprefixmapping() og endprefixmapping() som drejer sig om namespaces f. eks. i et element 7. skippedentity() En konkret SAX parser kan så definere flere supplerende metoder. Selve SAX definitionen (standarden) kan downloades fra Der findes både en SAX1 og en SAX2, men kun den sidste version fra år 2000 med namespaces bruges nu. Vi kan i nogen grad anvende SAX parsing i scripts. Her er et eksempel på et script som anvender SAX og læser et meget stort dokument og viser det på siden: <body> <div id="resultat" name="resultat" style="background-color:#dedede"></div> <script> function f(){ var reader = new ActiveXObject("MSXML2.SAXXMLReader.4.0"); var writer = new ActiveXObject("MSXML2.MXXMLWriter.4.0"); reader.contenthandler=writer; try { //fra harddisken: //reader.parseurl ("c:/xmlkursus/sax/meget_lang1.xml"); //SAX kan hente en URL: reader.parseurl (" //alert("sax OK"); //alert(writer.output); document.all("resultat").innertext=writer.output; catch(e) { alert("parsing med SAX Ikke OK: " + e.description); f(); </script>

3 </body> Vi anvender instantierer her en SAX reader og en SAX writer (nemlig de to klasser fra Microsofts MSXML2, altså Microsofts SAX parser). En SAX reader skal have en såkaldt content handler som er en event handler. En event handler er en klasse som implementerer det abstrakte interface ContentHandler og definerer de ovennævnte obligatoriske metoder! Hvis der skal ske noget når vi parser et XML dokument med SAX er det altså nødvendigt at SAX parseren (reader) har en event handler, en content handler! Ellers sker der ingen ting ingen events bliver (reelt) affyret i al fald er der ingen som lytter til disse events! - under læsningen. Ovennævnte eksempel bruger det trick at writer en sættes til at være content handler til reader en! D.v.s. at de events som reader en affyrer modtages og bearbejdes af writer en dvs. reelt udskrives! Dette kan lade sig gøre fordi en SAX writer implementerer det abstrakte interface ContentHandler. Bagefter kan vi så bruge writer ens output - som er produceret af writer en ud fra de inputs den får fra reader en! Denne metode er den hurtigste måde man kan læse et evt. meget stort XML dokument på! Meget hurtigere end at anvende DOM metoder. På denne måde kontrolleres også om dokumentet er vel formet! SAX parseren er en ægte parser lige som en DOM parser: Den kontrollerer om XML dokumentet er velformet ellers stopper læsningen! Hvis dokumentet ikke er vel formet kommer en fejl meddelelse: Dette kan lade sig gøre ved at anvende en try... catch konstruktion i scriptet. Parseren stopper så første gang den støder på et element som ikke er velformet! Den kaster en Exception! Skrive XML dokumenter med SAX writer: Vi kan producere f. eks. store - test XML filer på denne måde: <script language="javascript"> function f(){ var writer = new ActiveXObject("MSXML2.MXXMLWriter.4.0");

4 var attr= new ActiveXObject("MSXML2.SAXAttributes.4.0"); var fso = new ActiveXObject("Scripting.FileSystemObject"); var fil=fso.createtextfile("c:/xmlkursus/sax/sax_produceret.xml"); writer.indent=true; writer.standalone=true; //writer.startdocument(); - giver problemer med encoding! writer.startelement ("","","data_root",attr); for(i=0;i<100;i++) { var rnd1=parseint(math.random()*100); writer.startelement ("","","person",attr); writer.startelement ("","","fulde_navn",attr); writer.characters("jens Ole Jensen ID: "+i+" Kode: "+rnd1); writer.endelement ("","","fulde_navn"); writer.endelement ("","","person"); writer.endelement ("","","data_root"); //writer.enddocument(); fil.write(writer.output); fil.close(); f(); </script> Vi skal senere se på andre eksempler på hvordan man kan generere XML dokumenter med SAX. Her ses det at SAX metoden characters() blot tager en streng som parameter, mens startelement() tager disse parametre: 1. namespace URI 2. local name 3. qualified name 4. et attribut objekt Denne tilfældigt genererede XML fil gemmes her på harddisken. Den kan vises således i en browser:

5 SAX metoder i Visual Basic: For at kunne udnytte mulighederne i SAX i højere grad er det nødvendigt at skrive kode i et programmeringssprog som Java, C, C++ eller Visual Basic. Vi vil i det følgende illustrere dette ved at skrive nogle enkle eksempler i Visual Basic (VBA) som evt. kan køre i VBA i Microsoft Office. Man kan starte MS Excel eller Access eller et andet Office program og vælge Funktioner -> Makro -> Visual Basic editor. Her kan man så oprette nye klasser og moduler (så kaldte subs) som kan udnytte SAX. Det er vigtigt at sætte en reference til MSXML ved at vælge Tools (Funktioner) -> References og vælge Microsoft XML version 4. Vi kan skrive et nyt meget enkelt modul (en ny sub rutine) således: Option Explicit Public Sub parse_sax() Dim reader Set reader = New SAXXMLReader40 Set reader.errorhandler = New error_handler reader.parseurl "bog.xml" On Error Resume Next MsgBox "XML Dokumentet er parset OK af SAX!"

6 De centrale linjer i denne kode er: Set reader.errorhandler = New error_handler reader.parseurl "bog.xml" error handler: I Visual Basic skal vi instantiere en SAX parser (reader) en SAXXMLReader - på denne måde. Hvis vi ønsker at parseren skal gøre noget - hvis den støder på et ugyldigt XML dokument - skal vi skrive en error_handler, som er en event handler som aktiveres hvis der findes fejl! En SAX reader har en property (egenskab) ved navn errorhandler som sættes lig med en ny instantiering af vores egen klasse error_handler! Vores egen error_handler skal indeholde 3 metoder fordi den skal implementere et bestemt interface nemlig interfacet ErrorHandler. Alle error handlers skal altså have disse tre metoder! Vores klasse skrives i et klasse modul ved navn error_handler : Option Explicit Implements IVBSAXErrorHandler Private Sub IVBSAXErrorHandler_fatalError(ByVal locator As IVBSAXLocator, _ msg As String, ByVal errcode As Long) MsgBox "Error: Fejl: Linje: " & locator.linenumber & " Kolonne: " & _ locator.columnnumber & " " & msg & " publicid: " & locator.publicid _ & " systemid: " & locator.systemid Private Sub IVBSAXErrorHandler_error(ByVal locator As IVBSAXLocator, msg As _ String, ByVal errcode As Long) MsgBox "Error: Fejl: Linje: " & locator.linenumber & " Kolonne: " & _ locator.columnnumber & " " & msg & " publicid: " & locator.publicid _ & " systemid: " & locator.systemid Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal olocator As _ MSXML2.IVBSAXLocator, strerrormessage As String, _ ByVal nerrorcode As Long) Hele dette system kan virke besværligt men i SAX er der stort set kun brug for en content handler og en error handler. Og disse eksempler kan man så blive ved med at genbruge så arbejdet er ikke så stort!

7 En SAX Locator er et objekt som hele tiden registrerer i hvilken linje og kolonne reader en eller parseren befinder sig! systemid er den fil (adresse) som XML dokumentet stammer fra. Vi kan se at vores error_handler implementerer de 3 metoder. Hvis der opstår fejl i XML dokumentet skal der vises en message box med alle oplysninger om fejlen! I dette tilfælde har vi lavet en bevidst fejl: <T> <id>1</idd> <fornavn>jens</fornavn> <efternavn>jensen</efternavn> <titel>sommer i vejle</titel> <anmeldelse>en rigtig god bog - forfatteren har et stort potentiale og vil sikkert komme mere og mere frem i de kommende år - hvem ved hvad det skal blive til - det bliver i al fald spændende at følge hans udvikling - der vil komme mange gode bøger fra den mand </anmeldelse> </T> En content handler: På samme måde som en SAX parser eller reader har en errorhandler egenskab har den en contenthandler egenskab (property). Det egentlige arbejde er at definere en content handler til reader en! Her definerer vi hvad vi vil med vores SAX program. En content handler er en event handler som skal rumme de efterfølgende metoder eller events: Option Explicit Implements IVBSAXContentHandler Public s As String Private Sub IVBSAXContentHandler_characters(strChars As String)

8 'den eneste event som implementeres her: s = s & strchars Private Sub IVBSAXContentHandler_endDocument() MsgBox "Tekster:" & vbnewline & s Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _ String, strlocalname As String, strqname As String, _ ByVal oattributes As MSXML2.IVBSAXAttributes) Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, _ strlocalname As String, strqname As String) Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS _ As MSXML2.IVBSAXLocator) End Property Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String) Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String)

9 Private Sub IVBSAXContentHandler_processingInstruction(strTarget As _ String, strdata As String) Private Sub IVBSAXContentHandler_skippedEntity(strName As String) Private Sub IVBSAXContentHandler_startDocument() Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, _ struri As String) Vi kan her se alle de metoder som skal indgå i SAX! Den eneste metode vi har defineret er characters() som kaldes hver gang parseren støder på en tekstnode. Vi kan nu sætte en content handler på vores reader. Klassen ovenfor kalder vi for c1 f.eks. Vi kan så skrive denne sub: Option Explicit Public Sub parse_sax() Dim reader Set reader = New SAXXMLReader40 Set reader.errorhandler = New error_handler Set reader.contenthandler = New c1 reader.parseurl "personliste.xml" On Error Resume Next MsgBox "XML Dokumentet er parset OK af SAX!" Vi har nu fået vores reader til at lave noget fornuftigt nemlig udskrive de tekst noder som findes i dokumentet. Vores XML eksempel ser således ud: <?xml version='1.0'?> <personliste> <person>

10 <fornavn>ole</fornavn> <efternavn>jensen</efternavn> <telefon> </telefon> </person> <person> <fornavn>lise</fornavn> <efternavn>jensen</efternavn> <telefon> </telefon> </person> </personliste> Hvis vi afvikler vores sub rutine får vi følgende: Vi kan også søge og finde data med SAX og det er netop her SAX har sine fordele frem for DOM. Hvis vi ønsker at finde alle fornavne kan vi omskrive vores c1 content handler således: Option Explicit Implements IVBSAXContentHandler Public s As String Dim fornavn As Boolean Private Sub IVBSAXContentHandler_characters(strChars As String) 'den eneste event som implementeres her: If fornavn = True Then s = s & strchars End If Private Sub IVBSAXContentHandler_endDocument()

11 MsgBox "Resultat:" & vbnewline & vbnewline & s Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _ String, strlocalname As String, strqname As String, _ ByVal oattributes As MSXML2.IVBSAXAttributes) fornavn = False If strlocalname = "fornavn" Then fornavn = True End If Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, _ strlocalname As String, strqname As String) Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS _ As MSXML2.IVBSAXLocator) End Property Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String) Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String)

12 Private Sub IVBSAXContentHandler_processingInstruction(strTarget As _ String, strdata As String) Private Sub IVBSAXContentHandler_skippedEntity(strName As String) Private Sub IVBSAXContentHandler_startDocument() Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, _ struri As String) Vi opretter en variabel en boolean fornavn som sættes til true hvis elementets navn er fornavn dette sker i den event som hedder startelement! Herefter kan vi opsamle tekst noderne lige så længe fornavn er true! Vi kan også tælle antallet af elementer i dokumentet meget enkelt således idet vi kun skriver en startelement definition: Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _ String, strlocalname As String, strqname As String, _ ByVal oattributes As MSXML2.IVBSAXAttributes) antal = antal + 1

13 Private Sub IVBSAXContentHandler_endDocument() MsgBox "XML dokumentet indeholder " & antal & " elementer." At validere et XML dokument med SAX: Vi kan validere XML dokumenter i forhold til et skema på denne måde: Option Explicit Dim reader, skema_cache Public Sub valider_dokument() Set reader = New SAXXMLReader40 Set skema_cache = New MSXML2.XMLSchemaCache40 skema_cache.add "", "bog.xsd" reader.putfeature "schema-validation", True reader.putproperty "schemas", skema_cache reader.putfeature "exhaustive-errors", True On Error Resume Next reader.errorhandler = New error_handler reader.parseurl "bog.xml" Vi opretter en skema samling (en skema cache) og reader en får så denne samling tilknyttet. En cache kan loades med en lang række af skemaer som så ligger klar! De er som navnet siger cachet i hukommelsen. Den første parameter til Add er det namespace som skemaet tilhører her er der intet targetnamespace i skemaet! En reader har en property schemas som kan sættes til en skema samling. For at få reader en til at validere er det også nødvendigt at vi sætter en feature schema-validation til true! exhaustiveerrors betyder at parseren fortsætter også efter den første fejl i forhold til skemaet! Ellers ville en SAX parser normalt stoppe og kaste en exception. Vi bruger her den samme error_handler som tidligere. Som det ses har vi slet ikke brug for en content handler!

14 Hvis vi bruger dette XML dokument (med en skema fejl: id mangler): <?xml version="1.0" standalone="yes"?> <NewDataSet xmlns:xsi=" xsi:nonamespaceschemalocation="bog.xsd" > <bog_objekt> <id>1</id> <fornavn>jens</fornavn> <efternavn>jensen</efternavn> <titel>sommer i vejle</titel> <anmeldelse>en rigtig god bog </anmeldelse> </bog_objekt> <bog_objekt> <!-- <id>2</id> --> <fornavn>hanne</fornavn> <efternavn>olsen</efternavn> <titel>vinter i jylland</titel> <anmeldelse>en svag bog </anmeldelse> </bog_objekt> <bog_objekt> <id>3</id> <fornavn>marie-louise</fornavn> <efternavn>nielsen</efternavn> <titel>hvornr bliver jeg voksen?</titel> <anmeldelse>en udviklingsroman </anmeldelse> </bog_objekt> </NewDataSet> Kan vi validere med vores SAX parser: Man kan på denne måde validere mange dokumenter på en gang i en Visual Basic rutine!

15 Sammenligne DOM og SAX: Vi kan sammenligne den tid det tager at indlæse et XML dokument med SAX og med DOM: Denne sub rutine måler SAX s effektivitet (eller performance): Public Sub load_sax_time() Set reader = New SAXXMLReader40 starttime = Timer reader.parseurl "meget_lang.xml" MsgBox "Tid: " & Timer - starttime & "sekunder." On Error Resume Next Denne procedure måler performance i DOM som jo opbygger et træ og en RAM struktur som kan fylde meget mere end selve dokumentet: Public Sub load_dom() Dim doc As New MSXML2.DOMDocument40 starttime = Timer doc.load "meget_lang.xml" MsgBox "Tid: " & Timer - starttime & "sekunder." On Error Resume Next Forskellen er altså 0,17 sekunder over for 0,05 sekunder for SAX parseren tre gange så hurtig! En SAX parser har også den fordel at den kan søge et bestemt stykke data og stoppe læsningen når den

16 har fundet hvad den søgte! Dette kan ikke lade sig gøre med DOM modellen. Eksempel dokumentet her meget_lang.xml er på 1,86 MegaBytes. Skrive test XML dokumenter med SAX og Visual Basic: Vi har allerede set et eksempel på hvordan man kan skrive evt. store filer med SAX. Her er et eksempel på hvordan det kan gøres i Visual Basic: Option Explicit Public Sub skriv_xml() Dim writer As New MXXMLWriter40 Dim attr As New SAXAttributes40 Dim doc As New DOMDocument40 Dim i As Long writer.indent = True writer.standalone = True writer.output = doc Dim cont As IVBSAXContentHandler Set cont = writer cont.startdocument cont.startelement "", "", "data", attr Dim b As Boolean Dim streng As String For i = 1 To b = False streng = "dagligvare" If i Mod 3 = 0 Then streng = "kontorvare" If i Mod 2 = 0 Then b = True attr.addattribute "", "id", "id", "integer", i attr.addattribute "", "dansk", "dansk", "boolean", b attr.addattribute "", "kategori", "kategori", "", streng attr.addattribute "", "pris", "pris", "", Int(1000 * Rnd()) cont.startelement "", "", "vare", attr attr.clear cont.endelement "", "", "vare" Next i cont.endelement "", "", "data" cont.enddocument doc.save "c:/sax/sax_varer.xml"

17 Denne rutine producerer en XML fil på cirka 14 MegaByte med denne struktur: Visual Basic funktionen vælger nogle tilfældige værdier for hver vare. Resultatet af skrivningen gemmes i et DOM dokument som så eventuelt kan gemmes på harddisken XML dokumenter af en vis størrelse her er der f. eks forskellige vare-poster er velegnede hvis visse procedurer skal testes. F. eks. kan man teste hvor lang tid det tager at finde visse data! Søge og finde i vare eksemplet: At søge og finde er lidt mere besværligt i SAX end i DOM modellen men hastigheden er som regel meget højere! Hvis vi f. eks. ønsker at finde alle daglig varer som koster mindre end 10 kroner kan vi gøre følgende: Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _

18 String, strlocalname As String, strqname As String, _ ByVal oattributes As MSXML2.IVBSAXAttributes) If strlocalname = "vare" Then prisdata = CInt(oAttributes.getValueFromQName("pris")) If prisdata < 10 Then If oattributes.getvaluefromqname("kategori") = "dagligvare" Then End If End If End If pris = " pris: " & oattributes.getvaluefromqname("pris") & " " kategori = " kategori: " & oattributes.getvaluefromqname("kategori") & " " id = "id: " & oattributes.getvaluefromqname("id") MsgBox id & pris & kategori Det skal understreges at hvis XML dokumentet er på 14 megabytes vil der komme rigtigt mange message bokse efter denne metode. I stedet kunne værdierne selvfølgeligt opsamles i en streng som så kan vises eller gemmes. Det kan ses at søgeprocessen i SAX er fundamentalt anderledes end i DOM. I DOM modellen kan vi søge med et XPATH udtryk. I SAX kan vi kun læse et tegn ad gangen og må derfor søge på en helt anden måde. Hvis vi prøver at måle tiden for indlæsningen af vores vare dokument giver SAX dette resultat: og DOM dette resultat: Forskellen er altså mærkbar SAX er 5 gange hurtigere!

19 SAXON SAX parser: Vi har tidligere omtalt SAX parseren fra SAXON skrevet af een mand i princippet Michael Kay. Her skal gives et eksempel på hvordan man kan skrive kode til SAXON. Det heldige ved SAX er at der er bred enighed om hvordan kode skal skrives hvis man vælger selv at skrive kode til SAX. De samme metoder anvendes i script, Microsofts XML, Xerces, Oracle eller her SAXON. Så hvis man først har set metoderne i f. eks. Visual Basic har man set hvordan koden skrives og det hele bliver en del nemmere! I SAXON som skal kodes i Java - kan man skrive en Java klasse som parser et XML dokument, kontrollerer det for fejl og udskriver visse data fra dokumentet således: import com.icl.saxon.aelfred.*; public class Parser { public static void main(string args[]) { SAXDriver sax=new SAXDriver(); sax.setcontenthandler(new H()); try { sax.parse(args[0]); catch (Exception e){system.out.print(e.tostring()); class H extends DefaultHandler { private int antal=0; private int elementer=0; public H() { public void characters (char c[], int x, int y) { antal+=y; System.out.println("ANTAL TEGN LÆST: "+antal); System.out.print("TEKST NODEN: "); for(int i=0;i<y;i++){ System.out.print(c[i]); System.out.println(); public void endelement(string x, String y, String z) { System.out.println("End Element: "+x+" : "+y+" : "+z); elementer++; public void enddocument() { System.out.println("ANTAL ELEMENTER I DOKUMENTET: "+elementer);

20 Denne kode gør nogenlunde hvad vi også har set tidligere! Programmet tæller hvor mange elementer der er i dokumentet, hvor mange tegn i tekst noderne, udskriver hver tekst node for sig! Også her er vi nødt til at skrive en event handler klasse som definerer hvad vi vil med dokumentet! Vi kan også på denne måde søge efter et bestemt efternavn! SAX parseren hedder her SAXDriver men der findes mange forskellige SAX parsere i Java systemet. Her er brugt klasser som følger med SAXON. Denne klasse kan læse dokumenter alle steder fra og kan udskrive om dokumentet ikke er vel formet. Det interessante ved en SAX parser er at den starter processen og først standser når den støder på en formel fejl - som vist i dette eksempel hvor vi bevidst har indført en fejl i XML dokumentet. Dette viser tydeligt at vi kan begynde at bruge et XML dokument med SAX i real time også selv om det indeholder fejl!! Dette kan ikke lade sig gøre med metoderne i DOM som først skal indlæse hele dokumentet!: Programmet udskriver elementets namespace, local name og qualified name. Alle elementerne har fået et namespace - fordi roden har fået et default namespace! Denne slags analyse er god hvis er i tvivl om hvorvidt et element er inde under et bestemt namespace! Vi kan se at parseren forventer telefon og har fundet elefon!

SAX Simple API for XML.

SAX Simple API for XML. SAX Simple API for XML....1 Funktioner:...2 Skrive XML dokumenter med SAX writer:...4 SAX metoder i Visual Basic:...5 error handler:...6 En content handler:...7 At validere et XML dokument med SAX:...13

Læs mere

Encoding:...1 Et tegn sæt (character set):...1 UTF-8 og UTF-16 (Unicode):...2

Encoding:...1 Et tegn sæt (character set):...1 UTF-8 og UTF-16 (Unicode):...2 Encoding:...1 Et tegn sæt (character set):...1 UTF-8 og UTF-16 (Unicode):...2 Encoding: Vi har tidligere set på spørgsmålet om et XML dokuments encoding. Det er generelt altid en god ide at gemme et dokument

Læs mere

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM. Denne guide er oprindeligt udgivet på Eksperten.dk XML parsning i Java Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM. Den forudsætter kendskab til Java og XML.

Læs mere

Opret en Powerpoint præsentation automatisk med VBA

Opret en Powerpoint præsentation automatisk med VBA Opret en Powerpoint præsentation automatisk med VBA I denne vejledning bliver det gennemgået, hvordan man via VBA kan oprette en powerpoint med diagrammer og kommentarer fra Excel automatisk. Gør som følgende:

Læs mere

Hent filoplysninger fra billeder og filer

Hent filoplysninger fra billeder og filer Hent filoplysninger fra billeder og filer I denne vejledning bliver det gennemgået, hvordan man via Power Forespørgsel kan hente filoplysninger fra en mappe ind i Excel. Der skal opbygges følgende elementer:

Læs mere

Namespaces. Vi kan kvalificere elementer på denne måde: <?xml version="1.0" encoding="iso-8859-1"?>

Namespaces. Vi kan kvalificere elementer på denne måde: <?xml version=1.0 encoding=iso-8859-1?> Namespaces...1 Default namespace:...6 Præfiks:...7 To slags navne i XML:...11 Standard namespaces:...14 RDF Resource Description Framework:...18 Attributter:...19 DTD skemaer og namespaces:...21 Namespaces.

Læs mere

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13 1 Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Hvad er en makro... 10 Hvad kan du bruge en makro til... 10 Hvad en makro er (Visual Basic for Applications)... 11 Det hele sker

Læs mere

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl:

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl: Fejlhåndtering Selv de bedste programmører laver af og til fejl! Dette kommer sikkert som en overraskelse for de fleste, bortset fra de, der har arbejdet med et hvilket som helst større program. Fejl kan

Læs mere

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

//Udskriver System.out.println(Hej  + ditfornavn +   + ditefternavn + .); System.out.println(Du er  + dinalder +  aar gammel! Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for

Læs mere

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004 Overvågningssystem Beskrivelse Bagagesorteringssystemet består af et antal skranker (check-in) til modtagelse og registrering af bagage, et automatiseret sorteringsanlæg samt et antal terminaler (gates),

Læs mere

DOM Document Object Model:

DOM Document Object Model: DOM Document Object Model:...1 Typer af noder i træet:...3 Reading:...4 document:...6 element:...7 attributter:...12 parser fejl:...13 XPATH:...13 Stier i XPATH:...13 Prædikater:...14 Operatorer:...15

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3 DM502 Forelæsning 3 Indlæsning fra tastatur Udskrift til skærm Repetition Beregning af middelværdi Gentagelse med stop-betingelse (while) Heltalsdivision Division med nul Type-casting ( (double) ) Betinget

Læs mere

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til [email protected]. Besvarelsen skal

Læs mere

MS Visual Studio Basic 2010. En kort vejledning

MS Visual Studio Basic 2010. En kort vejledning Du kan hente programmet gratis her: MS Visual Studio Basic 2010 Express http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express Tryk på Install Now og følg vejledningen. Indholdsfortegnelse

Læs mere

Programmering I Java/C#

Programmering I Java/C# Programmering I Java/C# Dit første projekt Datatekniker Intro to C# C# (C Sharp) Et enkelt, moderne, generelt anvendeligt, objektorienteret programmeringssprog Udviklet af Microsoft, ledet af danskeren

Læs mere

Webserverprogrammering

Webserverprogrammering Webserverprogrammering WSP fortsat - dag 11 Behandling af XML (StAX) Syndikering og RSS med XML JAXB - XML Java-objekter Projekthjælp Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

Anvendelse af metoder - Programmering

Anvendelse af metoder - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Anvendelse af metoder - Programmering En forhåbentlig rigtig god forklaring på hvad metoder er og hvordan de anvendes. Lidt om private og public, retur

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Udvikling af DOTNET applikationer til MicroStation i C#

Udvikling af DOTNET applikationer til MicroStation i C# Udvikling af DOTNET applikationer til MicroStation i C# Praktiske tips for at komme i gang. Gunnar Jul Jensen, Cowi Hvorfor nu det? Mdl og Vba kan det hele Fordelene er : udviklingsmiljøet er eksternt

Læs mere

Hvad er Objekter - Programmering

Hvad er Objekter - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som

Læs mere

Tredjepart webservices

Tredjepart webservices Tredjepart webservices 4. juni 2015 USS Dok. Klik her for at angive tekst. 1/12 Indholdsfortegnelse Introduktion... 3 Miljøer... 3 Adgang... 3 API kald... 4 GET: /authorizations... 4 Input 4 Output 4 Output

Læs mere

Software Construction 1 semester (SWC) Spørgsmål 1

Software Construction 1 semester (SWC) Spørgsmål 1 Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /

Læs mere

Tree klassen fra sidste forelæsning

Tree klassen fra sidste forelæsning Programmering 1999 Forelæsning 12, fredag 8. oktober 1999 Oversigt Abstrakte klasser. Grænseflader. Programmering 1999 KVL Side 12-1 Tree klassen fra sidste forelæsning class Tree { int age; // in years

Læs mere

A Profile for Safety Critical Java

A Profile for Safety Critical Java A Profile for Safety Critical Java Martin Schoeberl Hans Søndergaard Bent Thomsen Anders P. Ravn Præsenteret af: Henrik Kragh-Hansen November 8, 2007 Forfatterne Martin Schoeberl Udvikler af JOP processoren

Læs mere

Træ struktur: Alle XML dokumenter er grafer og gyldige træ strukturer. Et konkret eksempel herpå kunne være: <data>data.</data>

Træ struktur: Alle XML dokumenter er grafer og gyldige træ strukturer. Et konkret eksempel herpå kunne være: <data>data.</data> XML generelt:...1 XML:...1 Træ struktur:...2 Kinesiske æsker eller russiske dukker:...4 Besøgs eller Visiting algoritmer:...5 XML og HTML:...8 Hvad er en parser?...9 Velformet:...11 Et script program der

Læs mere

Dokumentering af umbraco artikeleksport:

Dokumentering af umbraco artikeleksport: Dokumentering af umbraco artikeleksport: Lav en artikel side 2-3. Installationsguide side 3-5. Opsættelse af databasen og web.config side 5-8. Umbraco: templates side 8. Umbraco: borger.dk tab side 8.

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 6 Komponenter (og lidt Swing og MVC) Læsning: VP 4, evt. VP 6 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html Grafiske komponenter

Læs mere

$ %' ) * %' +,! - Myarray %' /0 /0 122 +3 /0 /0

$ %' ) * %' +,! - Myarray %' /0 /0 122 +3 /0 /0 !"#!"# "# %&') * #" % && %' Dim MyArray2) As Integer ) * %' +,! - Myarray MyArray0). %' /0 /0 122 + /0 /0 +4 / 0) Dim MyArray1 to 2) As Integer 5MyarrayMyArray1)" +6 Option Base 1 Option Explicit %' 76

Læs mere

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11 DM503 Forelæsning 11 Generics Pakker Exceptions Indhold Generics Nedarvning og Generics Generics Nedarvning og Generics Husk Box fra sidst Generics public class Box {! private T object;! public void

Læs mere

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation). Denne guide er oprindeligt udgivet på Eksperten.dk RMI introduktion Denne artikel beskriver Java RMI (Remtote Method Invocation). Den beskriver teorien bag RMI, viser et simpelt kode eksempel og forklarer

Læs mere

Installation og Drift. Aplanner for Windows Systemer Version 8.15

Installation og Drift. Aplanner for Windows Systemer Version 8.15 Installation og Drift Aplanner for Windows Systemer Version 8.15 Aplanner for Windows løsninger Tekniske forudsætninger Krav vedr. SQL Server SQL Server: SQL Server 2008 Express, SQL Server 2008 R2 eller

Læs mere

Virkefeltsregler i Java

Virkefeltsregler i Java Virkefeltsregler i Java int i; int k; Sequence s; int j; What s in a name? Brian spillede blændende i søndags! Skolen ligger i Viby Ring til Kirsten og sig at... Et navn fortolkes i en kontekst og konteksten

Læs mere

DTD Document Type Definition:

DTD Document Type Definition: DTD Document Type Definition:...1 Sekvens:...2 Validering:...3 Attributter i DTD:...8 In-line DTD skemaer:...10 Entiteter:...11 Entiteter som værdier i attributter:...13 DTD skemaer kun med entiteter:...14

Læs mere

Specifikationsdokument for PDF Validator API

Specifikationsdokument for PDF Validator API Nets DanID A/S Lautrupbjerg 10 DK 2750 Ballerup T +45 87 42 45 00 F +45 70 20 66 29 [email protected] www.nets-danid.dk CVR-nr. 30808460 Specifikationsdokument for PDF Validator API DanID A/S 17. august 2012

Læs mere

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen. Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19

Læs mere

Introduktion til ActionScript, fortsat

Introduktion til ActionScript, fortsat Introduktion til ActionScript, fortsat Kaspar Rosengreen Nielsen [email protected] i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, [email protected] 1 Dagens program Opsamling

Læs mere

Introduktion til ActionScript

Introduktion til ActionScript Introduktion til ActionScript Kaspar Rosengreen Nielsen [email protected] i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, [email protected] 1 Dagens program Opsamling på

Læs mere

Hvordan vælger jeg dokumentprofilen?

Hvordan vælger jeg dokumentprofilen? Hvordan vælger jeg dokumentprofilen? Valget af OIOUBL profil i en konkret dokumentudveksling vil bl.a. afhænge af, hvilke OIOUBL profiler den anden part i udvekslingen understøtter. Et konkret eksempel

Læs mere

PID2000 Archive Service

PID2000 Archive Service PROLON CONTROL SYSTEMS Herstedvesterstræde 56 DK-2620 Albertslund Danmark Tlf.: (+45) 43620625 Fax: (+45) 43623125 PID2000 Archive Service Bruger vejledning Juni 2002 Denne manual beskriver brugen af softwaren

Læs mere

Advanced Word Template Brugermanual

Advanced Word Template Brugermanual Advanced Word Template Brugermanual Forord: Advanced Word Template er et værktøj, der anvendes sammen med Microsoft Word til at opbygge ensartet beskrivelser på en mere intelligent måde end Copy and Paste

Læs mere

Undtagelseshåndtering i C#

Undtagelseshåndtering i C# Denne guide er oprindeligt udgivet på Eksperten.dk Undtagelseshåndtering i C# I modsætning til C++ kan man i C# ikke skrive et program uden undtagelseshåndtering, så derfor har jeg skrevet denne guide

Læs mere

DANMARKS TEKNISKE UNIVERSITET

DANMARKS TEKNISKE UNIVERSITET DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler

Læs mere

Eksempel på transformation: XML -> RTF dokument:

Eksempel på transformation: XML -> RTF dokument: Eksempel på transformation: XML -> RTF dokument: RTF dokumenter er Rich Text dokumenter der kan formateres med farver og forskellige skrifttyper. I nogle tilfælde kan det være interessant at transformere

Læs mere

Test af It-komponent

Test af It-komponent Test af It-komponent I programmeringssproget Java Programmet Login service Elev: Mads Funch Klasse 2.4 Mat, It, Programmering Skole: Roskilde Tekniske Gymnasium HTX Underviser: Karl Dato: 31-08-2016 Side

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 20. april, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

GIS indlæsning af kreditorer og betalingsform. Brugervejledning 1.0

GIS indlæsning af kreditorer og betalingsform. Brugervejledning 1.0 GIS indlæsning af kreditorer og betalingsform Brugervejledning 1.0 Indhold 1 Indledning... 5 2 Opsætning af GIS grænseflade til kreditor indlæsning... 5 2.1 Oprettelse af en datastrøm... 7 2.2 Filsystem...

Læs mere

Rekursion C#-version

Rekursion C#-version Note til Programmeringsteknologi Akademiuddannn i Informationsteknologi Rekursion C#-version Finn Nordbjerg 1 Rekursion Rekursionsbegrebet bygger på, at man beskriver noget ved "sig selv". Fx. kan tallet

Læs mere

Om binære søgetræer i Java

Om binære søgetræer i Java Om binære søgetræer i Java Mads Rosendahl 7. november 2002 Resumé En fix måde at gemme data på er i en træstruktur. Måden er nyttig hvis man får noget data ind og man gerne vil have at det gemt i en sorteret

Læs mere

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract Sproget Six Til brug i rapportopgaven på kurset Oversættere Vinter 2006 Abstract Six er baseret på det sprog, der vises i figur 6.2 og 6.4 i Basics of Compiler Design. Den herværende tekst beskriver basissproget

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 10. april, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere Integrationsmanual Anvendelse af webservice til kursusoversigt i Campus Brugervejledning til udviklere Moderniseringsstyrelsen Webservice manual til udviklere 2016 1 1. Indholdsfortegnelse Nyt kapitel

Læs mere

Spil Master Mind. Indledning.

Spil Master Mind. Indledning. side 1 af 16 Indledning. Spillet som denne rapport beskriver, indgår i et større program, der er lavet som projekt i valgfaget programmering C på HTX i perioden 9/11-98 til 12/1-99. Spillet skal give de

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

Lær Python - Dag 3, modul 1 Læse og skrive filer

Lær Python - Dag 3, modul 1 Læse og skrive filer Lær Python - Dag 3, modul 1 Læse og skrive filer Simon J. Larsen 15. oktober 2017 Institut for Matematik og Datalogi Læse og skrive filer Persistens Vi har ofte brug for at gemme data på disken som ikke

Læs mere

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet.

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet. 8 3. Nedtælling Nu skal du lave en nedtæller. Det er en god måde at lære variabler på og hvordan du skal kode micro:bit til at gøre dét, du vil have, at den skal vise. Du skal bruge: 1 x BBC micro:bit

Læs mere

Projekt i Programmering C Menu til hjemmeside.

Projekt i Programmering C Menu til hjemmeside. Projekt i Programmering C Menu til hjemmeside. 10-12-2004 Holstebro HTX Bent Arnoldsen Synopsis. Projektet her er en menu til hjemmesider, som er lavet så den er let at tilrette, når man tilføjer eller

Læs mere