2009-07-16 7 views

risposta

7

Creerai la tua libreria, ma non scriverai alcun codice.

Suggerisco di guardare http://code.google.com/apis/kml/documentation/kmlreference.html. Da lì è possibile ottenere il XML Schema. Una volta ottenuto lo schema, è possibile utilizzare JAXB per generare un albero di oggetti per analizzare e scrivere facilmente KML.

This may also be a good resource, sembra che qualcun altro l'abbia già fatto!

+1

Sono andato su questa strada per un po 'di pratica, c'è un piccolo inconveniente nel fatto che ci sono un paio di elementi che si scontrano quando lo schema viene eseguito attraverso il compilatore. Niente di importante, ma sii pronto a scrivere alcuni binding personalizzati. – CurtainDog

1

Dal momento che è XML è possibile leggere i dati con qualsiasi parser, ma ancora non v'è un lib disponibile presso http://code.google.com/p/libkml/ ha binding per Java, ma il lib è in C++

1

Ecco la mia implementazione JSOUP spero che aiuta

public ArrayList<ArrayList<LatLng>> getCoordinateArrays() { 
    ArrayList<ArrayList<LatLng>> allTracks = new ArrayList<ArrayList<LatLng>>(); 

    try { 
     StringBuilder buf = new StringBuilder(); 
     InputStream json = MyApplication.getInstance().getAssets().open("track.kml"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(json)); 
     String str; 
         String buffer; 
     while ((str = in.readLine()) != null) { 
      buf.append(str); 
     } 

     in.close(); 
     String html = buf.toString(); 
     Document doc = Jsoup.parse(html, "", Parser.xmlParser()); 
     ArrayList<String> tracksString = new ArrayList<String>(); 
     for (Element e : doc.select("coordinates")) { 
      tracksString.add(e.toString().replace("<coordinates>", "").replace("</coordinates>", "")); 
     } 

     for (int i = 0; i < tracksString.size(); i++) { 
      ArrayList<LatLng> oneTrack = new ArrayList<LatLng>(); 
      ArrayList<String> oneTrackString = new ArrayList<String>(Arrays.asList(tracksString.get(i).split("\\s+"))); 
      for (int k = 1; k < oneTrackString.size(); k++) { 
       LatLng latLng = new LatLng(Double.parseDouble(oneTrackString.get(k).split(",")[0]), 
         Double.parseDouble(oneTrackString.get(k).split(",")[1])); 
       oneTrack.add(latLng); 
      } 
      allTracks.add(oneTrack); 
     }} 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return allTracks; 
} 
0

se si utilizza Android Studio :)

dependencies { 
    compile 'org.jsoup:jsoup:1.8.1' 
} 


     // find a way to read the file and store it in a string 

     String inputFileContents = ""; 
     String xmlContent = inputFileContents; 
     Document doc = Jsoup.parse(xml, "", Parser.xmlParser()); 

     for(Element e : doc.select("LineString").select("coordinates")) { 
      // the contents 
      System.out.println(e.text()); 
     } 

È possibile avere più chiamate di metodo select(). Ho semplificato il codice per:

Element e = doc.select("LineString").select("coordinates").first(); 
+0

Errore: (20, 29) java: nessun metodo adatto trovato per parse (org.jsoup.nodes.Document.OutputSettings.Syntax, java.lang.String, org.jsoup.parser.Parser) metodo org.jsoup.Jsoup .parse (java.lang.String, java.lang.String, org.jsoup.parser.Parser) non è applicabile (argomento non corrispondente; org.jsoup.nodes.Document.OutputSettings.Syntax non può essere convertito in java.lang. String) metodo – user3871754

+0

le mie importazioni: import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.parser.Parser; import static org.jsoup.nodes.Document.OutputSettings.Syntax.xml; – user3871754

1

Si tratta di altre opzioni, il file KML è un normale file, che contengono la struttura del file xml. Questo è altro esempio, per la ricerca un segnaposto specifico nel file molteplici segnaposto

private static void readKML(InputStream fileKML, String nameCoordinates) { 
    String column = null; 
    Boolean folder = Boolean.TRUE; 
    Boolean placemark = Boolean.FALSE; 
    Boolean placeCorrect = Boolean.FALSE; 
    BufferedReader br = new BufferedReader(new InputStreamReader(fileKML)); 
    try { 
     while ((column = br.readLine()) != null) { 
      if (folder) { 
       int ifolder = column.indexOf("<Folder>"); 
       if (ifolder != -1) { 
        folder = Boolean.FALSE; 
        placemark = Boolean.TRUE; 
        continue; 
       } 
      } 
      if (placemark) { 
       String tmpLine = nameCoordinates; 
       tmpLine = tmpLine.replaceAll("\t", ""); 
       tmpLine = tmpLine.replaceAll(" ", ""); 
       String tmpColumn = column; 
       tmpColumn = tmpColumn.replaceAll("\t", ""); 
       tmpColumn = tmpColumn.replaceAll(" ", ""); 
       int name = tmpColumn.indexOf(tmpLine); 
       if (name != -1) { 
        placemark = Boolean.FALSE; 
        placeCorrect = Boolean.TRUE; 
        continue; 
       } 
      } 
      if (placeCorrect) { 
       int coordin = column.indexOf("<coordinates>"); 
       if (coordin != -1) { 
        String tmpCoordin = column; 
        tmpCoordin = tmpCoordin.replaceAll(" ", ""); 
        tmpCoordin = tmpCoordin.replaceAll("\t", ""); 
        tmpCoordin = tmpCoordin.replaceAll("<coordinates>", ""); 
        tmpCoordin = tmpCoordin 
          .replaceAll("</coordinates>", ""); 
        String[] coo = tmpCoordin.split(","); 
        System.out.println("LONG: "+coo[0]); 
        System.out.println("LATI: "+coo[1]) 
        break; 
       } 
      } 

     } 
     br.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return cresp; 
} 
+0

manca il punto e virgola: System.out.println ("LATI:" + coo [1]) – user3871754