3

I followed a tutorial to learn to parse the data from the gpx file (which is in my raw folder), and for some reason no data is getting parsed into the NodeList. Here is my XMLParser class

package bry.Bicker.OjaiHiking;

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.util.Log;

public class XMLParser {

public Document getDomElement(String xml) {
    Document doc = null;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {

        DocumentBuilder db = dbf.newDocumentBuilder();

        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(xml));
        doc = db.parse(is);

    } catch (ParserConfigurationException e) {
        Log.e("Error: ", e.getMessage());
        return null;
    } catch (SAXException e) {
        Log.e("Error: ", e.getMessage());
        return null;
    } catch (IOException e) {
        Log.e("Error: ", e.getMessage());
        return null;
    }
    // return DOM
    return doc;
}

public String getValue(Element e, String str) {
    NodeList n = e.getElementsByTagName(str);
    return this.getElementValue(n.item(0));
}

public final String getElementValue(Node elem) {
    Node child;
    if (elem != null) {
        if (elem.hasChildNodes()) {
            for (child = elem.getFirstChild(); child != null; child = child
                    .getNextSibling()) {
                if (child.getNodeType() == Node.TEXT_NODE) {
                    return child.getNodeValue();
                }
            }
        }
    }
    return "";
}

}

Here is how I am attempting to use the class to parse the file:

public void displayPoints(MapView map, Context context) {
    final String KEY_TRKPT = "trkpt";
    final String KEY_LAT = "lat";
    final String KEY_LON = "lon";

    XMLParser parser = new XMLParser();
    Document doc = parser.getDomElement(getString(R.raw.test));

    NodeList n1 = doc.getElementsByTagName(KEY_TRKPT);

    if (n1.getLength() > 0) {
        int[] lat = new int[n1.getLength()];
        int[] lon = new int[n1.getLength()];

        for (int i = 0; i < n1.getLength(); i++) {
            org.w3c.dom.Element e = (org.w3c.dom.Element) n1.item(i);
            lat[i] = Integer.parseInt(parser.getValue(e, KEY_LAT));
            lon[i] = Integer.parseInt(parser.getValue(e, KEY_LON));
        }
    } else {
        Log.i("Debug", "XML Parsing error. No data in nodelist.");
    }
}

and the GPX file was exported from the application "MyTracks."

I get no errors, but my message that states "XML Parsing error. No data in nodelist." is displayed.

Brian Ecker
  • 2,017
  • 1
  • 21
  • 30

2 Answers2

2

There are a few useful libraries out there - including mine. See answer to this other question on StackOverflow. Basically my library provides two ways to parse you GPX file: once you obtain / create a GPXParser object (mParser in the examples below), you can then either parse directly your GPX file

Gpx parsedGpx = null;
try {
    InputStream in = getAssets().open("test.gpx");
    parsedGpx = mParser.parse(in);
} catch (IOException | XmlPullParserException e) {
    e.printStackTrace();
}
if (parsedGpx == null) {
    // error parsing track
} else {
    // do something with the parsed track
}

or you can parse a remote file:

mParser.parse("http://myserver.com/track.gpx", new GpxFetchedAndParsed() {
    @Override
    public void onGpxFetchedAndParsed(Gpx gpx) {
        if (gpx == null) {
            // error parsing track
        } else {
            // do something with the parsed track
        }
    }
});

Contributions are welcome.

Community
  • 1
  • 1
ticofab
  • 7,551
  • 13
  • 49
  • 90
0

This open source library is currently being used in an android app, both smartphone side and smartwatch side as well

https://plus.google.com/u/0/communities/110606810455751902142

Usage example

Gpx gpx = GpxFileIo.parseIn( "SomeGeoCollection.gpx" ) ;

for (Point pt: gpx.getPoints( ) )
{
    Location loc = new Location( pt.getLatitude( ), pt.getLongitude( ) ) ;
    if (pt.getElevation( ) != null) loc.setElevation( pt.getElevation( ) ) ;
}
Afonso Santos
  • 179
  • 1
  • 4