Android 从SD卡上的XML文件读取时出现问题

Android 从SD卡上的XML文件读取时出现问题,android,xml,Android,Xml,朋友们,我在从SD卡上的xml文件读取信息时遇到了一个问题。代码正在成功实现,但logcat上没有显示任何内容,也没有出现异常。请帮我做同样的事 public class History extends Activity { private ListView lstv; static ArrayList<Records> arr; @Override protected void onSaveInstanceState(Bundle outStat

朋友们,我在从SD卡上的xml文件读取信息时遇到了一个问题。代码正在成功实现,但logcat上没有显示任何内容,也没有出现异常。请帮我做同样的事

public class History extends Activity
{
    private ListView lstv;

    static ArrayList<Records> arr;

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        setContentView(R.layout.history);

        try {


            String path = Environment.getExternalStorageDirectory()+"/saved_images/history.xml"; 
            File file = new File(path);
            SAXParserFactory factory=SAXParserFactory.newInstance();
            SAXParser parser=factory.newSAXParser();
            XMLReader reader=parser.getXMLReader();

            XMLHandler handler=new XMLHandler();

            //parser.parse(stream,handler);
            reader.parse(new InputSource(new InputStreamReader(new FileInputStream(file))));

            arr=handler.getArray();

            ArrayAdapter<Records> adpt=new ArrayAdapter<Records>(this, android.R.layout.simple_list_item_1,arr);
            //lstv.setAdapter(adpt);                    

            handler.startDocument();

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    class XMLHandler extends DefaultHandler {

        ArrayList<Records> array;
        Records records ;
        String strCurrentValue = null;

        public ArrayList<Records> getArray() {
            return array;
        }

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            array=new ArrayList<Records>();
        }

        @Override
        public void startElement(String uri, String elementName, String qName,Attributes attributes) throws SAXException {
            super.startElement(uri, elementName, qName, attributes);

            if(elementName.equals("Record"))
            {
                records=new Records();
            }
        }

        @Override
        public void characters(char[] ch, int start, int length)
        throws SAXException {
            super.characters(ch, start, length);

            strCurrentValue=new String(ch, start, length);
        }

        @Override
        public void endElement(String uri, String elementName, String qName)
        throws SAXException {
            super.endElement(uri, elementName, qName);
            if(elementName.equals("date"))
            {
                records.date=strCurrentValue;
            }else if(elementName.equals("cc"))
            {
                records.cc=strCurrentValue;
            }

        }

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();

            for(Records c:array)
            {
                Log.d("XmlHandler", c.toString());
            }
        }
    }
}
公共类历史扩展活动
{
私有ListView lstv;
静态阵列列表;
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
//TODO自动生成的方法存根
super.onSaveInstanceState(超出状态);
setContentView(R.layout.history);
试一试{
字符串路径=Environment.getExternalStorageDirectory()+“/saved_images/history.xml”;
文件=新文件(路径);
SAXParserFactory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader=parser.getXMLReader();
XMLHandler=新的XMLHandler();
//parser.parse(流,处理程序);
parse(newInputSource(newInputStreamReader(newFileInputStream(file)));
arr=handler.getArray();
ArrayAdapter adpt=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,arr);
//lstv.setAdapter(adpt);
handler.startDocument();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}捕获(SAXE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
类XMLHandler扩展了DefaultHandler{
数组列表数组;
记录;
字符串strCurrentValue=null;
公共数组列表getArray(){
返回数组;
}
@凌驾
public void startDocument()引发异常{
super.startDocument();
数组=新的ArrayList();
}
@凌驾
public void startElement(字符串uri、字符串elementName、字符串qName、属性)引发SAXException{
startElement(uri、elementName、qName、属性);
if(elementName.equals(“记录”))
{
记录=新记录();
}
}
@凌驾
公共无效字符(字符[]ch,整数开始,整数长度)
抛出SAX异常{
超级字符(ch、开始、长度);
strCurrentValue=新字符串(ch、开始、长度);
}
@凌驾
public void endElement(字符串uri、字符串elementName、字符串qName)
抛出SAX异常{
super.endElement(uri、elementName、qName);
if(elementName.equals(“日期”))
{
记录。日期=strCurrentValue;
}else if(elementName.equals(“cc”))
{
records.cc=strCurrentValue;
}
}
@凌驾
public void endDocument()引发异常{
super.endDocument();
用于(记录c:数组)
{
Log.d(“XmlHandler”,c.toString());
}
}
}
}
我无法在log cat或屏幕上看到任何内容。请使用代码片段帮助我获得相同的代码。
谢谢

在我看来,您的处理程序实际上从未将记录添加到数组中-看起来您需要为“record”类型的endElement包含一个操作,该操作将记录添加到数组中


另外,正如Giovanni所说,这整段代码将占用UI线程,因此,如果XML文件非常重要,则应在带有进度对话框的单独线程中进行处理。

在我看来,您的处理程序从未实际将记录添加到数组中-看起来您需要为“record”类型的endElement包含一个操作,该操作将其添加到数组中


另外,正如Giovanni所说,这整段代码将占用UI线程,因此,如果XML文件非常重要,则应在带有进度对话框的单独线程中处理。

应避免从磁盘加载或/或在主线程上解析。如果不想面对ANR,请尝试使用AsyncTask。应避免从磁盘加载或/或在主线程上解析。如果你不想面对ANR,试着使用AsyncTask。嘿,伙计,我没有得到“将'Record'类型的endElement添加到数组中的操作”。你能详细说明一下吗?但是你应该得到(并处理)一个startElement,在其中创建记录。您需要找到匹配的endElement,以便可以使用该新记录并将其添加到数组中。嘿,伙计,我没有得到“类型为'record'的endElement的操作,该操作会将其添加到数组中。”您可以更详细地阐述它吗?但是您应该-您获得(并处理)一个用于创建记录的startElement。您需要找到匹配的endElement,以便可以使用该新记录并将其添加到数组中。