1 package tim.prune.load.xml;
3 import java.util.ArrayList;
5 import org.xml.sax.Attributes;
6 import org.xml.sax.SAXException;
8 import tim.prune.data.Field;
9 import tim.prune.load.TrackNameList;
13 * Class for handling specifics of parsing Gpx files
15 public class GpxHandler extends XmlHandler
17 private boolean _insidePoint = false;
18 private boolean _insideWaypoint = false;
19 private boolean _insideName = false;
20 private boolean _insideElevation = false;
21 private boolean _insideTime = false;
22 private boolean _insideType = false;
23 private boolean _startSegment = true;
24 private boolean _isTrackPoint = false;
25 private int _trackNum = -1;
26 private String _trackName = null;
27 private String _name = null, _latitude = null, _longitude = null;
28 private String _elevation = null;
29 private String _time = null;
30 private String _type = null;
31 private ArrayList<String[]> _pointList = new ArrayList<String[]>();
32 private TrackNameList _trackNameList = new TrackNameList();
36 * Receive the start of a tag
37 * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
39 public void startElement(String uri, String localName, String qName,
40 Attributes attributes) throws SAXException
42 // Read the parameters for waypoints and track points
43 if (qName.equalsIgnoreCase("wpt") || qName.equalsIgnoreCase("trkpt") || qName.equalsIgnoreCase("rtept"))
46 _insideWaypoint = qName.equalsIgnoreCase("wpt");
47 _isTrackPoint = qName.equalsIgnoreCase("trkpt");
48 int numAttributes = attributes.getLength();
49 for (int i=0; i<numAttributes; i++)
51 String att = attributes.getQName(i);
52 if (att.equals("lat")) {_latitude = attributes.getValue(i);}
53 else if (att.equals("lon")) {_longitude = attributes.getValue(i);}
60 else if (qName.equalsIgnoreCase("ele"))
62 _insideElevation = true;
64 else if (qName.equalsIgnoreCase("name"))
69 else if (qName.equalsIgnoreCase("time"))
73 else if (qName.equalsIgnoreCase("type"))
77 else if (qName.equalsIgnoreCase("trkseg"))
81 else if (qName.equalsIgnoreCase("trk"))
86 super.startElement(uri, localName, qName, attributes);
92 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
94 public void endElement(String uri, String localName, String qName)
97 if (qName.equalsIgnoreCase("wpt") || qName.equalsIgnoreCase("trkpt") || qName.equalsIgnoreCase("rtept"))
100 _insidePoint = false;
102 else if (qName.equalsIgnoreCase("ele"))
104 _insideElevation = false;
106 else if (qName.equalsIgnoreCase("name"))
110 else if (qName.equalsIgnoreCase("time"))
114 else if (qName.equalsIgnoreCase("type"))
118 super.endElement(uri, localName, qName);
123 * Process character text (inside tags or between them)
124 * @see org.xml.sax.ContentHandler#characters(char[], int, int)
126 public void characters(char[] ch, int start, int length)
129 String value = new String(ch, start, length);
130 if (_insideName && _insideWaypoint) {_name = checkCharacters(_name, value);}
131 if (_insideName && !_insidePoint) {_trackName = checkCharacters(_trackName, value);}
132 else if (_insideElevation) {_elevation = checkCharacters(_elevation, value);}
133 else if (_insideTime) {_time = checkCharacters(_time, value);}
134 else if (_insideType) {_type = checkCharacters(_type, value);}
135 super.characters(ch, start, length);
140 * Check to concatenate partially-received values, if necessary
141 * @param inVariable variable containing characters received until now
142 * @param inValue new value received
143 * @return concatenation
145 private static String checkCharacters(String inVariable, String inValue)
147 if (inVariable == null) {return inValue;}
148 return inVariable + inValue;
153 * Process a point, either a waypoint or track point
155 private void processPoint()
157 // Put the values into a String array matching the order in getFieldArray()
158 String[] values = new String[7];
159 values[0] = _latitude; values[1] = _longitude;
160 values[2] = _elevation; values[3] = _name;
162 if (_startSegment && !_insideWaypoint) {
164 _startSegment = false;
167 _pointList.add(values);
168 _trackNameList.addPoint(_trackNum, _trackName, _isTrackPoint);
173 * @see tim.prune.load.xml.XmlHandler#getFieldArray()
175 public Field[] getFieldArray()
177 final Field[] fields = {Field.LATITUDE, Field.LONGITUDE, Field.ALTITUDE,
178 Field.WAYPT_NAME, Field.TIMESTAMP, Field.NEW_SEGMENT, Field.WAYPT_TYPE};
184 * Return the parsed information as a 2d array
185 * @see tim.prune.load.xml.XmlHandler#getDataArray()
187 public String[][] getDataArray()
189 int numPoints = _pointList.size();
190 // construct data array
191 String[][] result = new String[numPoints][];
192 for (int i=0; i<numPoints; i++)
194 result[i] = _pointList.get(i);
201 * @return track name list
203 public TrackNameList getTrackNameList() {
204 return _trackNameList;