java是怎么操作xml的-sax解析

我们了解完最简单的dom解析之后,马上就可以学习sax解析,先上今天的道具:

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  

  2. <people><name type="english">linbulu</name><sex>boy</sex><age>18</age></people>  

 

好,我们今天要做的就是把这个people解析出来,存进一个map里边。废话少说了,马上开干!!

Java代码  收藏代码

  1. public class TestSax  {  

  2.       

  3.     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {  

  4.         SAXParserFactory factory = SAXParserFactory.newInstance();  

  5.         SAXParser parser = factory.newSAXParser();  

  6.         parser.parse(new File("D:\\fileDemo\\user.xml"), new MyHandler());  

  7.     }  

  8.       

  9. }  

  10.   

  11. class MyHandler extends DefaultHandler  

  12. {  

  13.     String currentNodeName=null;  

  14.     Map<String, String> map=null;  

  15.   

  16.     @Override  

  17.     public void startDocument() throws SAXException  

  18.     {  

  19.         System.out.println("1------startDocument------1");  

  20.         map=new HashMap<String, String>();  

  21.     }  

  22.       

  23.     @Override  

  24.     public void startElement(String uri, String localName, String qName,  

  25.             Attributes attributes) throws SAXException  

  26.     {  

  27.             System.out.println("2------startElement--------2----"+qName);  

  28.             currentNodeName=qName;  //正在解析的元素  

  29.             for(int i=0;i<attributes.getLength();i++){  

  30.             map.put(attributes.getQName(i), attributes.getValue(i));  

  31.             }  

  32.     }  

  33.   

  34.     @Override  

  35.     public void characters(char[] ch, int start, int length)  

  36.             throws SAXException  

  37.     {  

  38.          System.out.println("3------characters--------3");  

  39.          String value=new String(ch,start,length);  

  40.          map.put(currentNodeName,value);  

  41.     }  

  42.   

  43.     @Override  

  44.     public void endElement(String uri, String localName, String qName)  

  45.             throws SAXException  

  46.     {  

  47.          System.out.println("4------endElement--------4");  

  48.     }  

  49.       

  50.   

  51.     @Override  

  52.     public void endDocument() throws SAXException  

  53.     {  

  54.       System.out.println("5------endDocument-------5");  

  55.       System.out.println(map.toString());  

  56.     }  

 

下载地址  大家跑起来,看看控制台输出啥了??

大家是不是觉得非常简单啊。不过我还是要稍微得说一下:

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解析就再好不过了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章