X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fload%2Fxml%2FKmlHandler.java;fp=tim%2Fprune%2Fload%2Fxml%2FKmlHandler.java;h=09706390c03b59506781f11da5570f3f8d051bd9;hb=5625a1abadb5f2ca5f017fe7dbda1d5141cb637b;hp=0000000000000000000000000000000000000000;hpb=23959e65a6a0d581e657b07186d18b7a1ac5afeb;p=GpsPrune.git diff --git a/tim/prune/load/xml/KmlHandler.java b/tim/prune/load/xml/KmlHandler.java new file mode 100644 index 0000000..0970639 --- /dev/null +++ b/tim/prune/load/xml/KmlHandler.java @@ -0,0 +1,150 @@ +package tim.prune.load.xml; + +import java.util.ArrayList; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +import tim.prune.data.Field; + + +/** + * Class for handling specifics of parsing Kml files + */ +public class KmlHandler extends XmlHandler +{ + private boolean _insidePlacemark = false; + private boolean _insideName = false; + private boolean _insideCoordinates = false; + private String _name = null; + private StringBuffer _coordinates = null; + private ArrayList _pointList = new ArrayList(); + + + /** + * Receive the start of a tag + * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) + */ + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException + { + String tagName = localName; + if (tagName == null || tagName.equals("")) {tagName = qName;} + if (tagName.equalsIgnoreCase("Placemark")) _insidePlacemark = true; + else if (tagName.equalsIgnoreCase("coordinates")) {_insideCoordinates = true; _coordinates = null;} + else if (tagName.equalsIgnoreCase("name")) {_insideName = true; _name = null;} + super.startElement(uri, localName, qName, attributes); + } + + + /** + * Process end tag + * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) + */ + public void endElement(String uri, String localName, String qName) + throws SAXException + { + String tagName = localName; + if (tagName == null || tagName.equals("")) {tagName = qName;} + if (tagName.equalsIgnoreCase("Placemark")) + { + processPlacemark(); + _insidePlacemark = false; + } + else if (tagName.equalsIgnoreCase("coordinates")) _insideCoordinates = false; + else if (tagName.equalsIgnoreCase("name")) _insideName = false; + super.endElement(uri, localName, qName); + } + + + /** + * Process character text (inside tags or between them) + * @see org.xml.sax.ContentHandler#characters(char[], int, int) + */ + public void characters(char[] ch, int start, int length) + throws SAXException + { + if (_insidePlacemark && (_insideName || _insideCoordinates)) + { + String value = new String(ch, start, length); + if (_insideName) {_name = value;} + else if (_insideCoordinates) + { + if (_coordinates == null) + { + _coordinates = new StringBuffer(); + } + _coordinates.append(value); + } + } + super.characters(ch, start, length); + } + + + /** + * Process a placemark entry, either a single waypoint or a whole track + */ + private void processPlacemark() + { + if (_coordinates == null) return; + String allCoords = _coordinates.toString(); + String[] coordArray = allCoords.split("[ \n]"); + int numPoints = coordArray.length; + if (numPoints == 1) + { + // Add single waypoint to list + _pointList.add(makeStringArray(allCoords, _name)); + } + else if (numPoints > 1) + { + // Add each of the unnamed track points to list + for (int p=0; p