04. maj 2003 - 17:55Der er
16 kommentarer og 1 løsning
En enkel og simpel XML parser i Java
Hvordan laver man en meget simpel XML parser ? Nogen der har nogen korte og "konceptuelle" eksempler ?, således jeg blot kan se tankegangen i det, de skal være langt fra komplette.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Hvordan er det sammenlignet med dit? Jeg mener din kode ser noget mere ren ud, jeg kan ikke rigtig gennemskue om det er fordi dit kode kan noget mindre eller det bare er fordi det er smartere lavet...
Jeg har ikke kigget på hans kode, men jeg tror følgende citater forklarer:
This tip shows you how to parse XML when running in an applet or other space-restricted environment, such as a J2ME (Java 2 Platform, Micro Edition) application. The process limits functionality in a way that many small applications can accept.
Unfortunately, many Java-based XML parsers are very large; for example, Sun Microsystems' jaxp.jar and parser.jar libraries are 1.4 MB each. If you are running with limited memory (for example, in a J2ME (Java 2 Platform, Micro Edition) environment), or bandwidth is at a premium (for example, in an applet), using those large parsers might not be a viable solution.
The QDParser class occupies around 3 KB after you compile and pack it into a jar file. The source code itself, with comments, is just over 300 lines. This should be small enough for most space-constrained applications, and retain enough of the XML specification to enjoy most of its useful features.
Hans kode er noget simpelt kode beregnet til at køre i "små" sammenhænge.
Mn kode bruger standard XML libraries.
Enhver der har J2SE 1.4 eller nyere, enhver der har J2SE 1.2 eller 1.3 og har downloadet Crimson eller Xerces kan køre min kode.
Så medmindre du har specielle krav (skal køre på mobil-telefon eller i applet), så vil jeg helt klart anbefale at gøre det på standard måden.
Så skal du bare vælge om du vil bruge DOM eller SAX.
DOM læser hele XML dokumentet op i memory. Fordele: du kan køre frem og tilbage og hoppe rundt, du kan tilføje og fjerne elementer. Ulemper: memory forbrug = 2-5 gange XML fil størrelse.
SAX læser XML dokumentet igennem sekventielt. Fordele: hurtigt, bruger ikke ret meget memeory. Ulemper: det er kun sekventiel adgang til tags, koden kan godt blive lidt messy.
hmmm, jeg tror du har ret mht at det kodeeksempel jeg har fundet er ret specialiseret. En anden ting: hvordan skal man forstå argumenterne til startelement: String namespaceURI, String localName, String rawName, Attributes atts)
Mere konkret, hvordan ville du oprette et Dimension objekt ud fra følgende xml fil ?
<?xml version="1.0"?> <config> <dimension y = "50" x="50"/> </config>
Du kan bruge atts.getValue("x") og atts.getValue("y") til at hente 50 og 50 med.
Namespace er noget man kan bruge til at have forskellige tags med samme navn bare i forskelligt namespace (ligesom man i Java kan have flere klasse med samme navn i forskellige packages).
class MySaxParser2 extends DefaultHandler { private StringBuffer element = new StringBuffer(); private Element elmobj; private ArrayList result; public MySaxParser2(ArrayList result) { this.result = result; } public void characters(char buf[], int offset, int len) throws SAXException { element.append(new String(buf, offset, len)); return; } public void startElement( String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException { if (rawName.equals("element")) { elmobj = new Element(); elmobj.setInclude(Boolean.valueOf(atts.getValue("include")).booleanValue()); } if (rawName.equals("nbr")) { element = new StringBuffer(); } if (rawName.equals("name")) { element = new StringBuffer(); } return; } public void endElement( String namespaceURI, String localName, String rawName) throws SAXException { if (rawName.equals("element")) { result.add(elmobj); } if (rawName.equals("nbr")) { elmobj.setNbr(Integer.parseInt(element.toString())); } if (rawName.equals("name")) { elmobj.setName(element.toString()); } return; } }
class Element { private int nbr; private String name; private boolean include; public Element() { nbr = 0; name = null; include = false; } public Element(int nbr, String name, boolean include) { this.nbr = nbr; this.name = name; this.include = include; } public int getNbr() { return nbr; } public String getName() { return name; } public boolean isInclude() { return include; } public void setNbr(int nbr) { this.nbr = nbr; } public void setName(String name) { this.name = name; } public void setInclude(boolean b) { include = b; } public String toString() { return ("[" + nbr + "," + name + "," + include + "]"); } }
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.