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

我没有经验的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 titles = new ArrayList(messages.size()); System.out.println(messages.size()); for (Message msg : messages) { titles.add(msg.getTitle()); } ArrayAdapter adapter = new ArrayAdapter(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数据的问题是每个末端子节点不仅包含一个值,而是可以有更多标签(例如 )。 因此,当我更改元素以使用此元素时,它会结束到25个不同的String (如果您计算的是具有标记waveDirection所有不同子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,他指出了我使用的方向!

我认为你的代码假定有一个文本节点代表你寻求的值。 yr.no域中的xml文件不是这种情况。

您需要弄清楚如何从您使用的xml库的标记中读取属性。

我没有使用android开发的经验,但是你使用android.sax包吗? 然后我认为android.sax.StartElementListener将是一个很好的候选人。 它接收属于特定标记的属性。

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

从这里看一些教程,

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

使用此示例 。

他正在使用本地存储的XML文件。 如果您获取XML Feed,请将代码更改为以下内容:

  URL url = new URL("ENTER XML LINK"); InputStream stream = url.openStream(); Document doc = docBuilder.parse(stream);