Java 为什么这个XMLDOM解析器不能正确解析rtept、name和cmt标记?
目前我完全被这个DOM XML解析器难住了。我得到了两个标签的错误信息,我不明白为什么这两个标签的名称和cmt保持相同的信息,而不是正确的信息 我使用的XML如下所示:Java 为什么这个XMLDOM解析器不能正确解析rtept、name和cmt标记?,java,android,xml,dom,xml-parsing,Java,Android,Xml,Dom,Xml Parsing,目前我完全被这个DOM XML解析器难住了。我得到了两个标签的错误信息,我不明白为什么这两个标签的名称和cmt保持相同的信息,而不是正确的信息 我使用的XML如下所示: <?xml version="1.0" encoding="UTF-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocati
<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="http://ridewithgps.com/">
<metadata>
<name>Home Test</name>
<link href="http://ridewithgps.com/routes/1714475">
<text>Home Test</text>
</link>
<time>2012-09-13T16:08:10Z</time>
</metadata>
<rte>
<name>Home Test</name>
<rtept lat="39.41333" lon="-77.4624">
<name>Right</name>
<cmt>Turn right onto Grouse Dr</cmt>
</rtept>
<rtept lat="39.41288" lon="-77.46297000000004">
<name>Right</name>
<cmt>Turn right onto Hunting Horn Ln</cmt>
</rtept>
<rtept lat="39.41431" lon="-77.46625">
<name>Right</name>
<cmt>Turn right onto Partridge Way</cmt>
</rtept>
<rtept lat="39.41431" lon="-77.46625">
<name>Left</name>
<cmt>Turn left onto Hunting Horn Ln</cmt>
</rtept>
<rtept lat="39.41288" lon="-77.46297000000004">
<name>Left</name>
<cmt>Turn left onto Grouse Dr</cmt>
</rtept>
<rtept lat="39.41333" lon="-77.4624">
<name>Right</name>
<cmt>Turn right onto Grouse Ct</cmt>
</rtept>
</rte>
</gpx>
public void parseXMLFile(String fullpath) {
String metadata_name = null;
String metadata_link_href = null;
String metadata_link_name = null;
String metadata_time = null;
String rte_name = null;
Double point_lat = null;
Double point_lon = null;
Double last_lat = null;
Double last_lon = null;
String point_name = null;
String point_cmt = null;
Float distance_to = null;
// File f = new File(fullpath);
String fileContents = null;
try {
fileContents = readFileAsString(fullpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Document doc = (Document) loadXMLFromString(fileContents);
doc.getDocumentElement().normalize();
Element root = doc.getDocumentElement();
Log.d("XML", "ROOTNODE:" + root.getNodeName());
NodeList nodeList = doc.getElementsByTagName("metadata");
Node nodee = nodeList.item(0);
Log.d("XML", "NODELISTLENGTH1:" +
nodee.getChildNodes().getLength());
for (int i = 0; i < nodee.getChildNodes().getLength(); i++) {
Node node = nodee.getChildNodes().item(i);
if (node.getNodeName().equalsIgnoreCase("name")) {
metadata_name = node.getTextContent();
} else if (node.getNodeName().equalsIgnoreCase("link")) {
NamedNodeMap attributes = node.getAttributes();
if (attributes.getNamedItem("href") != null) {
String href = attributes.getNamedItem("href")
.getNodeValue();
metadata_link_href = href;
}
metadata_link_name = node.getTextContent();
// Log.i("XML", "link node:" + node.getTextContent());
} else if (node.getNodeName().equalsIgnoreCase("time")) {
metadata_time = node.getTextContent();
}
}
// DO THE RTE NODES AFTER THIS
NodeList nodeList2 = doc.getElementsByTagName("rte");
Node nodee2 = nodeList2.item(0);
Log.d("XML", "NODELISTLENGTH2:"
+ nodee2.getChildNodes().getLength());
for (int i = 0; i < nodee2.getChildNodes().getLength(); i++) {
Node node = nodee2.getChildNodes().item(i);
if (node.getNodeName().equalsIgnoreCase("name")) {
rte_name = node.getTextContent();
} else if (node.getNodeName().equalsIgnoreCase("rtept")) {
NamedNodeMap attributes = node.getAttributes();
if (attributes.getNamedItem("lat") != null) {
// STORE THE LAST LAT FOR MEASURING DISTANCE BETWEEN
if (point_lat != null) {
last_lat = point_lat;
}
point_lat = Double.parseDouble(attributes.getNamedItem(
"lat").getNodeValue());
}
if (attributes.getNamedItem("lon") != null) {
// STORE THE LAST LON FOR MEASURING DISTANCE BETWEEN
if (point_lon != null) {
last_lon = point_lon;
}
point_lon = Double.parseDouble(attributes.getNamedItem(
"lon").getNodeValue());
}
NodeList rteptList = doc.getElementsByTagName("rtept");
// NodeList rteptList = node.getChildNodes();
Node nodee3 = rteptList.item(0);
Log.d("XML", "NODELISTLENGTH3:"
+ nodee3.getChildNodes().getLength());
for (int i1 = 0; i1 < nodee3.getChildNodes().getLength(); i1++) {
Node rteptNode = nodee3.getChildNodes().item(i1);
if (rteptNode.getNodeName().equalsIgnoreCase("name")) {
point_name = rteptNode.getFirstChild().getNodeValue();
} else if (rteptNode.getNodeName().equalsIgnoreCase("cmt")) {
point_cmt = rteptNode.getFirstChild().getNodeValue();
}
}
// DO THE DATABASE STORAGE HERE
Log.i("XML", "name node:" + metadata_name);
Log.i("XML", "link node:" + metadata_link_name);
Log.i("XML", "link attribute [href]:" + metadata_link_href);
Log.i("XML", "time node:" + metadata_time);
Log.i("XML", "rte_name:" + rte_name);
Log.i("XML", "point_lat:" + point_lat.toString());
Log.i("XML", "point_lon:" + point_lon.toString());
Log.i("XML", "point_name:" + point_name);
Log.i("XML", "point_cmt:" + point_cmt);
}
}
} catch (Exception e) {
String estr = e.getStackTrace().toString();
Log.d("XML", "XML Exception: " + e + ":" + estr);
}
}
为什么point_name总是正确的,point_cmt总是右转入Grouse Dr?
我该如何解决这个问题
提前感谢。尝试在代码中替换下面的代码片段
Node nodee3 = rteptList.item(0);
Log.d("XML", "NODELISTLENGTH3:"
+ nodee3.getChildNodes().getLength());
for (int i1 = 0; i1 < nodee3.getChildNodes().getLength(); i1++) {
Node rteptNode = nodee3.getChildNodes().item(i1);
if (rteptNode.getNodeName().equalsIgnoreCase("name")) {
point_name = rteptNodenode.getTextContent();
} else if (rteptNode.getNodeName().equalsIgnoreCase("cmt")) {
point_cmt = rteptNodenode.getTextContent();
}
}
在你的代码中我看到了
NodeList rteptList = doc.getElementsByTagName("rtept");
// NodeList rteptList = node.getChildNodes();
Node nodee3 = rteptList.item(0);
当前代码仅获取第一个rtept节点以及名称和cmt,因此仅使用第一个节点中的值
注释掉的行在正确的轨道上。您需要从当前节点获取子节点,并在其中找到rtept节点。我决定使用JOOX来完成,因为代码更容易理解
public void parseXMLFile(String fullpath) {
String metadata_name = null;
String metadata_link_href = null;
String metadata_link_name = null;
String metadata_time = null;
String point_lat = null;
String point_lon = null;
String last_lat = null;
String last_lon = null;
String point_name = null;
String point_cmt = null;
String fileContents = null;
try {
fileContents = readFileAsString(fullpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Document doc = (Document) loadXMLFromString(fileContents);
for (Match metadata : $(doc).find("metadata").each()) {
Match c = metadata.children();
for (int i = 0; i < c.size(); i++) {
metadata_name = c.find("name").text();
metadata_link_href = c.find("link").attr("href").toString();
metadata_link_name = c.find("link").find("text").text();
metadata_time = c.find("time").text();
}
}
for (Match rte2 : $(doc).xpath("//rte").andSelf().each()) {
rte2.children();
for(Match rtetag : rte2.children().each()) {
if(rtetag.tag().equalsIgnoreCase("name")) {
rtetag.text();
}
if(rtetag.tag().equalsIgnoreCase("rtept")) {
for(Match rtepttag : rtetag.children().andSelf().each()) {
if(rtepttag.tag().equals("name")) {
point_name = rtepttag.text();
}
if(rtepttag.tag().equals("cmt")) {
point_cmt = rtepttag.text();
}
if(rtepttag.tag().equals("rtept")) {
if(last_lon == null) {
last_lon = point_lon;
}
if(last_lat == null) {
last_lat = point_lat;
}
point_lat = rtepttag.attr("lat");
point_lon = rtepttag.attr("lon");
//done parsing? here's some log stuff to check
Log.d("XML", "META_NAME:" + metadata_name);
Log.d("XML", "META_LINK_HREF:" + metadata_link_href);
Log.d("XML", "META_LINK_NAME:" + metadata_link_name);
Log.d("XML", "META_TIME:" + metadata_time);
Log.d("XML", "POINT_NAME:" + point_name);
Log.d("XML","POINT_CMT:"+point_cmt);
Log.d("XML", "POINT_LAT:" + point_lat);
Log.d("XML", "POINT_LON:" + point_lon);
}
}
}
}
}
} catch (Exception e) {
String estr = e.getStackTrace().toString();
Log.d("XML", "XML Exception: " + e + ":" + estr);
}
}
谢谢你的回答。你的意思是让rteptNode成为rteptNode吗?否则rteptNodenode未定义。当我修复并运行它时,结果仍然是一样的。。。显示到point_name和point_cmt的值永远不会更改。以下是更改后剪切的结果:09-15 08:24:19.793:I/XML15085:point_name:Right 09-15 08:24:19.793:I/XML15085:point_cmt:右转到Grouse Dr。。。09-15 08:24:19.793:I/XML15085:point_name:Right 09-15 08:24:19.793:I/XML15085:point_cmt:右转到松鸡Dr。。。09-15 08:24:19.803:I/XML15085:point_name:Right 09-15 08:24:19.803:I/XML15085:point_cmt:右转到松鸡Dr。。。09-15 08:24:19.803:I/XML15085:point_name:Right 09-15 08:24:19.803:I/XML15085:point_cmt:右转到Grouse Dr我已经更改了线point_name=rteptNodenode.getTextContent;请尝试添加这个。好的。。但它不会编译时出现未定义的错误。我会试试看,看我是否需要把线头清理一下。谢谢你的帮助。
public void parseXMLFile(String fullpath) {
String metadata_name = null;
String metadata_link_href = null;
String metadata_link_name = null;
String metadata_time = null;
String point_lat = null;
String point_lon = null;
String last_lat = null;
String last_lon = null;
String point_name = null;
String point_cmt = null;
String fileContents = null;
try {
fileContents = readFileAsString(fullpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Document doc = (Document) loadXMLFromString(fileContents);
for (Match metadata : $(doc).find("metadata").each()) {
Match c = metadata.children();
for (int i = 0; i < c.size(); i++) {
metadata_name = c.find("name").text();
metadata_link_href = c.find("link").attr("href").toString();
metadata_link_name = c.find("link").find("text").text();
metadata_time = c.find("time").text();
}
}
for (Match rte2 : $(doc).xpath("//rte").andSelf().each()) {
rte2.children();
for(Match rtetag : rte2.children().each()) {
if(rtetag.tag().equalsIgnoreCase("name")) {
rtetag.text();
}
if(rtetag.tag().equalsIgnoreCase("rtept")) {
for(Match rtepttag : rtetag.children().andSelf().each()) {
if(rtepttag.tag().equals("name")) {
point_name = rtepttag.text();
}
if(rtepttag.tag().equals("cmt")) {
point_cmt = rtepttag.text();
}
if(rtepttag.tag().equals("rtept")) {
if(last_lon == null) {
last_lon = point_lon;
}
if(last_lat == null) {
last_lat = point_lat;
}
point_lat = rtepttag.attr("lat");
point_lon = rtepttag.attr("lon");
//done parsing? here's some log stuff to check
Log.d("XML", "META_NAME:" + metadata_name);
Log.d("XML", "META_LINK_HREF:" + metadata_link_href);
Log.d("XML", "META_LINK_NAME:" + metadata_link_name);
Log.d("XML", "META_TIME:" + metadata_time);
Log.d("XML", "POINT_NAME:" + point_name);
Log.d("XML","POINT_CMT:"+point_cmt);
Log.d("XML", "POINT_LAT:" + point_lat);
Log.d("XML", "POINT_LON:" + point_lon);
}
}
}
}
}
} catch (Exception e) {
String estr = e.getStackTrace().toString();
Log.d("XML", "XML Exception: " + e + ":" + estr);
}
}