0

我正在尝试从 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();
     }
}
4

2 回答 2

1

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);
于 2010-11-22T14:27:54.057 回答
0

我相信您需要在此实例中指定元素名称空间:

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

另请注意,根据 JDOM javadocs,建议通过迭代器而不是索引来遍历列表:

List 的顺序遍历最好使用 Iterator 完成,因为 List.size() 的底层实现可能不是最有效的。

于 2010-11-22T14:29:42.983 回答