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;
12 * Class for handling specifics of parsing Gpx files
14 public class GpxHandler extends XmlHandler
16 private boolean _insideWaypoint = false;
17 private boolean _insideName = false;
18 private boolean _insideElevation = false;
19 private boolean _insideTime = false;
20 // private boolean _insideType = false;
21 private boolean _startSegment = true;
22 private String _name = null, _latitude = null, _longitude = null;
23 private String _elevation = null;
24 private String _time = null;
25 // private String _type = null;
26 private ArrayList<String[]> _pointList = new ArrayList<String[]>();
28 // FIXME: Read waypoint type too
31 * Receive the start of a tag
32 * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
34 public void startElement(String uri, String localName, String qName,
35 Attributes attributes) throws SAXException
37 // Read the parameters for waypoints and track points
38 if (qName.equalsIgnoreCase("wpt") || qName.equalsIgnoreCase("trkpt"))
40 _insideWaypoint = qName.equalsIgnoreCase("wpt");
41 int numAttributes = attributes.getLength();
42 for (int i=0; i<numAttributes; i++)
44 String att = attributes.getQName(i);
45 if (att.equals("lat")) {_latitude = attributes.getValue(i);}
46 else if (att.equals("lon")) {_longitude = attributes.getValue(i);}
52 else if (qName.equalsIgnoreCase("ele"))
54 _insideElevation = true;
56 else if (qName.equalsIgnoreCase("name"))
60 else if (qName.equalsIgnoreCase("time"))
64 // else if (qName.equalsIgnoreCase("type"))
66 // _insideType = true;
68 else if (qName.equalsIgnoreCase("trkseg"))
72 super.startElement(uri, localName, qName, attributes);
78 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
80 public void endElement(String uri, String localName, String qName)
83 if (qName.equalsIgnoreCase("wpt") || qName.equalsIgnoreCase("trkpt"))
87 else if (qName.equalsIgnoreCase("ele"))
89 _insideElevation = false;
91 else if (qName.equalsIgnoreCase("name"))
95 else if (qName.equalsIgnoreCase("time"))
99 super.endElement(uri, localName, qName);
104 * Process character text (inside tags or between them)
105 * @see org.xml.sax.ContentHandler#characters(char[], int, int)
107 public void characters(char[] ch, int start, int length)
110 String value = new String(ch, start, length);
111 if (_insideName && _insideWaypoint) {_name = checkCharacters(_name, value);}
112 else if (_insideElevation) {_elevation = checkCharacters(_elevation, value);}
113 else if (_insideTime) {_time = checkCharacters(_time, value);}
114 super.characters(ch, start, length);
119 * Check to concatenate partially-received values, if necessary
120 * @param inVariable variable containing characters received until now
121 * @param inValue new value received
122 * @return concatenation
124 private static String checkCharacters(String inVariable, String inValue)
126 if (inVariable == null) {return inValue;}
127 return inVariable + inValue;
132 * Process a point, either a waypoint or track point
134 private void processPoint()
136 // Put the values into a String array matching the order in getFieldArray()
137 String[] values = new String[6];
138 values[0] = _latitude; values[1] = _longitude;
139 values[2] = _elevation; values[3] = _name;
141 if (_startSegment && !_insideWaypoint) {
143 _startSegment = false;
145 _pointList.add(values);
150 * @see tim.prune.load.xml.XmlHandler#getFieldArray()
152 public Field[] getFieldArray()
154 final Field[] fields = {Field.LATITUDE, Field.LONGITUDE, Field.ALTITUDE,
155 Field.WAYPT_NAME, Field.TIMESTAMP, Field.NEW_SEGMENT};
161 * Return the parsed information as a 2d array
162 * @see tim.prune.load.xml.XmlHandler#getDataArray()
164 public String[][] getDataArray()
166 int numPoints = _pointList.size();
167 // construct data array
168 String[][] result = new String[numPoints][];
169 for (int i=0; i<numPoints; i++)
171 result[i] = _pointList.get(i);