我怎么可以解析这样的文件? [英] How can I parse such a document?

查看:147
本文介绍了我怎么可以解析这样的文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,那将是很亲切,如果有人可以帮助我:)
我试图解析这个XML文件:

 <数据>
    <日间及GT;
        <&比赛GT;            <&TEAM1 GT;富< / TEAM1>
            <&TEAM2 GT;富< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>            <场地> 1 LT; /场地>
            < GMT→10:00< / GMT>
            <&GROUPE GT; B< / GROUPE>        < /匹配>        <&比赛GT;            <&TEAM1 GT;富< / TEAM1>
            <&TEAM2 GT;富< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>            <场地> 1 LT; /场地>
            <&北京时间GT; 14:00< / GMT>
            < GROUPE>一种< / GROUPE>        < /匹配>
    < /天>    <日间及GT;
        <&比赛GT;            <&TEAM1 GT;富< / TEAM1>
            <&TEAM2 GT;富< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>            <场地> 1 LT; /场地>
            < GMT→10:00< / GMT>
            <&GROUPE GT; B< / GROUPE>        < /匹配>        <&比赛GT;            <&TEAM1 GT;富< / TEAM1>
            <&TEAM2 GT;富< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>            <场地> 1 LT; /场地>
            <&北京时间GT; 14:00< / GMT>
            < GROUPE>一种< / GROUPE>        < /匹配>
    < /天>< /数据>

但我无法弄清楚如何做到这一点。随着我的解析器我可以分析这样的文件:

 <数据>
    <&比赛GT;        <&TEAM1 GT; AUST< / TEAM1>
        <&TEAM2 GT; IRL< / TEAM2>        < resultfinal>< / resultfinal>
        <&RESULT1 GT;< / RESULT1>
        <&RESULT2 GT;< / RESULT2>        <场地> 1 LT; /场地>
        < GMT→10:00< / GMT>
        <&GROUPE GT; B< / GROUPE>    < /匹配>    <&比赛GT;        <&TEAM1 GT; IND< / TEAM1>
        <&TEAM2 GT; AFG< / TEAM2>        < resultfinal>< / resultfinal>
        <&RESULT1 GT;< / RESULT1>
        <&RESULT2 GT;< / RESULT2>        <场地> 1 LT; /场地>
        <&北京时间GT; 14:00< / GMT>
        < GROUPE>一种< / GROUPE>    < /匹配>
< /数据>

但我不知道如何将数据存储每个<白天方式> 标签

我的XML处理程序是这样的:

  @覆盖
    公共无效的endElement(URI字符串,字符串的localName,字符串QNAME)
            抛出的SAXException {        如果(localName.equalsIgnoreCase(TEAM1))
            data.setTeam1(elementValue);
        否则如果(localName.equalsIgnoreCase(TEAM2))
            data.setTeam2(elementValue);
        否则如果(localName.equalsIgnoreCase(resultfinal))
            data.setResultfinal(elementValue);
        否则如果(localName.equalsIgnoreCase(RESULT1))
            data.setResult1(elementValue);
        否则如果(localName.equalsIgnoreCase(结果2))
            data.setResult2(elementValue);
        否则,如果(localName.equalsIgnoreCase(DATE))
            data.setDate(elementValue);
        否则,如果(localName.equalsIgnoreCase(场地))
            data.setVenue(elementValue);
        否则,如果(localName.equalsIgnoreCase(GMT))
            data.setGmt(elementValue);    }    @覆盖
    公共无效的startElement(URI字符串,字符串的localName,字符串QNAME,
            org.xml.sax.Attributes属性)抛出的SAXException {
        // TODO自动生成方法存根
        super.startElement(URI,localName创建,QNAME,属性);
        elementOn =真;        如果(localName.equals(数据)){
            数据=新XMLGettersSetters();
        }否则如果(localName.equals(匹配)){        }
    }

但随着我能仅仅只有解析像第二文件。我怎样才能解析第一个文件,我应该如何存储数据?我不能把它保存在一个ArrayList。

编辑:

我试图建立它像唐·罗比建议,但我的应用程序总是崩溃。下面是我做的,到目前为止:

MainActivity:

 公共类MainActivity延伸活动{
    XMLHandler数据;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
尝试{
             Log.i(PARSER,versuch!);                / **
                 *创建SAX解析器的新实例
                 ** /                的SAXParserFactory saxPF = SAXParserFactory.newInstance();
                SAXParser的saxP = saxPF.newSAXParser();
                XMLReader的xmlR = saxP.getXMLReader();
                网址URL =新的URL(我的xml文件); //将XML的URL                / **
                 *创建的处理程序来处理每个XML标记。
                 ** /
                 数据=新XMLHandler();
                xmlR.setContentHandler(数据);
                xmlR.parse(新的InputSource(url.openStream()));
            }赶上(例外五){
                的System.out.println(E);
                Log.i(PARSER,ES KLAPPT NICHT!);
            }
        TextView的TXT1 =(的TextView)findViewById(R.id.txtview1);
        txt1.setText(data.getTournament()得到(1)获得(0).getTeam1()的toString());    }

XMLHandler:

 公共类XMLHandler扩展的DefaultHandler {    私人锦标赛赛事;
    私人TournamentDay CURRENTDAY;
    私人匹配currentMatch;
    私人StringBuilder的建设者;    @覆盖
    公共无效的endElement(URI字符串,字符串的localName,字符串QNAME)
            抛出的SAXException {        如果(qName.equalsIgnoreCase(TEAM1))
            currentMatch.setTeam1(builder.toString());
        否则如果(qName.equalsIgnoreCase(TEAM2))
            currentMatch.setTeam2(builder.toString());
        否则如果(qName.equalsIgnoreCase(resultfinal))
            currentMatch.setResultfinal(builder.toString());
        否则如果(qName.equalsIgnoreCase(RESULT1))
            currentMatch.setResult1(builder.toString());
        否则如果(qName.equalsIgnoreCase(结果2))
            currentMatch.setResult2(builder.toString());
        否则,如果(qName.equalsIgnoreCase(场地))
            currentMatch.setVenue(builder.toString());
        否则,如果(qName.equalsIgnoreCase(GMT))
            currentMatch.setGmt(builder.toString());
        否则,如果(用于QName.equals(匹配))
            currentDay.add(currentMatch);
        否则,如果(用于QName.equals(天))
            tournament.add(CURRENTDAY);
    }    @覆盖
    公共无效的startElement(URI字符串,字符串的localName,字符串QNAME,
                             org.xml.sax.Attributes属性)抛出的SAXException {
        如果(用于QName.equals(数据)){
            赛=新的赛会();
        }
        如果(用于QName.equals(天)){
            CURRENTDAY =新TournamentDay();
        }
        否则,如果(用于QName.equals(匹配)){
            currentMatch =新的匹配();
        }
        其他{
            建设者=新的StringBuilder();
        }
    }    @覆盖
    公共无效字符(字符[]字符,诠释开始,诠释长度)抛出的SAXException {
        builder.append(字符,开始位置,长度);
    }    公开锦标赛getTournament(){
        回到比赛;
    }
}

锦标赛:

 公共类锦标赛{    私人列表< TournamentDay>天;    公开锦标赛(){
        this.days =新的ArrayList< TournamentDay>();
    }    公共无效添加(TournamentDay天){
        days.add(天);
    }
    公共TournamentDay得到(int i)以{
       返回days.get(ⅰ);
    }
}

匹配:

 公共类匹配{
    私人字符串TEAM1;
    私人字符串TEAM2;
    私人字符串resultfinal;
    私人字符串RESULT1;
    私人字符串RESULT2;
    私人字符串日期;
    私人字符串地点;
    私人字符串GMT;    公共字符串getTeam1(){
        返回TEAM1;
    }    公共无效setTeam1(字符串TEAM1){
        this.team1 = TEAM1;
    }    公共字符串getTeam2(){
        返回TEAM2;
    }    公共无效setTeam2(字符串TEAM2){
        this.team2 = TEAM2;
    }    公共字符串getResultfinal(){
        返回resultfinal;
    }    公共无效setResultfinal(字符串resultfinal){
        this.resultfinal = resultfinal;
    }    公共字符串getResult1(){
        返回RESULT1;
    }    公共无效setResult1(字符串RESULT1){
        this.result1 = RESULT1;
    }    公共字符串getResult2(){
        返回结果2;
    }    公共无效setResult2(字符串RESULT2){
        this.result2 = RESULT2;
    }    公共字符串GETDATE(){
        归期;
    }    公共无效的setDate(字符串日期){
        this.date =日期;
    }    公共字符串getVenue(){
        返回场地;
    }    公共无效setVenue(字符串会场){
        this.venue =地点;
    }    公共字符串getGmt(){
        返回GMT;
    }    公共无效setGmt(字符串GMT){
        this.gmt = GMT;
    }}

最后我的XML文件:

 <数据>
    <日间及GT;        <&比赛GT;            <&TEAM1 GT; IND< / TEAM1>
            <&TEAM2 GT; AFG< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>
            <日期和GT;&19.09 LT; /日期和GT;
            <场地> 1 LT; /场地>
            <&北京时间GT; 14:00< / GMT>
        < /匹配>        <&比赛GT;            <&TEAM1 GT;工程< / TEAM1>
            <&TEAM2 GT; AFG< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>            <日期和GT;&21.09 LT; /日期和GT;
            <场地> 1 LT; /场地>
            <&北京时间GT; 14:00< / GMT>
        < /匹配>
        <&比赛GT;            <&TEAM1 GT; IND< / TEAM1>
            <&TEAM2 GT;工程< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>
            <日期和GT 23.09< /日期和GT;
            <场地> 2'; /场地>
            < GMT→10:00< / GMT>
        < /匹配>
    < /天>
    <日间及GT;
        <&比赛GT;            <&TEAM1 GT; AUST< / TEAM1>
            <&TEAM2 GT; IRL< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>
            <日期和GT;&19.08 LT; /日期和GT;
            <场地> 1 LT; /场地>
            < GMT→10:00< / GMT>
        < /匹配>
        <&比赛GT;            <&TEAM1 GT; AUST< / TEAM1>
            <&TEAM2 GT;西至< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>
            <日期和GT;&22.09 LT; /日期和GT;
            <场地> 1 LT; /场地>
            <&北京时间GT; 14:00< / GMT>
        < /匹配>
        <&比赛GT;            <&TEAM1 GT;西至< / TEAM1>
            <&TEAM2 GT; IRL< / TEAM2>            < resultfinal>< / resultfinal>
            <&RESULT1 GT;< / RESULT1>
            <&RESULT2 GT;< / RESULT2>            <日期和GT;&24.09 LT; /日期和GT;
            <场地> 1 LT; /场地>
            <&北京时间GT; 14:00< / GMT>
        < /匹配>    < /天>< /数据>

EDIT2:这里是logcat的:

  15 09-17:26:49.299:我/的System.out(3392):显示java.lang.NullPointerException
09-17 15:26:49.299:I /解析器(3392):ES KLAPPT NICHT!
09-17 15:26:49.299:D / AndroidRuntime(3392):关闭VM
09-17 15:26:49.299:W / dalvikvm(3392):主题ID = 1:螺纹未捕获的异常(组= 0xb40a64f0)退出
09-17 15:26:49.299:I /流程(3392):发送信号。 PID:3392 SIG:9
09-17 15:26:49.299:D / AndroidRuntime(3392):从PROCNAME CMDLINE:com.example.xmldownloader
09-17 15:26:49.299:E / AndroidRuntime(3392):在writeCrashedAppName,PKGNAME:com.example.xmldownloader
09-17 15:26:49.299:D / AndroidRuntime(3392):com.example.xmldownloader StringBuffer的:与内容成功写入文件中; com.example.xmldownloader
09-17 15:26:49.299:E / AndroidRuntime(3392):致命异常:主要
09-17 15:26:49.299:E / AndroidRuntime(3392):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.xmldownloader / com.example.xmldownloader.MainActivity}:显示java.lang.NullPointerException
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1698)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1726)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:949)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.os.Handler.dispatchMessage(Handler.java:99)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.os.Looper.loop(Looper.java:130)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.ActivityThread.main(ActivityThread.java:3770)
09-17 15:26:49.299:E / AndroidRuntime(3392):在java.lang.reflect.Method.invokeNative(本机方法)
09-17 15:26:49.299:E / AndroidRuntime(3392):在java.lang.reflect.Method.invoke(Method.java:507)
09-17 15:26:49.299:E / AndroidRuntime(3392):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:880)
09-17 15:26:49.299:E / AndroidRuntime(3392):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:638)
09-17 15:26:49.299:E / AndroidRuntime(3392):在dalvik.system.NativeStart.main(本机方法)
09-17 15:26:49.299:E / AndroidRuntime(3392):因:显示java.lang.NullPointerException
09-17 15:26:49.299:E / AndroidRuntime(3392):在com.example.xmldownloader.MainActivity.onCreate(MainActivity.java:58)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-17 15:26:49.299:E / AndroidRuntime(3392):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1662)
09-17 15:26:49.299:E / AndroidRuntime(3392):11 ...更多


解决方案

吉尔伯托的建议,使对象模型反映了XML模式是不错的。

在您的域间我pretation,我创建了一个类匹配即或多或少你的 XMLGettersSetters ,一类其中只包含一个列表<匹配> ,而一个类锦标赛包含一个列表与LT;节方式>

您当然可以只需重新present全乱作为列表<名单<匹配>> ,但它是一个有点更好的封装这些你自己的类。

我不得不改变所有的引用的localName 使用 QNAME 来代替,这可能只是反映了一个screwup我的测试,但这种近似作品,应该给你们如何处理这种结构的想法。

上面列出的类是pretty微不足道,但在这里他们。

锦标赛 TournamentDay 只是包装了列表:

 公共类锦标赛{    私人列表< TournamentDay>天;    公开锦标赛(){
        this.days =新的ArrayList< TournamentDay>();
    }    公共无效添加(TournamentDay天){
        days.add(天);
    }
}公共类TournamentDay {    私人列表<匹配和GT;火柴;    公共TournamentDay(){
        this.matches =新的ArrayList<匹配和GT;();
    }    公共无效添加(匹配匹配){
        matches.add(匹配);
    }
}

匹配器只是与一群字符串字段和setter方法​​为他们的课。在实际使用中,您可能还需要干将,并且可能不希望所有字段是字符串。

 公共类匹配{
    私人字符串GMT;
    私人字符串TEAM1;
    私人字符串TEAM2;
    私人字符串地点;
    私人字符串RESULT1;
    私人字符串RESULT2;
    私人字符串resultfinal;    公共无效setGmt(String s)将{
        GMT = S;
    }    公共无效setVenue(String s)将{
        场地=秒;
    }    公共无效setResult2(String s)将{
        结果2 = S;
    }    公共无效setResult1(String s)将{
        RESULT1 = S;
    }    公共无效setResultfinal(String s)将{
        resultfinal =秒;
    }    公共无效setTeam2(String s)将{
        TEAM2 =秒;
    }    公共无效setTeam1(String s)将{
        TEAM1 =秒;
    }
}

和处理程序类建设这个结构应该是这个样子,用 getTournament()方法来检索解析后的结果。

 公共类TournamentHandler扩展的DefaultHandler {    私人锦标赛赛事;
    私人TournamentDay CURRENTDAY;
    私人匹配currentMatch;
    私人StringBuilder的建设者;    @覆盖
    公共无效的endElement(URI字符串,字符串的localName,字符串QNAME)
            抛出的SAXException {        如果(qName.equalsIgnoreCase(TEAM1))
            currentMatch.setTeam1(builder.toString());
        否则如果(qName.equalsIgnoreCase(TEAM2))
            currentMatch.setTeam2(builder.toString());
        否则如果(qName.equalsIgnoreCase(resultfinal))
            currentMatch.setResultfinal(builder.toString());
        否则如果(qName.equalsIgnoreCase(RESULT1))
            currentMatch.setResult1(builder.toString());
        否则如果(qName.equalsIgnoreCase(结果2))
            currentMatch.setResult2(builder.toString());
        否则,如果(qName.equalsIgnoreCase(场地))
            currentMatch.setVenue(builder.toString());
        否则,如果(qName.equalsIgnoreCase(GMT))
            currentMatch.setGmt(builder.toString());
        否则,如果(用于QName.equals(匹配))
            currentDay.add(currentMatch);
        否则,如果(用于QName.equals(天))
            tournament.add(CURRENTDAY);
    }    @覆盖
    公共无效的startElement(URI字符串,字符串的localName,字符串QNAME,
                             org.xml.sax.Attributes属性)抛出的SAXException {
        如果(用于QName.equals(数据)){
            赛=新的赛会();
        }
        如果(用于QName.equals(天)){
            CURRENTDAY =新TournamentDay();
        }
        否则,如果(用于QName.equals(匹配)){
            currentMatch =新的匹配();
        }
        其他{
            建设者=新的StringBuilder();
        }
    }    @覆盖
    公共无效字符(字符[]字符,诠释开始,诠释长度)抛出的SAXException {
        builder.append(字符,开始位置,长度);
    }    公开锦标赛getTournament(){
        回到比赛;
    }
}

I have a problem, and it would be very kind if someone could help me out :) I am trying to parse this XML file:

   <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>

But I can't figure out how to accomplish that. With my parser I can parse files like that:

<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>

But I don't know how to store the data for each <day> tag.

My XML Handler looks like this:

@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")) {

        }
    }

But with that I can just only parse files like the second. How can I parse the first file and how should I store the data? I can't store it in an Arraylist.

EDIT:

I tried to build it like Don Roby suggested, but my app always crashes. Here is what I did so far:

MainActivity:

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

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

Match:

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

}

And finally my XML file:

<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: Here is the 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

解决方案

Gilberto's advice to make the object model reflect the XML schema is good.

In my interpretation of your domain, I've created a class Match that is more or less your XMLGettersSetters, a class Day which just contains a List<Match>, and a class Tournament which contains a List<Day>.

You can of course just represent the whole mess as a List<List<Match>>, but it's a bit nicer to encapsulate these in your own classes.

I had to change all your references to localName to use qName instead, which may just reflect a screwup in my testing, but this approximately works and should give the idea of how you can handle this kind of structure.

The classes listed above are pretty trivial, but here they are.

Tournament and TournamentDay are just wrappers around lists:

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 is just a class with a bunch of String fields and setters for them. In real use, you might also want getters, and may not want all the fields to be Strings.

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

And the handler class to build this structure should look something like this, with a getTournament() method to retrieve the result after the parse.

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

这篇关于我怎么可以解析这样的文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆