我们了解完最简单的dom解析之后,马上就可以学习sax解析,先上今天的道具:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <people><name type="english">linbulu</name><sex>boy</sex><age>18</age></people>
好,我们今天要做的就是把这个people解析出来,存进一个map里边。废话少说了,马上开干!!
public class TestSax { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(new File("D:\\fileDemo\\user.xml"), new MyHandler()); } } class MyHandler extends DefaultHandler { String currentNodeName=null; Map<String, String> map=null; @Override public void startDocument() throws SAXException { System.out.println("1------startDocument------1"); map=new HashMap<String, String>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("2------startElement--------2----"+qName); currentNodeName=qName; //正在解析的元素 for(int i=0;i<attributes.getLength();i++){ map.put(attributes.getQName(i), attributes.getValue(i)); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println("3------characters--------3"); String value=new String(ch,start,length); map.put(currentNodeName,value); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("4------endElement--------4"); } @Override public void endDocument() throws SAXException { System.out.println("5------endDocument-------5"); System.out.println(map.toString()); }
大家跑起来,看看控制台输出啥了??
大家是不是觉得非常简单啊。不过我还是要稍微得说一下:
1、要继承 DefaultHandler
2、一共要重写5个方法
startDocument:开始解析文档。
startElement:开始解析节点并且读取节点的属性
characters:读取节点里的内容
endElement:结束读取这一个节点
endDocument:结束文档的解析
其中,解析文档和结束文档都只执行一次,其他的执行多次。大家看懂了吗??
然后咱们获取值的方法也是很独特,在第三个步骤中:
String value=new String(ch,start,length);
好了,明天来更加叼的,这些都是小儿科,不过,有一点大家一定要注意,面试的时候经常会考的:
sax解析和dom解析的区别,大家如果只讲实现给人家听,百分之九十就挂了。咱们根据实现,来深究一下他们2个家伙的区别在哪里?
dom解析是直接把xml一个parse操作,转成了document对象,简单粗暴,不过这样会耗费很多内存的资源。所以,在临床上我们一般只用来读一些配置文件或者比较小的xml文件
sax解析则是一个节点一个节点得往下读,读到后面的,前面的也就释放掉了,所以不会存在说耗费大量内存一说。所以对大型的xml文件用sax解析就再好不过了。
你学会了吗??