当前位置: 首页 > 知识库问答 >
问题:

XML解析和排序

夔博
2023-03-14

我有下面的XML文件,其中包含需要查找到站点的最短距离的站点。

<station>
<station_id>TAPA</station_id>
<latitude>17.117</latitude>
<longitude>-61.783</longitude>
<xml_url>http://weather.gov/xml/current_obs/TAPA.xml</xml_url>
</station>

<station>
<station_id>TKPN</station_id>
<latitude>17.2</latitude>
<longitude>-62.583</longitude>
<xml_url>http://weather.gov/xml/current_obs/TKPN.xml</xml_url>
</station>

<station>
<station_name>Blackburne/Plymouth</station_name>
<latitude>16.75</latitude>
<longitude>-62.167</longitude>
<xml_url>http://weather.gov/xml/current_obs/TRPM.xml</xml_url>
</station>

解析后,我将这些数据存储在Station对象中,该对象实现了可比较的距离排序(我可以使用经度和纬度计算)。

protected Void doInBackground(Void...params){
    ....

    Station station = null;

    double stationLatitude = 0;
    double stationLongitude = 0;
    String xml = null;
    double distance = 0;

    ArrayList<Station> data = new ArrayList<Station>();

    for (int i = 0; i < itemList.getLength();i++){
        currentItem = itemList.item(i);
        //Log.i("Current Item: ", "" + currentItem.getNodeName());
        itemChildren = currentItem.getChildNodes();

        //..creating object Station
        station = new Station();
        for (int j = 0; j < itemChildren.getLength(); j++){

            currentChild = itemChildren.item(j);

            if (currentChild.getNodeName().equalsIgnoreCase("latitude")){

                stationLatitude = Double.parseDouble(currentChild.getTextContent());

                //Log.i("Latitude: ", "" + stationLatitude);

                station.setLatitude(stationLatitude);

            } else if (currentChild.getNodeName().equalsIgnoreCase("longitude")){

                stationLongitude = Double.parseDouble(currentChild.getTextContent());

                //Log.i("Longitude: ", "" + stationLongitude);

                station.setLongitude(stationLongitude);

            } else if (currentChild.getNodeName().equalsIgnoreCase("xml_url")){

                xml = currentChild.getTextContent();

                // Log.i("XML: ", "" + xml);

                station.setUrl(xml);
            }

            //inadeqaute values after quitting if/else:
            Log.i("Latitude: ", "" + station.getLatitude());
            Log.i("Longitude: ", "" + station.getLongitude());

            distance = calcDistance(deviceLongitude, deviceLatitude, station.getLongitude(), station.getLatitude());

            station.setDistance(distance);

            data.add(station);

        }

    }
    Collections.sort(data);

    Log.i("Shortest distance", "" + data.get(0).getDistance());
} catch (Exception e) {
    e.printStackTrace();
}
return null;
}

所以问题是我得到的纬度和经度值不足(太多了,它们被存储在对象中):

02-21 13:30:10.762 29803-29843/com.andro.location I/Latitude:: 0.0
02-21 13:30:10.762 29803-29843/com.andro.location I/Longitude:: 0.0
02-21 13:30:10.762 29803-29843/com.andro.location I/Latitude:: 0.0
02-21 13:30:10.762 29803-29843/com.andro.location I/Longitude:: 0.0
02-21 13:30:10.762 29803-29843/com.andro.location I/Latitude:: 17.117
02-21 13:30:10.772 29803-29843/com.andro.location I/Longitude:: 0.0
02-21 13:30:10.772 29803-29843/com.andro.location I/Latitude:: 17.117
02-21 13:30:10.772 29803-29843/com.andro.location I/Longitude:: 0.0
02-21 13:30:10.772 29803-29843/com.andro.location I/Latitude:: 17.117
02-21 13:30:10.772 29803-29843/com.andro.location I/Longitude:: -61.783
02-21 13:30:10.772 29803-29843/com.andro.location I/Latitude:: 17.117
02-21 13:30:10.772 29803-29843/com.andro.location I/Latitude:: 17.117
02-21 13:30:10.772 29803-29843/com.andro.location I/Longitude:: -61.783
02-21 13:30:10.772 29803-29843/com.andro.location I/Latitude:: 17.117
02-21 13:30:10.782 29803-29843/com.andro.location I/Latitude:: 0.0
02-21 13:30:10.782 29803-29843/com.andro.location I/Longitude:: 0.0
02-21 13:30:10.782 29803-29843/com.andro.location I/Latitude:: 0.0
02-21 13:30:10.782 29803-29843/com.andro.location I/Longitude:: 0.0
02-21 13:30:10.782 29803-29843/com.andro.location I/Latitude:: 0.0
02-21 13:30:10.782 29803-29843/com.andro.location I/Longitude:: 0.0

当涉及到排序:Collections.sort(数据);我得到的比较方法违反了它的一般契约例外:/

编辑:添加桩号类别:

public class Station implements Comparable<Station> {

    public double getDistance() {
        return distance;
    }

    public void setDistance(double distance) {
        this.distance = distance;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    double distance;
    String url;
    double longitude;
    double latitude;

    @Override
    public int compareTo(Station other) {

        int result = this.distance <= other.distance ? -1 : 1;
        return result;
    }


}

共有1个答案

督嘉言
2023-03-14

将compareTo方法更改为

@Override
public int compareTo(Station other) {

    return Double.compare(this.distance, other.distance)
}

感谢@Andreas给出了更干净的答案

 类似资料:
  • 简易 XML 操作 通过本文,您将了解使用 Groovy 分解 XML 是多么地容易。在本期的 实战 Groovy 中,作者 Scott Davis 演示了无论您是使用 MarkupBuilder 和 StreamingMarkupBuilder 创建 XML,还是使用 XmlParser 和 XmlSlurper 解析 XML,Groovy 都提供了一系列用于处理这类流行数据格式的工具。 XML

  • 问题 你想读取一个XML文档,对它最一些修改,然后将结果写回XML文档。 解决方案 使用 xml.etree.ElementTree 模块可以很容易的处理这些任务。 第一步是以通常的方式来解析这个文档。例如,假设你有一个名为 pred.xml 的文档,类似下面这样: <?xml version="1.0"?> <stop> <id>14791</id> <nm>Clark &amp

  • untangle untangle 是一个简洁的用于解析 XML 文档的库。输入一个 XML 文档后,untangle 将文档的结构映射成结点和属性,并返回一个 Python 对象。 形如以下的 XML 文件: <?xml version="1.0"?> <root> <child name="child1"> </root> 可以使用以下的方法进行加载: import untangl

  • 问题内容: 我为播客提供了一个rss提要,基本上我想做的是在RSS提要中使用URL填充html5音频播放器。 我认为最好的方法是使用ajax解析链接,然后将其附加到音频播放器的src中。我知道相同的域策略会阻止我使用ajax进行此操作,因此我正在使用跨域ajax插件(http://bit.ly/Jbi9iX)来解决此问题。 我竭力要弄清楚究竟为什么下面的代码不工作对我来说,基本上在这个阶段,我只是

  • 问题内容: 我不是开发人员,只是涉足编程。我从来不了解的一个领域是XML解析。可悲的是,对于我最新的“项目”,我需要为一个Android应用执行此操作。它是我正在工作的原型。 我有这个XML(模型文件): 我有一些代码可以让我获得每个的NodeList: 我不确定下一步该怎么做。我的代码对此似乎很长。我一直在搜寻更好的方法,但发现一些更简洁的代码,无法上班。 有没有很好的Android XML教程

  • 问题内容: 场景:我正在尝试解析一个XML结构,但我不知道如何在xml属性值包含文本和更多嵌套值的情况下建立结构。所有其他属性都已正确设置,我不确定是否需要获取源的值并创建一个单独的解析器来检索元素的值。 编辑: 我正在尝试将源解析为以下形式的字符串:你好%{first_name}%{last_name} 用当前结构解组xml字符串将返回一个空结构 使用innerxml的@plato将源设置为: