用SAX解析xml文件,java
(此文为(https://www.imooc.com/video/4482)之随笔)
1、用SAX解析xml文件大致分为三步
写了一个XML文件作为例子
(1)main方法代码如下:
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class SAX { public static void main(String[] args) { //1、获取一个SAXParserFactory的实例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //2、通过factory获取SAXParser的实例 SAXParser parser = factory.newSAXParser(); //3、创建SAXParserHandler对象 SAXParserHandler handler = new SAXParserHandler(); parser.parse("book.xml", handler); } 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(); } } }
(2)SAXParserHandler方法
package cn.edu.zzuli.SAXTest; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandler extends DefaultHandler { /** * 用来遍历xml文件的开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); } /** * 用来遍历xml文件的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); } /** * 用来表示解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); } }
当读到<?xml version="1.0" encoding="UTF-8"?>时解析开始,当读到最后一个节点结束标识(</>)解析结束
2、使用SAX解析节点名和节点间文本
重写SAXParserHandler类里的startElement方法
public class SAXParserHandler extends DefaultHandler { int bookindex = 1; /** * 用来遍历xml文件的开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //调用DefaultHandler类的startElement方法 super.startElement(uri, localName, qName, attributes); //开始解析book元素的属性 if(qName.equals("book")) { System.out.println("------------现在开始遍历第" + bookindex + "本书---------"); //已知book元素下属性的名称,根据名称获取属性值 String value = attributes.getValue("id"); System.out.println("book的属性值是:" + value); //不知道book元素下属性的名称以及个数,如何获取元素名称及属性 int num = attributes.getLength(); for(int i = 0;i < num;i++) { System.out.print("第" + (i + 1) + "个book元素的属性名是" + attributes.getQName(i)); System.out.println("----book元素的属性值是" + attributes.getValue(i)); } }else if(!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("节点名是" + qName); } } /** * 用来遍历xml文件的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if(qName.equals("book")) { System.out.println("------------结束遍历第" + bookindex++ + "本书---------"); } } /** * 用来表示解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); String value = new String(ch, start, length);
//通过trim()截掉空格和换行符,如果是空字符则跳过if执行语句 if(!value.trim().equals("")) System.out.println("节点值为" + value); } }
输出结果为:
(2)将book节点结构信息保存,用一个book类来保存
重新写SAXParserHandler类
public class SAXParserHandler extends DefaultHandler { int bookindex = 1; //定义全局变量是为了使book对象和value值可以被多个方法访问 Book book =null; String value = null; private ArrayList<Book> bookList = new ArrayList<>(); public ArrayList<Book> getBookList() { return bookList; } /** * 用来遍历xml文件的开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //调用DefaultHandler类的startElement方法 super.startElement(uri, localName, qName, attributes); //开始解析book元素的属性 if(qName.equals("book")) { //每一次遇到book就建立新的book对象 book = new Book(); System.out.println("------------现在开始遍历第" + bookindex + "本书---------"); //已知book元素下属性的名称,根据名称获取属性值 String value = attributes.getValue("id"); System.out.println("book的属性值是:" + value); //不知道book元素下属性的名称以及个数,如何获取元素名称及属性 int num = attributes.getLength(); for(int i = 0;i < num;i++) { System.out.print("第" + (i + 1) + "个book元素的属性名是" + attributes.getQName(i)); System.out.println("----book元素的属性值是" + attributes.getValue(i)); if(attributes.getQName(i) == "id") { book.setId(attributes.getValue(i)); } } }else if(!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("节点名是" + qName); } } /** * 用来遍历xml文件的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if(qName.equals("book")) { //把信息存入book对象之后,加到ArrayList之中 bookList.add(book); //将book对象清空 book = null; System.out.println("------------结束遍历第" + bookindex++ + "本书---------"); }else if(qName.equals("name")) { book.setName(value); }else if(qName.equals("id")) { book.setId(value); }else if(qName.equals("year")) { book.setYear(value); }else if(qName.equals("money")) { book.setMoney(value); }else if(qName.equals("color")) { book.setColor(value); }else if(qName.equals("auther")) { book.setAuther(value); } } /** * 用来表示解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 用来表示解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); }
/** * 用来求得节点值 */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
if(!value.trim().equals(""))
System.out.println("节点值为" + value);
}