【问题标题】:Just retrieve the first result of an xml file只需检索 xml 文件的第一个结果
【发布时间】:2012-06-23 23:17:23
【问题描述】:

我正在尝试检索搜索的第一个结果。搜索返回一个 xml 文件,我正在使用 sax 解析器处理该 xml。 事实上,我想解析 xml 文件,并在处理完该搜索的第一个结果后停止。

ie:我想解析这个文件:http://musicbrainz.org/ws/2/release?query=barcode:606949062927 并检索第一个结果(来自 Eminem 的专辑)。但是当我使用我的代码时,我存储了我不想要的最后一个结果(Daniel Swain 的专辑)。因此,如果我可以在第一个结果之后停止解析,这会好很多(耗时更少)。

我认为这可以通过设置布尔值firstResult 来实现,并在我处理完第一个结果后将其设置为 true,但我发现它真的很脏。您认为还有其他方法吗?

这是我的代码的一部分:

public DataMusic parseBarcode(InputStream is) {

    final DataMusic resultAlbum = new DataMusic();

    RootElement root = new RootElement(ATOM_NAMESPACE,"metadata");
    Element releaseList=root.getChild(ATOM_NAMESPACE,"release-list");
    Element release = releaseList.getChild(ATOM_NAMESPACE,"release");
    Element title = release.getChild(ATOM_NAMESPACE,"title");
    Element artistCredit = release.getChild(ATOM_NAMESPACE,"artist-credit");
    Element nameCredit = artistCredit.getChild(ATOM_NAMESPACE,"name-credit");
    Element artist = nameCredit.getChild(ATOM_NAMESPACE,"artist");
    Element artistName = artist.getChild(ATOM_NAMESPACE, "name");
    releaseList.setStartElementListener(new StartElementListener() {
        @Override
        public void start(Attributes attributes) {
            if(attributes.getValue("count").equals(null) || attributes.getValue("count").equals("") || attributes.getValue("count").equals("0")) {
                resultAlbum.setMBId(null);
                resultAlbum.setAlbumName(null);
                resultAlbum.setArtistName(null);
                Log.w(TAG_MB, "Album was not found on MB. count=" + attributes.getValue("count") +".");
            }

        }
    });
    release.setStartElementListener(new StartElementListener() {
        @Override
        public void start(Attributes attributes) {
            resultAlbum.setMBId(attributes.getValue("id"));
            Log.v(TAG_MB, "Album found with id=" + attributes.getValue("id"));
        }

    });
    title.setEndTextElementListener(new EndTextElementListener() {
        @Override
        public void end(String body) {
            Log.v(TAG_MB, "Album name set to " + body);
            resultAlbum.setAlbumName(body);
        }

    });
    artistName.setEndTextElementListener(new EndTextElementListener() {
        @Override
        public void end(String body) {
            Log.v(TAG_MB, "Album artist name set to " + body);
            resultAlbum.setArtistName(body);
        }           
    });
    try {
        Log.v(TAG_MB, "Starting parsing data...");
        Xml.parse(is, Xml.Encoding.UTF_8, root.getContentHandler());
        Log.v(TAG_MB, "Finished parsing. Returning album with MBID=" + resultAlbum.getMBId() + " and name=" + resultAlbum.getAlbumName()) ;
        return resultAlbum; 
    } catch (SAXException e) {
        Log.e(TAG_MB + "_SAXException", "SAXException with MusicBrainz");
        Log.e(LOGCAT_TAG + "_SAXException",e.getMessage());
    } catch (IOException e) {
        Log.w(TAG_MB+ "_IOException", "The HTTP Request wasn't good. Either 403 error, or the album wasn't found on LASTFM");
        Log.w(LOGCAT_TAG+ "_IOException", "" + e.getMessage(), e);
    }
    return null;

}

【问题讨论】:

  • 我不是解析或编写 XML 解析器的忠实粉丝。叫我懒惰,但 json 更容易一些。看看这个关于将 xml 转换为 json 的例子。也许这对你来说也会更自然。 answers.oreilly.com/topic/…
  • 嗯,因为这个提要也有json格式,也许我应该考虑把它解析为json。 json真的比xml好吗?
  • 对我来说是。 Android 对 json 有很好但很简单的支持。数据有效负载也更少(不需要结束标签)。如果你需要超级花哨,总有杰克逊 json 解析器。 jackson.codehaus.org
  • 如果您只想读取 XML 的一部分,请使用 XMLPullParser

标签: android xml-parsing sax


【解决方案1】:

我想唯一比拥有布尔值firstResult 更好的是拥有DataMusic 对象的单个实例。您可以在函数顶部对应用程序范围的单个实例 DataMusic 对象进行空检查。如果您找到它null,您可以确定 XML 的解析是第一次发生,您可以继续初始化并设置对象的值。下次查看DataMusic的单个实例对象不为空时,你可能会断定XML已经被解析并设置了值。

希望这个解释有所帮助。

【讨论】:

  • 我不确定我是否理解,但你的建议是让resultAlbum 为null,并检查它是否设置为null,然后初始化它并设置我需要的值。但我无法初始化它,因为它是一个最终变量,我只能引用 DataMusic 中的 getter 和 setter。事实上,这个布尔值firstResult 也存在同样的问题,我需要声明一个布尔数组以便我可以修改它,或者定义我自己的对象。
  • 我的意思是拥有对象DataMusic 的单个应用程序范围实例。如果你有一个实例,它只会被初始化一次。第一次初始化将在函数parseBarcode() 中进行。因此,第一次检查此 Single Instance 对象时,您会发现它为 null(因为它尚未初始化),但第二次您会发现它 not null,因为您已经初始化了它并设置了它的值在第一次解析期间。我希望我对你有意义?
  • 好的。我明白你的意思了。但我想我可能错误地描述了我的问题。我不想检查这是否是第一次调用 parseBarcode。我只想获得包含在 xml 中的第一个结果(返回很多)。 IE,在那个 xml 中:musicbrainz.org/ws/2/release?query=barcode:606949062927 我想要 Eminem 专辑(我称之为第一个结果),而不是 Daniel Swain 的专辑。是不是更清楚了?如果是,我将编辑我的问题。
  • 您的问题似乎没有正确传达您的问题。但是您的最新评论确实如此。因此,按照您的建议,继续编辑您的问题。
猜你喜欢
  • 2021-02-01
  • 2011-09-26
  • 1970-01-01
  • 2019-05-08
  • 2017-09-09
  • 2017-12-12
  • 2018-06-01
  • 2014-04-17
  • 2016-05-23
相关资源
最近更新 更多