0

次のサイトから、作成中のAndroidアプリにデータを解析しようとしています

TFL チューブ データ

このフィードのデータは常に更新され、何もないものから 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

全体を調べて、Line の「Name」属性と「Status」の「Description」属性の値を取得する必要があります。したがって、上記では「Circle」と「Planned Closure」をプルします。これまでに作成したクラスは次のとおりです。

メインクラス

    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);
            }

        }

これに関するヘルプは大歓迎です

ありがとう

4

2 に答える 2

1

Attributes オブジェクトを使用して正しい軌道に乗っていますが、要素内の属性のインデックス位置を使用する必要があります。

したがって、attributes.getName(i).equals("Name") になるまで、attributes.getName() メソッドで for ループを使用して要素の属性を反復処理する必要があります。インデックスを決定したら、属性 attributes.getValue(i) を使用するだけです。

于 2013-02-03T19:11:10.740 に答える
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
}

そしてあなたの最後に要素

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

私はすべてを書くのが面倒なので、属性を取得する方法を示すためだけに書きました。また、 DefaultHandler を直接作成する代わりに、android.saxを使用することを好みます。

于 2013-02-03T19:09:40.957 に答える