【问题标题】:How can I extract the multiple attributes that are the same, from an XML node in Java如何从 Java 中的 XML 节点中提取多个相同的属性
【发布时间】:2014-04-06 03:50:30
【问题描述】:

我目前有一个来自 Garmin Sat Nav 的 XML 文件,我想使用 Java 提取数据。但是,我找不到提取 TRACK 纬度和经度的方法,因为在单个节点中有多个具有相同名称的属性。我想过使用类似“getAttribute(“lat”)”的东西,但显然这只会返回第一个轨道段的第一个纬度:-(

我还没有开始这个项目,因为从 XML 文件中提取纬度和经度是至关重要的。

任何帮助将不胜感激:-)

XML 文件

<gpx xmlns="http://www.topografix.com/GPX/1/1"
xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon
400t" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1
http://www.topografix.com/GPX/1/1/gpx.xsd 
http://www.garmin.com/xmlschemas/GpxExtensions/v3
http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd
http://www.garmin.com/xmlschemas/TrackPointExtension/v1
http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<metadata>
  <link href="http://www.garmin.com">
    <text>Garmin International</text>
  </link>
    <time>2009-10-17T22:58:43Z</time>
</metadata>
<trk>
<name>Example GPX Document</name>
<trkseg>
  <trkpt lat="47.644548" lon="-122.326897">
    <ele>4.46</ele>
    <time>2009-10-17T18:37:26Z</time>
  </trkpt>
  <trkpt lat="47.644548" lon="-122.326897">
    <ele>4.94</ele>
    <time>2009-10-17T18:37:31Z</time>
  </trkpt>
  <trkpt lat="47.644548" lon="-122.326897">
    <ele>6.87</ele>
    <time>2009-10-17T18:37:34Z</time>
  </trkpt>
</trkseg>

您好,我尝试了以下代码,但由于某种原因,我正在检索一个值,我什至无法在我的 XML 文件中找到它!!!

package Test;

import java.io.File;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.Document;

public class ReadXMLFile2 {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(new File("J:/Desktop/Current.gpx"));

    XPath xpath = XPathFactory.newInstance().newXPath();
    System.out.println(xpath.evaluate("//trkseg/trkpt/@lat", document));
    } 

}

【问题讨论】:

    标签: java xml dom


    【解决方案1】:

    阅读 XPath:http://www.w3.org/TR/xpath/

    例如,要从最后一个 trkpt 中获取 lat 属性,您可以使用路径

    /gpx/trk/trkseg[last()]/@lat

    【讨论】:

    • 您好,感谢您的回复。只是另一个问题,可以选择特定的轨迹点纬度,而不仅仅是选择第一个或最后一个?
    【解决方案2】:

    您可能想尝试使用XPath 查询/trkseg/trkpt/@lat 之类的属性以获取所有纬度。

    【讨论】:

    • 您好,感谢您的快速回复。我似乎获得了一些价值,但这不是我所期望的,请您检查我添加到帖子中的代码。
    • 好的,我认为这里的 XML 文件有问题,当我使用其他 XML 文件时,我总是得到我期望的结果。但是,是否可以选择特定的跟踪点纬度,而不仅仅是选择第一个。非常感谢
    • @user3379365 是的,如果您知道自己想要哪个纬度,则可以选择一个特定的纬度,例如/trkseg/trkpt/@lat[2]
    【解决方案3】:

    为了能够使用 XPath,您首先需要让您的 DocumentBuilderFactory 知道命名空间(令人讨厌的是,默认情况下它不是,可能是出于历史原因),因为 XPath 语言需要命名空间支持。

    现在,XML 文件顶部的xmlns="http://www.topografix.com/GPX/1/1" 意味着文档中所有不带前缀的元素名称都属于该命名空间。为了将它们与 XPath 匹配,您需要定义一个 NamespaceContext,将这个命名空间 URI 绑定到一个前缀,并在 XPath 表达式中一致地使用该前缀。

    另外,忘记 XPath 并只使用标准 DOM API 可能更简单:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    // enable namespace processing
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(new File("J:/Desktop/Current.gpx"));
    
    NodeList trkpts = document.getElementsByTagNameNS(
               "http://www.topografix.com/GPX/1/1", "trkpt");
    for(int i = 0; i < trkpts.getLength(); i++) {
      Element pt = (Element)trkpts.item(i);
      // since namespaces are enabled we must use the DOM level 2 getAttributeNS,
      // not the legacy getAttribute, even though the attributes we're getting
      // do not themselves belong to a namespace.
      System.out.println("lat: " + pt.getAttributeNS(null, "lat") +
          ", long: " + pt.getAttributeNS(null, "lon"));
    }
    

    【讨论】:

    • 非常感谢,这正是我正在寻找的答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多