我正在尝试从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();
}
}
答案 0 :(得分:1)
这将返回此元素中直接嵌套(深度为一级)的所有子元素的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()的底层实现 可能不是最有效的。