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 KMLImporter implements Importer { private static String TAG = "KMLImporter"; private Uri data; public KMLImporter(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{ PlacemarkHandler placemark_handler = new PlacemarkHandler(); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader reader = sp.getXMLReader(); reader.setContentHandler(placemark_handler); reader.parse(data.toString()); return placemark_handler.getPoints(); } private class PlacemarkHandler extends DefaultHandler{ static final String KML_NS = "http://www.opengis.net/kml/2.2"; private List<Point> points; private StringBuilder name; private StringBuilder coordinates; private boolean in_name = false; private boolean in_corrdinates = false; public PlacemarkHandler(){ 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]); } } else if (in_corrdinates){ for (int i = 0; i < length; i++) { this.coordinates.append(ch[start + i]); } } } @Override public void endElement(String uri, String localName, String name) throws SAXException { if(uri.equals(KML_NS) && localName.equals("name")){ in_name = false; } else if(uri.equals(KML_NS) && localName.equals("coordinates")){ in_corrdinates = false; } else if(uri.equals(KML_NS) && localName.equals("Placemark")){ String point_name = this.name.toString(); String[] coordinates = this.coordinates.toString().split(","); double longitude = Double.parseDouble(coordinates[0]); double latitude = Double.parseDouble(coordinates[1]); 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(uri.equals(KML_NS) && localName.equals("name")){ in_name = true; } else if(uri.equals(KML_NS) && localName.equals("coordinates")){ in_corrdinates = true; } else if(uri.equals(KML_NS) && localName.equals("Placemark")){ this.name = new StringBuilder(); this.coordinates = new StringBuilder(); } } } }