2010-11-22 4 views
0

J'essaie d'extraire le contenu d'un fichier gpx. Le problème est quand j'ai utilisé getChildren ("wpt") pour obtenir le contenu de wpt tag, je n'ai rien retourné. Et quand j'ai utilisé la méthode getChildren(), j'en ai eu et plusieurs sont revenus. Et quand j'ai enlevé tout le contenu dans le seul le laisser comme, tout fonctionne bien.Impossible d'obtenir le contenu de la balise enfant avec JDOM

Le contenu de ce fichier:

<?xml version="1.0" encoding="UTF-8"?> 
    <gpx version="1.0" creator="GPSBabel- 
    http://www.gpsbabel.org" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.topografix.com/GPX/1/0" 
    xsi:schemaLocation="http://www.topografix.com/GPX/1/0 
    http://www.topografix.com/GPX/1/0/gpx.xsd"> 
      <time>2010-11-07T06:21:28Z</time> 
      <bounds minlat="40.516437500" minlon="-79.759539000" 
      maxlat="44.943992000" maxlon="-72.186828500"/> 
      <wpt lat="43.449895700" lon="-79.759539000"> 
        <name>Pharmacy</name> 
        <cmt>Pharmacy</cmt> 
        <desc>Pharmacy</desc> 
      </wpt> 
      <wpt lat="43.650977000" lon="-79.758495300"> 
       <name>Pharmacy:Walk-In Clinic</name> 
       <cmt>Pharmacy:Walk-In Clinic</cmt> 
       <desc>Pharmacy:Walk-In Clinic</desc> 
      </wpt> 
      <wpt lat="43.583929100" lon="-79.758268700"> 
       <name>Hospital:Meadowvale Professional Center</name> 
       <cmt>Hospital:Meadowvale Professional Center</cmt> 
       <desc>Hospital:Meadowvale Professional Center</desc> 
      </wpt> 
      </gpx> 

Ci-dessous mon code pour extraire le contenu:

import org.jdom.*; 
import org.jdom.input.SAXBuilder; 
import java.sql.*; 
import java.util.*; 

public class ReadXml 
{ 
    public Connection conn = null; 
    public Statement stmt = null ; 

    public void readXml() 
    { 

     try 
     { 
      Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 
      String url ="jdbc:mysql://localhost/test?user=root&password=admin";// 
        conn = DriverManager.getConnection(url); 
        stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     } 
     catch(Exception sqlexception) 
     { 
      System.out.println("connection error !"); 
     } 

     try 
     { 
      SAXBuilder sb = new SAXBuilder(); 


      Document doc = sb.build("new_york_Government_and_Public_Services.gpx"); 
      Element root = doc.getRootElement(); 
       String name = "" ,lat = "", lon = ""; 
      Element elms = null; 
       List list1 = root.getChildren("wpt"); 
      for(int i=0; i< list1.size(); i++) 
      { 
       elms = (Element)list1.get(i);   
       lat = elms.getAttributeValue("lat"); 
       lon = elms.getAttributeValue("lon"); 
       name = elms.getChildText("name"); 
       String sql = "insert into poi_test(name,lat,lon)values    ('"+name+"','"+lat+"','"+lon+"')"; 
       stmt.executeUpdate(sql); 

      }//for 

      stmt.close(); 
      conn.close(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 


    public static void main(String[] args) 
    { 
      ReadXml rx = new ReadXml(); 
        rx.readXml(); 
    } 
} 
+3

Hors sujet, mais que penses-tu du nom "Children's Hospital"? L'insertion de 'String sql =" dans les valeurs poi_test (name, lat, lon) ('' + nom + '', '' + lat + '', '' '+ lon +' ')'; '' est fragile (le '' ' dans "Children" terminera prématurément la chaîne de valeur), et sensible à l'injection SQL (combien pouvez-vous faire confiance à votre source pour le fichier gfx?). Recommandez PreparedStatement avec les paramètres '?' À la place. Recherche de "sql injection PreparedStatement" et vous trouverez beaucoup d'exemples. » –

Répondre

1

getChildren(String) JavaDoc:

Cela renvoie une liste de tous les éléments enfants imbriqués directement (un niveau de profondeur) dans cet élément avec le étant donné le nom local et n'appartenant à aucun espace de nom, renvoyé en tant qu'objets Element. Si cet élément cible n'a pas d'éléments imbriqués avec le nom donné en dehors d'un espace de noms, une liste vide est renvoyée. La liste renvoyée est "active" dans l'ordre des documents et les modifications apportées affectent le contenu réel de l'élément.

Comme votre balise wpt appartient à l'espace de noms http://www.topografix.com/GPX/1/0, la méthode getChildren se comporte correctement lors du retour sans enfant. Au lieu de cela, vous devez utiliser getChildren(String,Namespace):

Namespace gpx = Namespace.getNamespace("http://www.topografix.com/GPX/1/0"); 
//[...] 
List list1 = root.getChildren("wpt", gpx); 
+0

Merci, cela fonctionne. – idotu

0

Je crois que vous devez spécifier l'espace de noms d'élément dans ce cas:

//yada yada 
Namespace rootNamespace = root.getNamespace(); 
List wptElements = root.getChildren("wpt", rootNamespace); 
for (Iterator wptIt = wptElements.iterator(); wptIt.hasNext();) { 
    Element wpt = (Element)wptIt.next(); 
    //yada yada 
} 

S'il vous plaît noter également que son recommandé de parcourir la liste via un itérateur au lieu de par l'indice, selon les JDOM javadocs:

traversal séquentielle dans la liste est mieux fait avec un Iterator depuis le l'implémentation sous-jacente de List.size() peut ne pas être la plus efficace.

Questions connexes