我正在尝试将以下网站中的一些数据解析为我正在创建的Android应用
此Feed中的数据会不断更新,可以保存从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 :(得分:1)
您使用Attributes对象在正确的轨道上,但您必须使用元素中属性的索引位置。
因此,您需要使用attributes.getName()方法上的for循环遍历元素的属性,直到attributes.getName(i).equals(“Name”)。确定索引后,只需使用属性attributes.getValue(i)。
答案 1 :(得分: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。