【发布时间】:2012-03-18 23:40:46
【问题描述】:
我在 xml 解析方面没有经验,所以也许我写的一些东西对某些人来说看起来很愚蠢,也许我的一些术语不太正确。请原谅。
我开发了一个安卓应用程序,它需要解析来自YR.no 的天气数据。该组织提供了一个 api,其中包含提供某些 xml 格式数据的方法。比如说我想从这个http://api.yr.no/weatherapi/seaapproachforecast/1.0/?location=stad解析xml数据
我开发了一个可以做一些 xml 解析的代码,它可以在这个 http://www.w3schools.com/xml/simple.xml 中正常工作(作为测试)。
定义在我的 BaseFeedParser 类中获取什么的主要代码行是:
RootElement root2 = new RootElement("breakfast_menu");
Element food = root2.getChild("food");
Element name = food.getChild("name");
food.setEndElementListener(new EndElementListener() {
public void end() {
messages.add(currentMessage.copy());
}
});
food.getChild("name").setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
currentMessage.setTitle(body);
}
});
try {
Xml.parse(this.getInputStream(), Xml.Encoding.ISO_8859_1, root2.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
return messages;
然后从我的活动课:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
loadFeed();
}
private void loadFeed() {
try {
BaseFeedParser parser = new BaseFeedParser();
messages = parser.parse();
List<String> titles = new ArrayList<String>(messages.size());
System.out.println(messages.size());
for (Message msg : messages) {
titles.add(msg.getTitle());
}
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this, R.layout.row,titles);
this.setListAdapter(adapter);
String str = "!";
if (titles != null) {
str = titles.toString();
System.out.println("not null");
System.out.println(str);
}
test(str);
} catch (Throwable t) {
Log.e("AndroidNews",t.getMessage(), t);
}
}
public void test(String s) {
setContentView(R.layout.error);
TextView textView = (TextView) findViewById(R.id.mytextview);
textView.setText(s);
}
所以它返回并打印我想要的数据(“比利时华夫饼”等)
我最初想解析的 yr.no 数据的问题是每个最终子节点不只包含一个值,而是可以有更多标签(例如<waveDirection unit="degree" value="250"/>)。因此,当我将元素更改为使用这个元素时,它会以 25 个不同的 Strings 结尾(如果您计算它们是所有带有标签 waveDirection 的不同子代),但每个值都是空的(如 String a = "")。我没有收到任何错误,我只得到了 25 个空字符串的列表。我试图达到我的元素的方式是这样的:
RootElement root = new RootElement("weatherdata");
Element product = root.getChild("product");
Element time = product.getChild("time");
Element location = time.getChild("location");
location .setEndElementListener(new EndElementListener(){
public void end() {
messages.add(currentMessage.copy());
}
});
location.getChild("windDirection").setEndTextElementListener(new EndTextElementListener() {
public void end(String body) {
currentMessage.setTitle(body);
}
});
那么我应该如何修改它以便它与这个 xml 一起工作?我没有提供所有的类和方法(例如setTitle()),但我认为它们可以正常工作,因为它们可以正确解析我的第一个测试 xml。我想我正确设置了我的feedUrlString = "http://api.yr.no/weatherapi/seaapproachforecast/1.0/?location=stad";,因为它找到了文档的根和 25 个元素。
编辑:我做到了!获取属性的正确方法是使用:
location.setStartElementListener(new StartElementListener(){
public void start(Attributes attributes){
messages.add(currentMessage.copy());
}
});
location.getChild("windDirection").setTextElementListener(new TextElementListener(){
public void end(String body) {
//currentMessage.setTitle(body);
//System.out.println("b="+ body);
}
@Override
public void start(Attributes attributes) {
System.out.println("val" + attributes.getValue("deg"));
currentMessage.setTitle(attributes.getValue("deg"));
}
});
所以现在我得到了我的数据,但由于某种原因,除了最后一个元素(我也为其他 YR.no xmls 测试过)。我应该解决一些错误,但主要步骤已经完成。谢谢大家的回答,尤其是 user306848 指出我使用的方向!
【问题讨论】:
标签: java android xml xmlhttprequest xml-parsing