X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2FGetWikipediaXmlHandler.java;fp=src%2Ftim%2Fprune%2Ffunction%2FGetWikipediaXmlHandler.java;h=b5cb3f920f7533de8474dbf7e4466c1a78b4ba82;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/GetWikipediaXmlHandler.java b/src/tim/prune/function/GetWikipediaXmlHandler.java new file mode 100644 index 0000000..b5cb3f9 --- /dev/null +++ b/src/tim/prune/function/GetWikipediaXmlHandler.java @@ -0,0 +1,101 @@ +package tim.prune.function; + +import java.util.ArrayList; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import tim.prune.function.search.SearchResult; + +/** + * XML handler for dealing with XML returned from the geonames api, + * both from the search by name and search by location + */ +public class GetWikipediaXmlHandler extends DefaultHandler +{ + private String _value = null; + private ArrayList _trackList = null; + private SearchResult _track = null; + private String _errorMessage = null; + + + /** + * React to the start of an XML tag + */ + public void startElement(String inUri, String inLocalName, String inTagName, + Attributes inAttributes) throws SAXException + { + if (inTagName.equals("geonames")) { + _trackList = new ArrayList(); + } + else if (inTagName.equals("entry")) { + _track = new SearchResult(); + } + else if (inTagName.equals("status")) { + _errorMessage = inAttributes.getValue("message"); + } + else _value = null; + super.startElement(inUri, inLocalName, inTagName, inAttributes); + } + + /** + * React to the end of an XML tag + */ + public void endElement(String inUri, String inLocalName, String inTagName) + throws SAXException + { + if (inTagName.equals("entry")) { + // end of the entry + _trackList.add(_track); + } + else if (inTagName.equals("title")) { + _track.setTrackName(_value); + } + else if (inTagName.equals("summary")) { + _track.setDescription(_value); + } + else if (inTagName.equals("lat")) { + _track.setLatitude(_value); + } + else if (inTagName.equals("lng")) { + _track.setLongitude(_value); + } + else if (inTagName.equals("distance")) { + try { + _track.setLength(Double.parseDouble(_value) * 1000.0); // convert from km to m + } + catch (NumberFormatException nfe) {} + } + else if (inTagName.equals("wikipediaUrl")) { + _track.setWebUrl(_value.replaceFirst("http://", "https://")); + } + super.endElement(inUri, inLocalName, inTagName); + } + + /** + * React to characters received inside tags + */ + public void characters(char[] inCh, int inStart, int inLength) + throws SAXException + { + String value = new String(inCh, inStart, inLength); + _value = (_value==null?value:_value+value); + super.characters(inCh, inStart, inLength); + } + + /** + * @return the list of tracks + */ + public ArrayList getTrackList() + { + return _trackList; + } + + /** + * @return error message, if any + */ + public String getErrorMessage() { + return _errorMessage; + } +}