How to parse XML without 3rd party library with Java? -
i trying build xml parser myself(actually gpx parser).
some questions popped head while writing code.
- should store tags static variables? : there standard document gpx, , seems using limited kinds of tags, want build code more flexible.
- how build tree structure, while reading file line line. have try use recursive search file explorer, case little bit harder.
some of code below.
public class gpxfileparser extends abstractfileparser { private volatile file gpxfile; boolean iscoredate = false; private static final string xml_opener = "<"; private static final string xml_closer = "</"; private static final string xml_end = ">"; private static final string attr = "="; private static final string space = " "; map<string, object> mapdata; public gpxfileparser() { mapdata = new hashmap<string, object>(); } public gpxfileparser(string filepath) { gpxfile = new file(filepath); if(gpxfile.exists() && gpxfile.isfile()){ if(!gpxfile.canexecute()) gpxfile.setexecutable(true); } mapdata = new hashmap<string, object>(); } private string getxmlkey(string line) { string temp = ""; if(line.contains(xml_opener)) { temp = line.substring(1, line.indexof(xml_end)); } return temp; } private string getxmlval(string key, string line) { string temp = ""; if(line.contains(xml_closer)){ line = line.substring(line.indexof(xml_end) + 1); temp = line.substring(0, line.indexof(xml_closer)); } return temp; } private list<map<string, object>> getattributeifnotnull(string key) { list<map<string, object>> ret = new arraylist<map<string,object>>(); string[] attributes = key.split(space); if(attributes.length < 2) return ret; for(int = 0; < attributes.length; i++) { map<string, object> single = new hashmap<string, object>(); string singleattribute = attributes[i]; if(!singleattribute.contains(attr)) continue; string attrkey = singleattribute.split(attr)[0]; string attrval = stringutils.removecolons(singleattribute.split(attr)[1]); single.put(attrkey, attrval); ret.add(single); } return ret; } @override public map<string, object> parse(file param) throws exception { if(gpxfile == null) gpxfile = new file(param.getabsolutepath()); bufferedreader br = new bufferedreader(new inputstreamreader(new fileinputstream(gpxfile))); string singleline = ""; boolean hassub = false; int dept = 0; while((singleline =br.readline()) != null){ hashmap<string, object> single = null; singleline = singleline.trim(); if(singleline.contains("<trk>")){iscoredate = true; }else if(singleline.contains("</trk>")){iscoredate = false;} if(iscoredate){ if(singleline.startswith(xml_closer)) continue; int opencnt = stringutils.getsubstringcnt(singleline, xml_opener); int closecnt = stringutils.getsubstringcnt(singleline, xml_closer); if(opencnt == closecnt) hassub = false; else { if(opencnt > closecnt){ hassub = true; } } single = new hashmap<string, object>(); string key = getxmlkey(singleline); system.out.println("key >> " + key); list<map<string, object>> attrlist = getattributeifnotnull(key); if(attrlist.isempty()){ string val = getxmlval(key, singleline); system.out.println("val >> " + val); single.put(key, val); }else{ key = key.split(space)[0]; single.put(key, attrlist); } if(!single.isempty()) mapdata.putall(single); } } br.close(); return mapdata; } }; i need recommendation of reference, not use 3rd party library or architect principles.
what expected tree type map, code returns 1 depth map.
{trkseg=, extensions=, gpxtpx:atemp=18.0, name=awesome riding, trkpt=[{lon=126.29451882094145}, {lat=33.443800024688244}], time=2015-05-01t21:55:10.000z, gpxtpx:trackpointextension=, gpxtpx:cad=49, trk=} thanks reviewing code , answers :d
p.s. original data is...
<?xml version="1.0" encoding="utf-8"?> <gpx version="1.1" creator="garmin connect" xsi:schemalocation="http://www.topografix.com/gpx/1/1 http://www.topografix.com/gpx/1/1/gpx.xsd http://www.garmin.com/xmlschemas/gpxextensions/v3 http://www.garmin.com/xmlschemas/gpxextensionsv3.xsd http://www.garmin.com/xmlschemas/trackpointextension/v1 http://www.garmin.com/xmlschemas/trackpointextensionv1.xsd" xmlns="http://www.topografix.com/gpx/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/trackpointextension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/gpxextensions/v3" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <metadata> <link href="connect.garmin.com"> <text>garmin connect</text> </link> <time>2015-05-01t21:51:42.000z</time> </metadata> <trk> <name>awesome riding!</name> <trkseg> <trkpt lon="126.28584556281567" lat="33.4417990129441"> <time>2015-05-01t21:51:42.000z</time> </trkpt> <trkpt lon="126.28585444763303" lat="33.441797671839595"> <time>2015-05-01t21:51:43.000z</time> </trkpt> <trkpt lon="126.28589048981667" lat="33.441788451746106"> <time>2015-05-01t21:51:44.000z</time> </trkpt> <trkpt lon="126.28591739572585" lat="33.44177604652941"> <time>2015-05-01t21:51:45.000z</time> </trkpt> <trkpt lon="126.28594572655857" lat="33.44176380895078"> <time>2015-05-01t21:51:46.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28597606904805" lat="33.44175492413342"> <time>2015-05-01t21:51:47.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28600666299462" lat="33.441743860021234"> <time>2015-05-01t21:51:48.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>27</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28603314980865" lat="33.441728772595525"> <time>2015-05-01t21:51:49.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>0</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28606181591749" lat="33.44171678647399"> <time>2015-05-01t21:51:50.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>0</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28608050756156" lat="33.4416954126209"> <time>2015-05-01t21:51:51.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>0</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.2860903982073" lat="33.441674122586846"> <time>2015-05-01t21:51:52.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>0</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28609601408243" lat="33.44165383838117"> <time>2015-05-01t21:51:53.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>0</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.2860840279609" lat="33.441627100110054"> <time>2015-05-01t21:51:54.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>0</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.2860647495836" lat="33.44160404987633"> <time>2015-05-01t21:51:55.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>12</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28604924306273" lat="33.44158200547099"> <time>2015-05-01t21:51:56.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>24</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28602971322834" lat="33.441558703780174"> <time>2015-05-01t21:51:57.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>38</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.28601093776524" lat="33.441531378775835"> <time>2015-05-01t21:51:58.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>20.0</gpxtpx:atemp> <gpxtpx:cad>39</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.29447498358786" lat="33.44377965666354"> <time>2015-05-01t21:55:09.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>18.0</gpxtpx:atemp> <gpxtpx:cad>47</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> <trkpt lon="126.29451882094145" lat="33.443800024688244"> <time>2015-05-01t21:55:10.000z</time> <extensions> <gpxtpx:trackpointextension> <gpxtpx:atemp>18.0</gpxtpx:atemp> <gpxtpx:cad>49</gpxtpx:cad> </gpxtpx:trackpointextension> </extensions> </trkpt> </trkseg> </trk> </gpx>
Comments
Post a Comment