从互联网解析xml(yr.no)

时间:2012-02-29 13:22:15

标签: java android xml xmlhttprequest xml-parsing

我对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,他指出了我使用的方向!

3 个答案:

答案 0 :(得分:2)

使用Dom Parser .......这很容易......

从这里看一些教程,

http://www.roseindia.net/xml/dom/

答案 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将是一个很好的候选人。它接收属于特定标记的属性。