SAX解析
回顾DOM解析
DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。
缺点: 不适合读取大容量的xml文件,容易导致内存溢出。
SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。
SAX解析工具
SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*
核心的API:
SAXParser类: 用于读取和解析xml文件对象
parse(File f,
DefaultHandler dh
)方法: 解析xml文件
参数一: File:表示 读取的xml文件。
参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类
例如:
import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.helpers.DefaultHandler; public class Demo1 extends DefaultHandler { public static void main(String[] args) { //创建SAXParser对象 SAXParser parser=SAXParserFactory.newInstance().newSAXParser(); //调用parse方法 parser.parse(new File("./src/contact.xml"), new Demo2()); } }
[一个类继承class 类名(extends DefaultHandler) 在调用是创建传进去
DefaultHandler类的API:
void startDocument() : 在读到文档开始时调用
void endDocument() :在读到文档结束时调用
void startElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用
void endElement(String uri, String localName, String qName) :读到结束标签时调用
void characters(char[] ch, int start, int length) : 读到文本内容时调用
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Demo2 extends DefaultHandler { @Override public void startDocument() throws SAXException { System.out.println("MyDefaultHandler.startDocument()"); } @Override public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement()-->"+qName); } @Override public void endElement(String uri, String localName, String qName)throws SAXException { System.out.println("MyDefaultHandler.endElement()-->"+qName); } @Override public void characters(char[] ch, int start, int length)throws SAXException {String content = new String(ch,start,length); System.out.println("MyDefaultHandler.characters()-->"+content); } @Override public void endDocument() throws SAXException { System.out.println("MyDefaultHandler.endDocument()"); } }
DOM解析 |
SAX解析 |
原理:一次性加载xml文档,不适合大容量的文件读取 |
原理:加载一点,读取一点,处理一点。适合大容量文件的读取 |
DOM解析可以任意进行增删改成 |
SAX解析只能读取 |
DOM解析任意读取任何位置的数据,甚至往回读 |
SAX解析只能从上往下,按顺序读取,不能往回读 |
DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。 |
SAX解析基于事件的编程方法。java开发编码相对复杂。 |
把xml封装为对象
import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class Demo3 { public static void main(String[] args)throws Exception { SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); MyDefaultHandler3 handler = new MyDefaultHandler3(); parser.parse(new File("./src/contact.xml"), handler); List<Contact> list = handler.getList(); for (Contact contact : list) { System.out.println(contact); } } }
import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyDefaultHandler3 extends DefaultHandler { private List<Contact> list = new ArrayList<Contact>(); public List<Contact> getList(){ return list; } private Contact contact; private String curTag; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { curTag = qName; if("contact".equals(qName)){ contact = new Contact(); contact.setId(attributes.getValue("id")); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String content = new String(ch,start,length); if("name".equals(curTag)){ contact.setName(content); } if("age".equals(curTag)){ contact.setAge(content); } if("phone".equals(curTag)){ contact.setPhone(content); } if("email".equals(curTag)){ contact.setEmail(content); } if("qq".equals(curTag)){ contact.setQq(content); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { curTag = null; if("contact".equals(qName)){ list.add(contact); } } }
总结:
1)Dom4j修改xml文档:new XMLWrier();
2)xPath技术: 快速查询xml节点selectNodes()、selectSinglNode();、xpath表达式语言
3) SAX解析: SAXParser parse、parser()、
DefaultHandler类:startElement();、characters();、endElement();