解析XML文件___SAX解析

来源:互联网 发布:诚品网络微信商城 编辑:程序博客网 时间:2024/04/25 17:47

sax解析xml

// 得到SAXParserFactorySAXParserFactory saxParserFactory = SAXParserFactory.newInstance();    // 得到SAXParser        SAXParser saxParser = saxParserFactory.newSAXParser();            // 得到XMLReader            XMLReader xmlReader = saxParser.getXMLReader();            // 给XMLReader设置监听            xmlReader.setContentHandler(handler);// 解析文件 Parse解析的意思xmlReader.parse(new InputSource(getAssets().open("student.xml")));

ContentHandler是接口,实现类 DefaultHandler

private ContentHandler handler = new DefaultHandler() {        private String targetName;        private List<Student> ss;        private Student student;        @Override        public void startDocument() throws SAXException {            System.out.println("读取文件开始");            ss = new ArrayList<Student>();            super.startDocument();        }        @Override        public void endDocument() throws SAXException {            System.out.println("读取文件结束");            System.out.println(ss);            super.endDocument();        }        @Override        public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {            targetName = localName;            System.out.println("读取开始标签" + targetName);            if ("student".equals(targetName)) {                student = new Student();                String value = attributes.getValue("id");                student.setId(Integer.parseInt(value));            }            super.startElement(uri, localName, qName, attributes);        }        @Override        public void endElement(String uri, String localName, String qName)throws SAXException {            // 用的是localName            System.out.println("读取结束标签" + localName);            if ("student".equals(localName)) {                System.out.println("-----" + student);                ss.add(student);                student = null;//可以不写            }            targetName = null;    /**当解析结束时置为空。这里很重要, 如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方 法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/              super.endElement(uri, localName, qName);        }        @Override        public void characters(char[] ch, int start, int length)                throws SAXException {            // 判断targetname不为空后少执行3次(endElement后就不执行了),因为在endElement方法中将targetname置空,            if (targetName != null) {                String str = new String(ch, start, length);                System.out.println("text" + str);                if ("name".equals(targetName)) {                    student.setName(str);                } else if ("age".equals(targetName)) {                    student.setAge(Integer.parseInt(str));                }                super.characters(ch, start, length);            }        }    };
0 0
原创粉丝点击