XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.
|
|
|
- Mia Lauritsen
- 8 år siden
- Visninger:
Transkript
1 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. Skrevet den 15. Feb 2010 af arne_v I kategorien Programmering / Java Historie: V1.0-20/01/ original V1.1-31/01/ forbedret formatering V1.2-09/02/ flere ændringer af formatering V1.3-07/04/ nævn at der er en anden artikel om skrivning af XML V1.4-20/08/ tilføj JDOM med SAXBuilder V1.5-26/12/ mindre ændringer og tilføjelse af links V1.6-14/02/ smårettelser W3C DOM/SAX/JDOM Der er 3 typer XML parsere til Java: * W3C DOM parsere * SAX parsere * JDOM parser En W3C DOM parser opbygger et såkaldt DOM træ af noder og er defineret af W3C (som står bag HTML, XML og en masse andre standarder). En W3C DOM parser giver stor fleksibilitet idet man kan køre frem og tilbage i træet samt ændre i træet. Til gengæld kræver den også meget memory (3-5 x filens størrelse er ikke unormalt). En SAX parser er event push drevet d.v.s. at den læser filen sekventielt og kalder metoder undervejs når den starter på et element, afslutter et element etc.. Man kan kun læse og kun sekventielt. Til gengæld er den hurtig og bruger næsten ingen memory. JDOM parseren bygger sit træ udfra et W3C DOM træ, men har et API som er noget mere Java venligt. Det er ikke en egentlig standard. Jeg kan kun opfordre til at prøve den. Den er faktisk god. W3C DOM og SAX parsere er indbygget i J2SE 1.4 og nyere. For ældre versioner kan man hente Apache Xerces her: JDOM kan hentes her: Det er værd at bemærke at SUN Java 1.4 brugte Crimson XML parser mens Java 1.5 og nyere bruger Xerces (med ændrede package navne).
2 Hvis man vil bruge en anden XML parser end default kan man bruge: System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.documentbuilderfactoryimpl"); System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.crimson.jaxp.documentbuilderfactoryimpl"); etc. Eksempler Lad os se nogle konkrete eksempler. Vi vil parse følgende simple XML fil: test.xml <?xml version='1.0' standalone='yes'?> <medlemmer> <medlem no="1"> <navn>niels Nielsen</navn> <adresse>nellikevej 19</adresse> </medlem> <medlem no="2"> <navn>jens Jensen</navn> <adresse>jagtvej 17</adresse> </medlem> <medlem no="3"> <navn>ole Olsen</navn> <adresse>omfartsvejen 13</adresse> </medlem> </medlemmer> Output skal være: no=1 navn=niels Nielsen adresse=nellikevej 19 no=2 navn=jens Jensen adresse=jagtvej 17 no=3 navn=ole Olsen adresse=omfartsvejen 13 W3C DOM ParseW3CDOM.java import java.io.file;
3 import java.io.ioexception; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.factoryconfigurationerror; import javax.xml.parsers.parserconfigurationexception; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.node; import org.w3c.dom.nodelist; import org.xml.sax.saxexception; public class ParseW3CDOM { private final static String XML_FILE = "C:\\test.xml"; public static void main(string[] args) { try { // læs fra fil til DOM træ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newdocumentbuilder(); Document doc = db.parse(new File(XML_FILE)); // lav liste over alle elementer af typen 'medlem' NodeList elements = doc.getelementsbytagname("medlem"); for (int i = 0; i < elements.getlength(); i++) { Node element = (Element) elements.item(i); // find attributten no String no = ((Element) element).getattribute("no"); String name = ""; String address = ""; // lav liste over alle childs og find navn og adresse NodeList subelements = element.getchildnodes(); for (int j = 0; j < subelements.getlength(); j++) { String tag = subelements.item(j).getnodename(); if (tag.equals("navn")) { name = subelements.item(j).getfirstchild().getnodevalue(); if (tag.equals("adresse")) { address = subelements.item(j).getfirstchild().getnodevalue(); System.out.println("no=" + no); System.out.println("navn=" + name); System.out.println("adresse=" + address); catch (FactoryConfigurationError e) { catch (ParserConfigurationException e) { catch (SAXException e) { catch (IOException e) {
4 return; W3C DOM kan godt virke lidt besværligt. SAX ParseSAX.java import java.io.ioexception; import javax.xml.parsers.factoryconfigurationerror; import javax.xml.parsers.parserconfigurationexception; import javax.xml.parsers.saxparser; import javax.xml.parsers.saxparserfactory; import org.xml.sax.attributes; import org.xml.sax.saxexception; import org.xml.sax.xmlreader; import org.xml.sax.helpers.defaulthandler; public class ParseSAX { private final static String XML_FILE = "C:\\test.xml"; public static void main(string[] args) { try { // process fil med MySaxParser som event handler SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newsaxparser(); XMLReader xr = sp.getxmlreader(); xr.setcontenthandler(new MySaxParser()); xr.parse(xml_file); catch (FactoryConfigurationError e) { catch (ParserConfigurationException e) { catch (SAXException e) { catch (IOException e) { class MySaxParser extends DefaultHandler { private StringBuffer sb = new StringBuffer(""); // akkumuler tekst (vigtigt: kan kaldes flere gang for en text node) public void characters(char buf[], int offset, int len) throws SAXException { sb.append(new String(buf, offset, len)); return;
5 // process start element, hvis 'medlem' find attribut no public void startelement(string namespaceuri, String localname, String rawname, Attributes atts) throws SAXException { if (rawname.equals("medlem")) { String no = atts.getvalue("no"); System.out.println("no=" + no); return; // process end element, find navnog adresse public void endelement(string namespaceuri, String localname, String rawname) throws SAXException { if (rawname.equals("navn")) { String name = sb.tostring().trim(); System.out.println("navn=" + name); if (rawname.equals("adresse")) { String address = sb.tostring().trim(); System.out.println("adresse=" + address); sb = new StringBuffer(); return; SAX kan hurtigt blive til noget ustruktureret spagetti. JDOM ParseJDOM.java import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioexception; import java.util.list; import org.jdom.document; import org.jdom.element; import org.jdom.jdomexception; import org.jdom.adapters.domadapter; import org.jdom.adapters.xercesdomadapter; import org.jdom.input.dombuilder; public class ParseJDOM { private final static String XML_FILE = "C:\\test.xml"; public static void main(string[] args) { try { DOMAdapter da = new XercesDOMAdapter(); org.w3c.dom.document w3cdoc = da.getdocument(new FileInputStream(XML_FILE), false);
6 DOMBuilder b = new DOMBuilder(); Document doc = b.build(w3cdoc); List list = doc.getrootelement().getchildren(); for (int i = 0; i < list.size(); i++) { Element elm = (Element) list.get(i); String no = elm.getattributevalue("no"); String name = elm.getchild("navn").gettext(); String address = elm.getchild("adresse").gettext(); System.out.println("no=" + no); System.out.println("navn=" + name); System.out.println("adresse=" + address); catch (FileNotFoundException e) { catch (IOException e) { catch (JDOMException e) { catch (Exception e) { Det fremgår klart at JDOM er nemmere at bruge end W3C DOM. JDOM kan også opbygge sit træ med en en SAXBuilder. import java.io.filenotfoundexception; import java.io.filereader; import java.io.ioexception; import java.util.list; import org.jdom.document; import org.jdom.element; import org.jdom.jdomexception; import org.jdom.input.saxbuilder; public class ParseJDOMSAX { private final static String XML_FILE = "C:\\test.xml"; public static void main(string[] args) { try { SAXBuilder b = new SAXBuilder(); Document doc = b.build(new FileReader(XML_FILE)); List list = doc.getrootelement().getchildren(); for (int i = 0; i < list.size(); i++) { Element elm = (Element) list.get(i); String no = elm.getattributevalue("no"); String name = elm.getchild("navn").gettext(); String address = elm.getchild("adresse").gettext(); System.out.println("no=" + no);
7 System.out.println("navn=" + name); System.out.println("adresse=" + address); catch (FileNotFoundException e) { catch (IOException e) { catch (JDOMException e) { catch (Exception e) { Jeg kender ikke nok til JDOM til at kunne udtale mig om forskellen i performance med DOMBuilder og SAXBuilder. Videre Ovenstående eksempler skulle gerne have givet lidt forståelse for de forskellige parsere, hvad de er gode til og hvad de ikke er gode til samt hvordan de kodes i praksis. Artiklen "Mere XML i Java" beskriver: - udskrift af W3C DOM og JDOM træer - ændring af W3C DOM og JDOM træer - W3C DOM Walker - select med XPath i W3C DOM og JDOM Artiklen "Nye Java XML API'er" beskriver: - StAX - JAXB - XStream Kommentar af simonvalter d. 27. Jan Fine eksempler, jeg havde ikke nogen problemer med at bruge det efter at have læst dette. Kommentar af ferrari_brian d. 15. Feb Kommentar af soaphovedet d. 04. Mar Fin artikel, jeg kunne snildt lave en parser efter at have læst dette. Dog virker getfirstchild() i "subelements.item(j).getfirstchild().getnodevalue()" redundant i dette eksempel. Artikelen kunne desuden godt bruge et eksempel på en xml writer. Kommentar af abatabat d. 30. May jeg kunne let få det til at virke efter at havde læst artiklen, men kunne også godt bruge et eksempel på en
8 xml writer.
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
Singleton pattern i Java
Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i Java Denne artikel beskriver Singleton pattern og implementation i Java. Den forudsætter kendskab til Java men ikke til Singleton.
SAX Simple API for XML.
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
//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
Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java
Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter
XML i PHP. Denne artikel gennemgår kort nogle af de mange muligheder for brug af XML i PHP. Det sker ved brug af eksempler. Eksemplerne kræver PHP 5.
Denne guide er oprindeligt udgivet på Eksperten.dk XML i PHP Denne artikel gennemgår kort nogle af de mange muligheder for brug af XML i PHP. Det sker ved brug af eksempler. Eksemplerne kræver PHP 5. Den
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
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
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
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
Forskellige Java versioner
Denne guide er oprindeligt udgivet på Eksperten.dk Forskellige Java versioner Denne artikel beskriver lidt om de forskellige Java versioner. Den forklarer J2SE/J2ME/J2EE, plugin/jre/sdk og Sun Java/Microsoft
Bits, bit operationer, integers og floating point
Denne guide er oprindeligt udgivet på Eksperten.dk Bits, bit operationer, integers og floating point Denne artikel beskriver hvordan data gemmes som bits og hvordan man kan manipulere med bits. Den forudsætter
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
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
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
Arkitektur for begyndere
Denne guide er oprindeligt udgivet på Eksperten.dk Arkitektur for begyndere Denne artikel beskriver forskellige basale n-tier arkitekturer. Som man bør kende og have valgt inden man går igang med at udvikle
Introduktion til SQL queries
Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til SQL queries Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i
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,
Database design for begyndere
Denne guide er oprindeligt udgivet på Eksperten.dk Database design for begyndere Denne artikel beskriver hvordan man kommer fra ide til database design. Den stopper inden normal former. Den forudsætter
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
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
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
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
Eksempel på en database: studenter, kurser, eksamener
Udvidet Programmering 1999 Forelæsning 20, fredag 12. november 1999 Relationsdatabaser: relationer, tupler, attributter Forespørgselssproget SQL Databasesystemet PostgreSQL Tilgang til relationsdatabaser
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),
Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben
GoogleAppEngine GoogleAppEnginesomplatform ClausMyglegaardVagnerogJacobvonEyben Abstract CloudcomputingerenteknologidervinderfremidengenerelleITinfrastruktur. SocialemediersåsomLinkedIn,TwitterogFacebookharøgetbehovetfor
Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox
Martin Olsen DM0 Projekt 0 Del I. marts 0 FOTO: Colourbox Indhold Indledning... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Kildekode til SimpleInv.java... Kildekode til MergeSort.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
SigmaT.
Java + Groovy Disposition Om SigmaT Eksempel på indlejring af Groovy Overvågning af PEM Ønske om dynamisk loaded Java uden at fifle med classloaderen Groovy til hjælp Opsamling hvad jeg ikke har fortalt
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
Introduktion til funktioner, moduler og scopes i Python
Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til funktioner, moduler og scopes i Python Denne artikel er fortsættelsen af "I gang med Python", som blevet publiceret her på sitet for
Løsning af møntproblemet
Løsning af møntproblemet Keld Helsgaun RUC, oktober 1999 Antag at tilstandene i problemet (stillingerne) er repræsenteret ved objekter af klassen State. Vi kan da finde en kortest mulig løsning af problemet
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
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.
Dag 10 Flertrådet programmering
Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument,
Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:
Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra
I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.
Denne guide er oprindeligt udgivet på Eksperten.dk Afrund til helt tal I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal. Skrevet den 03. Feb 2009 af tjomsen I kategorien
Servlets, Tomcat & BlueJ
Servlets, Tomcat & BlueJ Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 05.october 2007 Hvad er Servlets: For at forstå det, må vi først få styr på to begreber, nemlig statiske og dynamiske hjemmesider
MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.
Denne guide er oprindeligt udgivet på Eksperten.dk MySQL C API Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Den forudsætter lidt kendskab
Bilag 1 Rige billeder Ordremodtagelse
Bilag1 Rigebilleder Ordremodtagelse Tværfagligtprojektpå2.Semester Bilag afchristian,kennetogmartin 71 Overordnet Tværfagligtprojektpå2.Semester Bilag afchristian,kennetogmartin 72 Produktionsgulvet Tværfagligtprojektpå2.Semester
Delphi - CrackMe og Keygen
Denne guide er oprindeligt udgivet på Eksperten.dk Delphi - CrackMe og Keygen Dette er min første artikel! :) Men jeg synes nu den er blevet meget god! :D Jeg giver et et eksempel på hvordan man kan lave
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
Hvad er et distribueret objekt? Plan 12.3. Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation
Plan 12.3. Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen Hvad er et
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
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
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
RMI med BlueJ. Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 11. desember 2007
RMI med BlueJ Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 11. desember 2007 Hvad er RMI? Når man arbejder med Distribuerede Systemer, som igen vil sige at man ønsker at flere end én komputer
HVORDAN VI DOWNLOADEDE INTERNETTET. Man skal crawle før man kan gå
HVORDAN VI DOWNLOADEDE INTERNETTET Man skal crawle før man kan gå DAGSORDEN Hvem jeg er Behovet for en crawler Arkitektur Nutch og Hadoop MongoDB Udfordringer Tak for i dag JACOB AVLUND Partner i Siblingsoft
