无法使用JDOM获取子标记内的内容

时间:2010-11-22 14:02:08

标签: java xml jdom

我正在尝试从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 个答案:

答案 0 :(得分:1)

getChildren(String) JavaDoc

这将返回此元素中直接嵌套(深度为一级)的所有子元素的List,其中<​​strong>给定的本地名称属于无命名空间,作为Element对象返回。如果此目标元素没有在命名空间外具有给定名称的嵌套元素,则返回空List。返回的列表按文档顺序“实时”,对它的更改会影响元素的实际内容。

由于您的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);

答案 1 :(得分: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,建议通过Iterator而不是索引遍历列表:

  

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