安卓:需要帮助解析.GPX文件中的数据

3

我按照教程学习解析gpx文件中的数据(该文件在我的raw文件夹中),但由于某种原因,没有数据被解析到NodeList中。这是我的XMLParser类:

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 "";
}

}

这是我尝试使用这个类来解析文件的方法:

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.");
    }
}

这个GPX文件是从“MyTracks”应用程序导出的。

我没有看到错误信息,但是会显示“XML解析错误。节点列表中没有数据。”的提示。

2个回答

2

有一些有用的库可供使用,包括我的库。请参见StackOverflow上这个其他问题的答案。基本上,我的库提供了两种解析GPX文件的方法:一旦您获得/创建了一个GPXParser对象(在下面的示例中为mParser),则可以直接解析您的GPX文件。

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
}

或者您可以解析远程文件:

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
        }
    }
});

欢迎贡献。

0

这个开源库目前正在一个安卓应用中使用,包括智能手机端和智能手表端。

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

使用示例

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( ) ) ;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接