2013-02-03 159 views
0

我想从以下站点分析一些数据,以一个Android应用程序,我永远在这饲料创建从XML获取属性值的Java

TFL Tube Data

的数据是不断更新的,可以容纳从什么都没有到15/16项目。每个项目的基本格式如下:

<ArrayOfLineStatus> - BEGINNING OF XML DOCUMENT  
    <LineStatus ID="10" StatusDetails="No service this weekend due to planned engineering work."> 
     <BranchDisruptions/> 
     <Line ID="7" Name="Circle"/> 
     <Status ID="CS" CssClass="DisruptedService" Description="Planned Closure" IsActive="true"> 
      <StatusType ID="1" Description="Line"/> 
     </Status> 
    </LineStatus> 
<ArrayOfLineStatus> - END OF XML DOCUMENT 

我需要经过整个拉的线“名称”和“状态”,“说明”的属性的值。所以在上面我会拉动“圈子”和“计划闭幕”。到目前为止,我已经取得的类如下:

主类

public class TubeStatusXMLParsing extends Activity { 

     static final String baseURL = "http://cloud.tfl.gov.uk/TrackerNet  
              /LineStatus/IncidentsOnly"; 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle icicle) { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build(); 
      StrictMode.setThreadPolicy(policy); 
      super.onCreate(icicle); 
      setContentView(R.layout.tube_status); 
      getStatus();   
      } 

     public void getStatus() { 
     // TODO Auto-generated method stub 
     try{ 
      URL website = new URL(baseURL); 
      //getting xmlreader to parse data 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 
      HandlingXMLStuff doingWork = new HandlingXMLStuff(); 
      xr.setContentHandler(doingWork); 
      xr.parse(new InputSource(website.openStream())); 
      String listofStatuses = doingWork.getInformation(); 
      circleStatus.setText(listofStatuses); 
     }catch (Exception e){ 
      circleStatus.setText("error"); 
     } 
    } 
} 

处理XML

import java.util.ArrayList; 
import java.util.List; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

import android.sax.Element; 
import android.sax.RootElement; 

public class HandlingXMLStuff extends DefaultHandler { 

    private ArrayList<String>statuses = null; 
    String status; 
    String lineName; 

    public String getInformation(){ 
     return statuses.get(0); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     if(qName.equalsIgnoreCase("ArrayOfLineStatus")){ 
      statuses = new ArrayList<String>(); 
     }else if(qName.equalsIgnoreCase("Status")){ 
      status = attributes.getValue("Status"); 
      statuses.add(status); 
      } 

     } 

任何帮助,将不胜感激

谢谢

+0

什么实际问题?它不工作吗?它会抛出任何异常吗? –

+2

我没有看到XML –

+0

名为“状态”的属性@NikitaBeloglazov代码不工作,当我尝试查看运行它我的手机TextView的空白,在那里,因为它应该显示“计划关闭”上。 –

回答

0

很难理解你需要什么,但你得到的属性是错误的。 我觉得它应该以某种方式这样

else if (qName.equalsIgnoreCase("Status")) { 
    object = new Status(); 
    object.id = attributes.getValue("ID"); 
    object.cssClass = attributes.getValue("CssClass"); 
    object.isActive = attributes.getValue("IsActive"); 
    object.description = attributes.getValue("Description"); 
} 
else if (qName.equalsIgnoreCase("StatusType")) { 
    object.typeId = attributes.getValue("ID"); 
    //etc, and maybe the StatusType should be a nested class of Status and stored in array field 
} 

而在你的endElement

if (qName.equalsIgnoreCase("Status")) { 
    statuses.add(object); 
} 

我懒得写了整个事情,我写它只是为了说明如何获取属性。 此外,我更喜欢使用android.sax而不是直接创建DefaultHandler。

+0

他真的需要“描述”属性,因为我从他的评论中了解到。 –

+0

正确的,我需要的“状态”标签中的“说明”属性和“名称”属性从“线”的标签 –

+0

好吧,更新,但它是从答案显而易见如何获得描述 - 就像其他属性的名称:) –

1

您正在使用的属性对象在正确的轨道上,但你必须使用该元素中的属性的索引位置。

因此需要使用一个通过元素的属性来迭代用于在attributes.getName()方法循环,​​直到attributes.getName(ⅰ).equals(“姓名”)。一旦确定了索引,只需使用attribute attributes.getValue(i)即可。