22. februar 2002 - 21:00Der er
26 kommentarer og 1 løsning
XML
Nogen der kan give mig et eks på hvordan jeg bruger xml i et Javaprogram? For det kunne jeg godt bruge til at projekt på DM uddannelsen... Så skal vi sige 150 point.
Undskyld at jeg ikke har sendt noget, jeg skal gerne send lidt simpel kode der viser den primære anvendelse af xml i Java, men det bliver først hjemmefra i aften.
En af de mest nærliggende anvendelser er xml er til beskrivelse af objekter i form af data strukturer eller lign. I Java er det således oplagt at lade et objekt være i stand til at udtrykke sig selv i xml, f.eks. ved at have et interface: public interface XMLExpressible { public String toXML(); } hvor metoden toXML skal give en tekstuel beskrivelse i xml af objektet. Dette gør det muligt for programmer i andre sprog C/C++/C# etc at læse og fortolke dette. Det modsatte er også vigtigt, nemlig givet en xml kode der beskriver et objekt dan objektet. Sidstnævnte er det vanskeligste, men det kan lade sig gøre relativt smertefrit. Jeg vil give en beskrivelse der benytter en SAX parser fremfor DOM parseren som nævnt tidligere. Førstnævnte har den fordel at den er relativt let at skrive og bruge, samt er hurtig og bruger lidt hukommelse. Lad os definere en klasse der implementerer XMLExpressible: public class PhoneNumber implements XMLExpressible { private int countryCode; private int localNumber; public PhoneNumber(int cC, int lN) { countryCode = cC; localNumber = lN; } public String toXML() { return "<?xml version=\"1.0\"?>" + "<code>" + countryCode + "</code>" + "<number>" + localNumber + "</number>"; } } Næste indlæg går til det andet problem.
Her er et par filer du skal have: læg i en file phoneNumber: <?xml version="1.0"?> <phonenumber> <code>45</code> <number>12345678</number> </phonenumber>
Kompiler filerne med javac PhoneNumber.java XMLExpressible.java PhoneNumberHandler.java Kør eksempelprogrammet (main metoden) fra PhoneNumberHandler med java -cp . PhoneNumberHandler så skulle du gerne få et PhoneNumber skrevet ud på skærmen. Meld tilbage når du har fået det til at køre. PS Husk at du skal bruge J2SDK version 1.4
Du har allerede nu fortjent points... Med den store hjælp til en dum Datamatiker som mig :) Jeg får denne fejl....
Exception in thread "main" org.xml.sax.SAXParseException: XML declaration may only begin entities. at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182) at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3170) at org.apache.crimson.parser.Parser2.maybePI(Parser2.java:966) at org.apache.crimson.parser.Parser2.maybeMisc(Parser2.java:1092) at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:487) at org.apache.crimson.parser.Parser2.parse(Parser2.java:305) at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442) at PhoneNumberHandler.main(PhoneNumberHandler.java:62)
Tak, men jeg vil gerne hjælpe dig lidt videre. I morgen formiddag får du en mere udførlig beskrivelse af PhoneNumberHandler, der er den centrale klasse. Hvis du har spørgsmål til de andre filer/klasser besvarer jeg gerne dem først.
Du skal ikke bruge \n, brug altid: String CR = System.getProperty("line.separator"); og smid CR ind hvor du vil have linieskift, så kører det på alle platforme.
Som tidligere nævnt er det oversættelsen fra xml til Java objekt der er det svære. Heldigvis foregår selve læsningen af xml kildeteksten automatisk, herunder checkes om syntaksen er iorden. Den ansvarlige for læsninger er en XMLReader: XMLReader xr = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); Denne reader læser den xml kilde som den får her: xr.parse( new InputSource( new FileInputStream( "phoneNumber" ) ) ); parse metoden læser så kildeteksten igennem og splitter den op i start tags "<code>", content "45" og end tags "</code>" og lignenden for resten af dokumentet. XMLReader'en ved ikke hvad den skal gøre med disse hvorfor man skal registrere en handler der så får besked af XMLReaderen når den har læst en af de tre typer. Handleren instantieres med PhoneNumberHandler handler = new PhoneNumberHandler( xr ); og registrere hos XMLReader'en med xr.setContentHandler( handler ); Dette gøres selvsagt før parse metoden kaldes. Når XMLReaderen har læst en start tag kalder den handlerens startElement metode (det kaldes callback), når den har læst en end tag kalder den endElement og for content kalder den characters. De tre metoder skal så defineres i ens handler som i tilfældet med PhoneNumberHandler. Det er ofte tilfældet at startElement ikke skal gøre noget overhovedet (for simple tilfælde). characters skal ikke gøre andet end at smide content i en buffer der så læses når end tag er læst og endElement kaldes. I tilfældet med <code> forventer vi at der ligger et tal der beskriver landekode og vi parser derfor med linien: code = Integer.parseInt( contents.toString().trim() ); Vi kalder trim metoden fordi mellemrum kan give problemer med parsing til tal. Det samme sker for telefonnummeret. I begge tilfælde gemmes det læste i en int variabel så det kan bruges når vi senere skal konstruere en instans af PhoneNumber. Når man læser den endelige end tag </phonenumber> ved vi at det er det sidste der er at læse. Derfor instantierer den et PhoneNumber og lægger det i en variabel. Denne variable kan ekstraheres fra handleren med metode kaldet: PhoneNumber phoneNumber = handler.getPhoneNumber(); Til slut et par kommentarer. Handleren er simplificeret idet den ikke checker for om der overhovedet er læst værdier for landekode og telefonnummer, og om de giver mening. For at holde koden kort og overskuelig er disse fejlchecks udeladt, de vil normalt være at finde i god kode. Send dine yderligere spørgsmål så skal jeg sende yderligere kommentarer. PS Et element i xml er "<code>123</code>" hvorfor metoderne naturligt hedder start/endElement.
Jeg siger tak foreløbigt... Jeg vil lege lidt med det og se... Vender tilbage hvis der er yderligere...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.