2012-06-01 6 views
2

Я следовал учебнику, чтобы научиться разбирать данные из файла gpx (который находится в моей исходной папке), и по какой-то причине данные не обрабатываются в NodeList. Вот мой класс XMLParserAndroid: нужна помощь в анализе данных из файла .GPX

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. Нет данных в нодлисте». отображается.

ответ

1

Существует несколько полезных библиотек - включая мой. См. Ответ на вопрос this other question on 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

Эта открытая библиотека источника в настоящее время используется в Android App, как смартфон стороны и SmartWatch стороны, а

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()) ; 
} 
Смежные вопросы