这个xml解析器(Android)有什么问题?

这个xml解析器(Android)有什么问题?,android,xml,parsing,sax,Android,Xml,Parsing,Sax,我想解析一个xml文件。我正试图找到错误,但找不到。你能帮我吗? xml: 以及我活动的分析部分: private void readXML() { // TODO Auto-generated method stub Log.d("FUNC","READXML"); try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAX

我想解析一个xml文件。我正试图找到错误,但找不到。你能帮我吗? xml:

以及我活动的分析部分:

private void readXML() {
    // TODO Auto-generated method stub
    Log.d("FUNC","READXML");
    try {

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        XMLParser xp = new XMLParser(dataContainer);
        xr.setContentHandler(xp);
        InputStream is = getResources().openRawResource(
                R.raw.data);
        xr.parse(new InputSource(is));

    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        Log.d("PARSERCONFEX","PARSERCONFEX");
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        Log.d("SAXEX","SAXEX");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.d("IOEX","IOEX");
        e.printStackTrace();
    }

}
从log.d()中,我可以看到只创建了来自构造函数的日志、“CHARS”和“END”日志。 这是我的日志:

12-06 06:38:11.063: E/Trace(629): error opening trace file: No such file or directory (2)
12-06 06:38:11.623: D/FUNC(629): INIT
12-06 06:38:11.623: D/FUNC(629): READXML
12-06 06:38:11.643: D/FUNC(629): XMLPARSER()
12-06 06:38:11.664: D/CHARS(629): CHARS
12-06 06:38:11.664: D/CHARS(629): CHARS
12-06 06:38:11.664: D/CHARS(629): CHARS
12-06 06:38:11.664: D/CHARS(629): CHARS
12-06 06:38:11.664: D/CHARS(629): CHARS
12-06 06:38:11.673: D/END(629): END
12-06 06:38:11.673: D/CHARS(629): CHARS
12-06 06:38:11.673: D/CHARS(629): CHARS
12-06 06:38:11.673: D/CHARS(629): CHARS
12-06 06:38:11.673: D/END(629): END
12-06 06:38:11.673: D/CHARS(629): CHARS
12-06 06:38:11.673: D/CHARS(629): CHARS
12-06 06:38:11.683: D/CHARS(629): CHARS
12-06 06:38:11.683: D/END(629): END
12-06 06:38:11.683: D/CHARS(629): CHARS
12-06 06:38:11.683: D/CHARS(629): CHARS
12-06 06:38:11.683: D/CHARS(629): CHARS
12-06 06:38:11.683: D/END(629): END
12-06 06:38:11.683: D/CHARS(629): CHARS
12-06 06:38:11.683: D/CHARS(629): CHARS
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.693: D/END(629): END
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.693: D/END(629): END
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.693: D/CHARS(629): CHARS
12-06 06:38:11.703: D/CHARS(629): CHARS
12-06 06:38:11.703: D/END(629): END
12-06 06:38:11.703: D/CHARS(629): CHARS
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.713: D/END(629): END
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.713: D/END(629): END
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.713: D/CHARS(629): CHARS
12-06 06:38:11.723: D/CHARS(629): CHARS
12-06 06:38:11.723: D/END(629): END
12-06 06:38:11.723: D/CHARS(629): CHARS
12-06 06:38:11.723: D/CHARS(629): CHARS
12-06 06:38:11.723: D/CHARS(629): CHARS
12-06 06:38:11.723: D/END(629): END
12-06 06:38:11.733: D/CHARS(629): CHARS
12-06 06:38:11.733: D/CHARS(629): CHARS
12-06 06:38:11.733: D/END(629): END
12-06 06:38:11.733: D/CHARS(629): CHARS
12-06 06:38:11.733: D/CHARS(629): CHARS
12-06 06:38:11.733: D/END(629): END
12-06 06:38:12.063: I/Choreographer(629): Skipped 77 frames!  The application may be doing too much work on its main thread.
12-06 06:38:12.093: D/gralloc_goldfish(629): Emulator without GPU emulation detected.

下面是一个使用SAX的示例

JAVA类 数据

public class Data {

    private Integer id;
    private String name;
    private Integer age;
    private String phone;
    private String address;


    public Data(){}


    public Integer getId() {
        return id;
    }


    public void setId(Integer id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getPhone() {
        return phone;
    }


    public void setPhone(String phone) {
        this.phone = phone;
    }


    public String getAddress() {
        return address;
    }


    public void setAddress(String address) {
        this.address = address;
    }


    public Integer getAge() {
        return age;
    }


    public void setAge(Integer age) {
        this.age = age;
    }


}
数据处理程序

public class DatasHandler extends DefaultHandler {

    private ArrayList<Data> alDatas;
    private Data data;
    private String reading;

    public DatasHandler(){}

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        if(qName.equals("maintag")){
            alDatas = new ArrayList<>();
        }
        if(qName.equals("data")){
            data = new Data();
        }

    }

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

        if(qName.equals("data")){
            alDatas.add(data);
            data = null;
        }
        if(qName.equals("id")){
            data.setId(Integer.parseInt(reading));
        }
        if(qName.equals("name")){
            data.setName(reading);
        }
        if(qName.equals("age")){
            data.setAge(Integer.parseInt(reading));
        }
        if(qName.equals("phone")){
            data.setPhone(reading);
        }
        if(qName.equals("address")){
            data.setAddress(reading);
        }

    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        reading = new String(ch, start, length);
    }

    public ArrayList<Data> getAlDatas() {
        return alDatas;
    }


}
public final class XMLManager {

    public static ArrayList<Data> getAlDatas(){
        ArrayList<Data> alDatas = null;
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            DatasHandler dHandler = new DatasHandler();
            parser.parse(new File("D:\\Loic_Workspace\\SaxExample\\res\\test.xml"), dHandler);
            alDatas = dHandler.getAlDatas();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return alDatas;
    }


}
你似乎想在Android上使用它。因此,我认为您可以在XMLManager类中执行以下操作:

InputSource in = new InputSource(getResources().openRawResource(R.raw.data));
parser.parse(in, dHandler);

告诉我它是否有效,

“我试图找出错误,但是我找不到它。”我们既找不到它,也没有找到一个你认为是错误的堆栈跟踪或适当的描述。错误是它没有创建我的对象数据流数据。它不会进入应该在其中创建currentData实例的if交叉点。(而且它不是进入应该记录“Maintagfound”的交叉口。我也会试试这个!谢谢你的回答!
public final class XMLManager {

    public static ArrayList<Data> getAlDatas(){
        ArrayList<Data> alDatas = null;
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            DatasHandler dHandler = new DatasHandler();
            parser.parse(new File("D:\\Loic_Workspace\\SaxExample\\res\\test.xml"), dHandler);
            alDatas = dHandler.getAlDatas();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return alDatas;
    }


}
public class MyMain {

    /**
     * @param args
     */
    public static void main(String[] args) {

        ArrayList<Data> alDatas = XMLManager.getAlDatas();

        for(Data d:alDatas){
            System.out.println(d.getName());
            System.out.println(d.getId());
            System.out.println(d.getAge());
            System.out.println(d.getPhone());
            System.out.println(d.getAddress());
            System.out.println("--------------------");
        }

    }

}
x y
1
16
06/30 123-4567
Veszprem Valami ut 10.
--------------------
p q
2
18
06/70 987-6543
Budapest Ulloi ut 21.
--------------------
InputSource in = new InputSource(getResources().openRawResource(R.raw.data));
parser.parse(in, dHandler);