我对xml解析没有经验,所以也许我写的一些东西看起来很愚蠢,也许我的一些术语不太正确..请原谅。
我开发了一个Android应用程序,需要解析来自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个不同的String
s(如果您计算的是具有标记waveDirection
的所有不同子项),但每个值都为空(如{{{ 1}})。我没有得到任何错误,我只得到一个包含25个空字符串的列表。我尝试触及元素的方式如下:
String a = ""
那么我应该如何修改它以使它适用于这个xml?我不提供所有类和方法(如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()
,因为它找到了文档的根和25个元素。
feedUrlString = "http://api.yr.no/weatherapi/seaapproachforecast/1.0/?location=stad";
所以现在我得到了我的数据,但由于某些原因除了最后一个元素之外(我也测试了其他YR.no xmls)..必须有一些我应该解决的错误,但主要步骤已经完成。谢谢大家的答案,特别是user306848,他指出了我使用的方向!
答案 0 :(得分:2)
答案 1 :(得分:1)
使用this example。
他正在使用本地存储的XML文件。如果您获取XML Feed,请将代码更改为以下内容:
URL url = new URL("ENTER XML LINK");
InputStream stream = url.openStream();
Document doc = docBuilder.parse(stream);
答案 2 :(得分:1)
我认为您的代码假定存在表示您寻求的值的文本节点。 yr.no域中的xml文件不是这种情况。
您需要弄清楚如何从您使用的xml库的标签中读取属性。
我没有使用android开发的经验,但是你使用android.sax包吗?那么我认为android.sax.StartElementListener
将是一个很好的候选人。它接收属于特定标记的属性。