package net.armooo.locationlog.importer; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import android.net.Uri; import android.util.Log; public class LOCImporter implements Importer { private static String TAG = "LOCImporter"; private Uri data; public LOCImporter(Uri data){ this.data = data; } @Override public List<Point> getPoints() { try { return parseXML(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } private List<Point> parseXML() throws SAXException, IOException, ParserConfigurationException{ WaypointHandler waypoint_handler = new WaypointHandler(); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader reader = sp.getXMLReader(); reader.setContentHandler(waypoint_handler); reader.parse(data.toString()); return waypoint_handler.getPoints(); } private class WaypointHandler extends DefaultHandler{ private List<Point> points; private StringBuilder name; private String lat; private String lon; private boolean in_name = false; public WaypointHandler(){ points = new ArrayList<Point>(); } public List<Point> getPoints(){ return points; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (in_name){ for (int i = 0; i < length; i++) { this.name.append(ch[start + i]); } } } @Override public void endElement(String uri, String localName, String name) throws SAXException { if(localName.equals("name")){ in_name = false; } else if(localName.equals("waypoint")){ String point_name = this.name.toString(); double longitude = Double.parseDouble(lon); double latitude = Double.parseDouble(lat); Log.d(TAG, "Add point " + point_name); points.add(new Point(point_name, latitude, longitude)); } } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if(localName.equals("name")){ in_name = true; } else if (localName.equals("coord")){ lat = attributes.getValue("", "lat"); lon = attributes.getValue("", "lon"); } else if(localName.equals("waypoint")){ this.name = new StringBuilder(); } } } }