Не удается получить содержимое внутри дочернего тега с помощью JDOM - PullRequest
0 голосов
/ 22 ноября 2010

Я пытаюсь извлечь содержимое из файла gpx.Проблема в том, что когда я использовал getChildren ("wpt"), чтобы получить содержимое тега wpt, я ничего не получил.И когда я использовал метод getChildren (), я получил и несколько вернулся.И когда я удалил все содержимое в единственном, оставьте его как, все работает нормально.

Содержание этого файла:

<?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>

Ниже приведены мои коды для извлечения содержимого:

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

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

getChildren (String) JavaDoc :

Возвращает список всех дочерних элементов, вложенных напрямую (на один уровень глубины) в этот элемент с заданным локальным именем и принадлежащих к пространству имен , возвращаемых как объекты Element. Если этот целевой элемент не имеет вложенных элементов с заданным именем вне пространства имен, возвращается пустой список. Возвращенный список является «живым» в порядке документа, и его изменения влияют на фактическое содержимое элемента.

Поскольку ваш тег wpt принадлежит пространству имен http://www.topografix.com/GPX/1/0, метод getChildren работает правильно, когда не возвращает дочерних элементов. Вместо этого вы должны использовать getChildren(String,Namespace):

Namespace gpx = Namespace.getNamespace("http://www.topografix.com/GPX/1/0");
//[...]
List list1 = root.getChildren("wpt", gpx);
0 голосов
/ 22 ноября 2010

Я считаю, что вам нужно указать пространство имен элемента в этом случае:

//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
}

Обратите также внимание, что рекомендуется выполнять итерацию по списку через итератор, а не по индексу, согласно Javadocs JDOM:

Последовательный обход по списку лучше всего выполнять с помощью итератора, поскольку базовая реализация List.size () может быть не самой эффективной.

...