2011-09-15 23 views
1

我一直试图让它工作三个小时。这些是我试过的两段代码和到xml文件的链接。有人可以告诉我什么即时做错或如何轻松做到这一点?我只想在“current_conditions”元素中获取当前临时存储为“temp_f”的临时值。如果有更好的做法比我想知道的任何一次尝试都好。非常感谢!如何解析Android中的天气xml数据

这里是一个XML文件,我从网上下载的链接: http://www.google.com/ig/api?weather=10598

这是我用它来从网络中的XML数据的代码:

HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(url); 
     // HttpGet get = new HttpGet(); 
     try { 
      HttpResponse rsp = client.execute(get); 
      String xmltemp = EntityUtils.toString(rsp.getEntity()); 
      System.out.println(xmltemp); 

然后,我都尝试这些尝试解析XML,但都没有工作。

 DocumentBuilderFactory factory1 = DocumentBuilderFactory 
       .newInstance(); 
     factory1.setNamespaceAware(true); // never forget this! 
     InputSource source = new InputSource(new StringReader(xmltemp)); 
     Document doc = factory1.newDocumentBuilder().parse(source); 
     doc.getDocumentElement().normalize(); 
     System.out.println("Root element " 
       + doc.getDocumentElement().getNodeName()); 
     Log.d("OUTPUT","Root element " 
       + doc.getDocumentElement().getNodeName()); 
     NodeList nodeLst = doc.getElementsByTagName("weather"); 

     for (int s = 0; s < nodeLst.getLength(); s++) { 

      Node fstNode = nodeLst.item(s); 

      if (fstNode.getNodeType() == Node.ELEMENT_NODE) { 

       Element fstElmnt = (Element) fstNode; 

       NodeList fstNmElmntLst = ((Document) fstElmnt) 
         .getElementsByTagName("module_id"); 
       Element fstNmElmnt = (Element) fstNmElmntLst.item(0); 
       NodeList fstNm = ((Node) fstNmElmnt).getChildNodes(); 
       System.out.println(((Node) fstNm.item(0)).getNodeValue()); 
       newal.add("" + ((Node) fstNm.item(0)).getNodeValue()); 
       Log.d("OUTPUT","" + ((Node) fstNm.item(0)).getNodeValue()); 
      } 

     } 

而且这样的:

DocumentBuilderFactory factory1 = DocumentBuilderFactory 
      .newInstance(); factory1.setNamespaceAware(true); // never forget this! 
      InputSource source = new InputSource(new 
      StringReader(xmltemp)); Document doc = 
      factory1.newDocumentBuilder().parse(source); 

      XPathFactory factory11 = XPathFactory.newInstance(); XPath xpath1 
      = factory11.newXPath(); XPathExpression expr1 = xpath1 .compile(
      "//forecast_information[postal_code='10598']/forecast_date/text()" 
      ); Object result = expr1.evaluate(doc, XPathConstants.NODESET); 

       NodeList nodes = (NodeList) result; for (int i = 0; i < 
       nodes.getLength(); i++) { 
       System.out.println(nodes.item(i).getNodeValue()); 
       Log.d("1010101010101",nodes.item(i).getNodeValue()); } 

编辑: 所以这是代码即时试图使用现在,但我每次运行它的时候我得到这个错误的logcat:

09-15 20:26:47.359: DEBUG/ErOr(17663): java.lang.ClassCastException: org.apache.harmony.xml.dom.ElementImpl 

这是代码:

DocumentBuilderFactory factory1 = DocumentBuilderFactory.newInstance(); 
      factory1.setNamespaceAware(true); // never forget this! 
      InputSource source = new InputSource(new StringReader(xmltemp)); 
      Document doc = factory1.newDocumentBuilder().parse(source); 

      String newstring = "" + ((DocumentBuilderFactory) ((Document) doc.getDocumentElement(). 
       getElementsByTagName("current_conditions").item(0)). 
       getElementsByTagName("temp_f").item(0)). 
       getAttribute("data"); 

回答

0

您需要了解的一件事是“module_id”不是一个元素,它是一个属性。所以你不能通过getElementsByTagName(“module_id”)来检索它的值。另外,fstElmnt永远不会是文档 - 它是一个元素,正如您使用getNodeType()所确定的那样。要获得module_id,你应该尝试:fstElement.getAttribute(“module_id”)。

但还是回到你的主要问题:得到的温度值,试试这个:

doc.getDocumentElement(). 
    getElementsByTagName("current_conditions").item(0). 
    getElementsByTagName("temp_f").item(0). 
    getAttribute("data"); 

我认为这就是它 - 未经测试!

+0

我试过,但getChildNodes说“类型节点中的方法getChildNodes()不适用于参数(字符串)” – Peter

+0

你是绝对正确的 - 面对手掌 - DOM API真的很糟糕 - 我已经成为过去习惯于使用JDOM,这更加安全。我将编辑答案... –

+0

谢谢...也许这是一个愚蠢的问题,但我如何获取数据到一个字符串,所以我可以测试,看看它实际上是否工作? – Peter