java - Android:如何从 RSS feed 获取值并从另一个 RSS feed 中的值减去它

标签 java android xml rss

嘿,我有这两个 RSS 源 - http://www.petrolprices.com/feeds/averages.xml?search_type=town&search_value=kilmarnockhttp://www.petrolprices.com/feeds/averages.xml?search_type=town&search_value=glasgow 。现在我想做的是从一个 RSS 提要中获取一个值,并使用另一个 RSS 提要中的值来计算它。例如

132.9 - 133.1

我该怎么做?

基本思想是,用户创建 RSS URL,然后 onClick 获取每个 RSS 提要中的所有值,并将其与其他提要进行比较,以便用户获得差异,这样通过选择一个或多个 RSS 提要即可节省总体资金另一个

最佳答案

据我了解,您的问题有一个简单的答案,以及一个更具体有用的答案。我将首先记录如何将字符数据转换为数字(无论是 int、double、float 等)的简单答案,特别关注异常情况,然后深入研究专门适用于您的情况的细节。问题。

只要你有一个你认为是某种数字类型的字符串表示形式,你就可以为目标包装类调用适当的 valueOf() 或 parseXYZ() 方法。例如。如果您正在寻找整数:theInt 是字符串“42”。 Integer.valueOf(theInt) 将返回一个值为 42 的 Integer,而 Integer.parseInt(theInt) 将返回 int 42。 http://developer.android.com/reference/java/lang/Double.html

如果 theInt 表示“42”或“42.0”,则任一方法都会抛出 NumberFormatException。解析 float 的过程大致相同,只是“42.0”会正确解析,而“42.0.0”会在 Android 上抛出 NumberFormatException。传递给这些方法之一的整个字符串必须是所选类型的有效数字。末尾的空格也会引发异常。

如果您使用的是扫描仪,则可以使用 hasNextXYZ() 和 nextXYZ() 来检查并获取下一个数字,其中 XYZ 可以是任何基本类型。扫描程序将处理下一个标记,该标记将根据您设置的分隔符进行定义。 http://developer.android.com/reference/java/util/Scanner.html

“太好了,那么应该在何时、何地以及如何获取 XML 中的数字并将它们传递给上述任一方法?” 您应该有一个数据结构来保存每个值,您在解析 XML 时填充它。基于 your related question, 的情况据我了解,将 XML 解析为标记的问题已经解决。因此,请更新解析器以针对最高、平均和最低元素的值调用正确的字符串到数字转换方法。您需要的字符串已经正确修剪并在每个阶段通过解析器。

或者,为了进一步解耦代码,创建一个对象来保存要比较的数据集,然后让解析器简单地实例化并调用 setter 。 FuelData 可能就是那个对象。

class FuelData { 
    String KEY_TYPE;
    double highest;
    double average;
    double lowest;
    // if future support for currency types needed, would go here, hook in to units attribute in xml
    FuelData(String type) { // call this every time a type is encountered parsing html
        KEY_TYPE = type;
    }

    void setHighest(String val) { // here, val is value of "Highest" element
        try {
            highest = Double.parseDouble(val); // because you're not using a Scanner to parse
        } catch (NumberFormatException e) {
        // handle appropriately
        }
        // perhaps sanity check: disallow negatives, check not less than lowest, etc.
    }

    // and so on for average and lowest

    double computeSavings(FuelData pricesB) { // called by onClick
    // your subtraction goes here. Perhaps you decide it's reasonable to use this method
    // to compute savings for Regular vs. Premium and therefore do not check type,
    // perhaps you decide that's illogical and do check types.
    // Note: good arguments can be made that this method should exist in a different
    // class. I've placed it here for simplicity's sake.
    }
}

以逻辑方式收集FuelData,解析完成后即可访问,例如feed1被解析为一组FuelData,feed2被解析为一组FuelData等,然后让onClick获取所有解析后的FuelData从每个 RSS 提要中,通过computeSavings 进行比较,并返回结果。

关于java - Android:如何从 RSS feed 获取值并从另一个 RSS feed 中的值减去它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391038/

相关文章:

java - 如何动态添加参数值到JdbcTemplate查询?

android - AndroidManifest.xml 中的两个主要 Activity

java - 无法保存我的分数 - Android

子标签的python sax xml名称

Python-从类中的函数访问变量

java - JVM 崩溃 hs_err_pidXXXX.log 文件已创建。但是没有生成 hprof 文件

java - 解析查询: return a value from the done() method in the class?

java - JNI - C++/Java 中的监听器 - 是否可以在 C++ 中实例化 Java 对象并将它们用作参数

java - android新手,无法在手机上运行github上的项目

xml - 使用 XSLT 将 XML 转换为具有最大宽度的文本