0

私は問題を抱えています。誰かが私を助けてくれればとても親切です:)私はこのXMLファイルを解析しようとしています:

   <data>
    <day>
        <match>

            <team1>foo</team1>
            <team2>foo</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>

            <venue>1</venue>
            <gmt>10:00</gmt>
            <groupe>B</groupe>

        </match>

        <match>

            <team1>foo</team1>
            <team2>foo</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>

            <venue>1</venue>
            <gmt>14:00</gmt>
            <groupe>A</groupe>

        </match>
    </day>

    <day>
        <match>

            <team1>foo</team1>
            <team2>foo</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>

            <venue>1</venue>
            <gmt>10:00</gmt>
            <groupe>B</groupe>

        </match>

        <match>

            <team1>foo</team1>
            <team2>foo</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>

            <venue>1</venue>
            <gmt>14:00</gmt>
            <groupe>A</groupe>

        </match>
    </day>

</data>

しかし、それを達成する方法がわかりません。私のパーサーを使用すると、次のようなファイルを解析できます。

<data>
    <match>

        <team1>aust</team1>
        <team2>irl</team2>

        <resultfinal></resultfinal>
        <result1></result1>
        <result2></result2>

        <venue>1</venue>
        <gmt>10:00</gmt>
        <groupe>B</groupe>

    </match>

    <match>

        <team1>ind</team1>
        <team2>afg</team2>

        <resultfinal></resultfinal>
        <result1></result1>
        <result2></result2>

        <venue>1</venue>
        <gmt>14:00</gmt>
        <groupe>A</groupe>

    </match>
</data>

<day>しかし、各タグのデータを保存する方法がわかりません。

私の XML ハンドラーは次のようになります。

@Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if (localName.equalsIgnoreCase("team1"))
            data.setTeam1(elementValue);
        else if (localName.equalsIgnoreCase("team2"))
            data.setTeam2(elementValue);
        else if (localName.equalsIgnoreCase("resultfinal"))
            data.setResultfinal(elementValue);
        else if (localName.equalsIgnoreCase("result1"))
            data.setResult1(elementValue);
        else if (localName.equalsIgnoreCase("result2"))
            data.setResult2(elementValue);
        else if (localName.equalsIgnoreCase("date"))
            data.setDate(elementValue);
        else if (localName.equalsIgnoreCase("venue"))
            data.setVenue(elementValue);
        else if (localName.equalsIgnoreCase("gmt"))
            data.setGmt(elementValue);

    }

    @Override
    public void startElement(String uri, String localName, String qName,
            org.xml.sax.Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        elementOn = true;

        if (localName.equals("data")) {
            data = new XMLGettersSetters();
        } else if (localName.equals("match")) {

        }
    }

しかし、それでは、2番目のようなファイルしか解析できません。最初のファイルを解析するにはどうすればよいですか?また、データを保存するにはどうすればよいですか? Arraylist に格納できません。

編集:

Don Roby が提案したようにビルドしようとしましたが、私のアプリは常にクラッシュします。これが私がこれまでにしたことです:

主な活動:

public class MainActivity extends Activity {
    XMLHandler data;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


try {
             Log.i("PARSER", "versuch!");

                /**
                 * Create a new instance of the SAX parser
                 **/

                SAXParserFactory saxPF = SAXParserFactory.newInstance();
                SAXParser saxP = saxPF.newSAXParser();
                XMLReader xmlR = saxP.getXMLReader();


                URL url = new URL("my xml file"); // URL of the XML

                /** 
                 * Create the Handler to handle each of the XML tags. 
                 **/
                 data = new XMLHandler();
                xmlR.setContentHandler(data);
                xmlR.parse(new InputSource(url.openStream()));


            } catch (Exception e) {
                System.out.println(e);
                Log.i("PARSER", "ES KLAPPT NICHT!");
            }




        TextView txt1 = (TextView) findViewById(R.id.txtview1);
        txt1.setText(data.getTournament().get(0).get(0).getTeam1().toString());

    }

XMLHandler:

public class XMLHandler extends DefaultHandler {

    private Tournament tournament;
    private TournamentDay currentDay;
    private Match currentMatch;
    private StringBuilder builder;

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if (qName.equalsIgnoreCase("team1"))
            currentMatch.setTeam1(builder.toString());
        else if (qName.equalsIgnoreCase("team2"))
            currentMatch.setTeam2(builder.toString());
        else if (qName.equalsIgnoreCase("resultfinal"))
            currentMatch.setResultfinal(builder.toString());
        else if (qName.equalsIgnoreCase("result1"))
            currentMatch.setResult1(builder.toString());
        else if (qName.equalsIgnoreCase("result2"))
            currentMatch.setResult2(builder.toString());
        else if (qName.equalsIgnoreCase("venue"))
            currentMatch.setVenue(builder.toString());
        else if (qName.equalsIgnoreCase("gmt"))
            currentMatch.setGmt(builder.toString());
        else if (qName.equals("match"))
            currentDay.add(currentMatch);
        else if (qName.equals("day"))
            tournament.add(currentDay);
    }

    @Override
    public void startElement(String uri, String localName, String qName,
                             org.xml.sax.Attributes attributes) throws SAXException {
        if (qName.equals("data")) {
            tournament = new Tournament();
        }
        if (qName.equals("day")) {
            currentDay = new TournamentDay();
        }
        else if (qName.equals("match")) {
            currentMatch = new Match();
        }
        else {
            builder = new StringBuilder();
        }
    }

    @Override
    public void characters(char[] chars, int start, int length) throws SAXException {
        builder.append(chars, start, length);
    }

    public Tournament getTournament() {
        return tournament;
    }
}

トーナメント:

public class Tournament {

    private List<TournamentDay> days;

    public Tournament() {
        this.days = new ArrayList<TournamentDay>();
    }

    public void add(TournamentDay day) {
        days.add(day);
    }
    public TournamentDay get(int i) {
       return days.get(i); 
    }
}

マッチ:

public class Match {
    private String team1;
    private String team2;
    private String resultfinal;
    private String result1;
    private String result2;
    private String date;
    private String venue;
    private String gmt;

    public String getTeam1() {
        return team1;
    }

    public void setTeam1(String team1) {
        this.team1 = team1;
    }

    public String getTeam2() {
        return team2;
    }

    public void setTeam2(String team2) {
        this.team2 = team2;
    }

    public String getResultfinal() {
        return resultfinal;
    }

    public void setResultfinal(String resultfinal) {
        this.resultfinal = resultfinal;
    }

    public String getResult1() {
        return result1;
    }

    public void setResult1(String result1) {
        this.result1 = result1;
    }

    public String getResult2() {
        return result2;
    }

    public void setResult2(String result2) {
        this.result2 = result2;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getVenue() {
        return venue;
    }

    public void setVenue(String venue) {
        this.venue = venue;
    }

    public String getGmt() {
        return gmt;
    }

    public void setGmt(String gmt) {
        this.gmt = gmt;
    }

}

そして最後に私の XML ファイル:

<data>
    <day>

        <match>

            <team1>ind</team1>
            <team2>afg</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>
            <date>19.09</date>
            <venue>1</venue>
            <gmt>14:00</gmt>


        </match>

        <match>

            <team1>eng</team1>
            <team2>afg</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>

            <date>21.09</date>
            <venue>1</venue>
            <gmt>14:00</gmt>


        </match>
        <match>

            <team1>ind</team1>
            <team2>eng</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>
            <date>23.09</date>
            <venue>2</venue>
            <gmt>10:00</gmt>


        </match>
    </day>
    <day>
        <match>

            <team1>aust</team1>
            <team2>irl</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>
            <date>19.08</date>
            <venue>1</venue>
            <gmt>10:00</gmt>


        </match>
        <match>

            <team1>aust</team1>
            <team2>west</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>
            <date>22.09</date>
            <venue>1</venue>
            <gmt>14:00</gmt>


        </match>
        <match>

            <team1>west</team1>
            <team2>irl</team2>

            <resultfinal></resultfinal>
            <result1></result1>
            <result2></result2>

            <date>24.09</date>
            <venue>1</venue>
            <gmt>14:00</gmt>


        </match>

    </day>

</data>

Edit2: ここに logcat があります:

09-17 15:26:49.299: I/System.out(3392): java.lang.NullPointerException
09-17 15:26:49.299: I/PARSER(3392): ES KLAPPT NICHT!
09-17 15:26:49.299: D/AndroidRuntime(3392): Shutting down VM
09-17 15:26:49.299: W/dalvikvm(3392): threadid=1: thread exiting with uncaught exception (group=0xb40a64f0)
09-17 15:26:49.299: I/Process(3392): Sending signal. PID: 3392 SIG: 9
09-17 15:26:49.299: D/AndroidRuntime(3392): procName from cmdline: com.example.xmldownloader
09-17 15:26:49.299: E/AndroidRuntime(3392): in writeCrashedAppName, pkgName :com.example.xmldownloader
09-17 15:26:49.299: D/AndroidRuntime(3392): file written successfully with content: com.example.xmldownloader StringBuffer : ;com.example.xmldownloader
09-17 15:26:49.299: E/AndroidRuntime(3392): FATAL EXCEPTION: main
09-17 15:26:49.299: E/AndroidRuntime(3392): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.xmldownloader/com.example.xmldownloader.MainActivity}: java.lang.NullPointerException
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1698)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1726)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:949)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.os.Looper.loop(Looper.java:130)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.ActivityThread.main(ActivityThread.java:3770)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at java.lang.reflect.Method.invokeNative(Native Method)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at java.lang.reflect.Method.invoke(Method.java:507)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:638)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at dalvik.system.NativeStart.main(Native Method)
09-17 15:26:49.299: E/AndroidRuntime(3392): Caused by: java.lang.NullPointerException
09-17 15:26:49.299: E/AndroidRuntime(3392):     at com.example.xmldownloader.MainActivity.onCreate(MainActivity.java:58)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-17 15:26:49.299: E/AndroidRuntime(3392):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1662)
09-17 15:26:49.299: E/AndroidRuntime(3392):     ... 11 more
4

3 に答える 3

2

XMLスキーマを反映するオブジェクトモデルを使用することをお勧めします。このようなもの: 8つのフィールド(team1、team2、result1など)を含むのDayを含むと呼ばれるオブジェクト。CollectionMatches

そのモデルでは、パーサーが行う必要があるのは、解析プロセス中にオブジェクトを構築することだけです。

これにより、XMLファイルをXStreamなどのJavaオブジェクトに変換するためだけに構築された優れたフレームワークを使用することもできます。

于 2012-09-16T16:32:06.640 に答える
2

オブジェクト モデルに XML スキーマを反映させるという Gilberto のアドバイスは良いものです。

あなたのドメインの私の解釈では、Match多かれ少なかれあなたXMLGettersSettersのクラスDay、 だけを含むList<Match>クラス、およびTournamentを含むクラスを作成しましたList<Day>

もちろん、混乱全体を として表現することもできますが、List<List<Match>>これらを独自のクラスにカプセル化する方が少し便利です。

localName代わりに使用するすべての参照を変更する必要がqNameありましたが、これは私のテストでの失敗を反映している可能性がありますが、これはほぼ機能し、この種の構造をどのように処理できるかについてのアイデアを与えるはずです.

上記のクラスは非常に些細なものですが、ここにあります。

TournamentTournamentDayリストの単なるラッパーです:

public class Tournament {

    private List<TournamentDay> days;

    public Tournament() {
        this.days = new ArrayList<TournamentDay>();
    }

    public void add(TournamentDay day) {
        days.add(day);
    }
}

public class TournamentDay {

    private List<Match> matches;

    public TournamentDay() {
        this.matches = new ArrayList<Match>();
    }

    public void add(Match match) {
        matches.add(match);
    }
}

Matcher一連の文字列フィールドとそれらのセッターを持つ単なるクラスです。実際の使用では、getter も必要になる場合があり、すべてのフィールドを String にしたくない場合があります。

public class Match {
    private String gmt;
    private String team1;
    private String team2;
    private String venue;
    private String result1;
    private String result2;
    private String resultfinal;

    public void setGmt(String s) {
        gmt = s;
    }

    public void setVenue(String s) {
        venue = s;
    }

    public void setResult2(String s) {
        result2 = s;
    }

    public void setResult1(String s) {
        result1 = s;
    }

    public void setResultfinal(String s) {
        resultfinal = s;
    }

    public void setTeam2(String s) {
        team2 = s;
    }

    public void setTeam1(String s) {
        team1 = s;
    }
}

この構造を構築するためのハンドラ クラスはgetTournament()、解析後に結果を取得するメソッドを使用して、次のようになります。

public class TournamentHandler extends DefaultHandler {

    private Tournament tournament;
    private TournamentDay currentDay;
    private Match currentMatch;
    private StringBuilder builder;

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if (qName.equalsIgnoreCase("team1"))
            currentMatch.setTeam1(builder.toString());
        else if (qName.equalsIgnoreCase("team2"))
            currentMatch.setTeam2(builder.toString());
        else if (qName.equalsIgnoreCase("resultfinal"))
            currentMatch.setResultfinal(builder.toString());
        else if (qName.equalsIgnoreCase("result1"))
            currentMatch.setResult1(builder.toString());
        else if (qName.equalsIgnoreCase("result2"))
            currentMatch.setResult2(builder.toString());
        else if (qName.equalsIgnoreCase("venue"))
            currentMatch.setVenue(builder.toString());
        else if (qName.equalsIgnoreCase("gmt"))
            currentMatch.setGmt(builder.toString());
        else if (qName.equals("match"))
            currentDay.add(currentMatch);
        else if (qName.equals("day"))
            tournament.add(currentDay);
    }

    @Override
    public void startElement(String uri, String localName, String qName,
                             org.xml.sax.Attributes attributes) throws SAXException {
        if (qName.equals("data")) {
            tournament = new Tournament();
        }
        if (qName.equals("day")) {
            currentDay = new TournamentDay();
        }
        else if (qName.equals("match")) {
            currentMatch = new Match();
        }
        else {
            builder = new StringBuilder();
        }
    }

    @Override
    public void characters(char[] chars, int start, int length) throws SAXException {
        builder.append(chars, start, length);
    }

    public Tournament getTournament() {
        return tournament;
    }
}
于 2012-09-16T18:09:40.827 に答える
1

を使用してみてください。完璧DOM parserにあらゆる部分にアクセスできます。Object Model tree

さらに制御したい場合は、下記のXMLパーサーを試してください。

- JAXP AND JAXB

- Castor

于 2012-09-16T16:31:56.043 に答える