【发布时间】: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