• xml_SAX解析


    (一)SAX解析

      

    1.1 SAX解析
    SAX:基于事件处理的机制
    sax解析xml文件时,遇到根开始标签,根结束标签,开始解析文件,文件解析结束,字符内容,空白字符等都会触发各自的方法。

    优点:
    适合解析大文件,对内存要求不高
    轻量级的解析数据方式,效率更高
    缺点:
    不能随机解析(只能从头开始解析,一点点往后进行)
    不能修改XML文件,只能进行查询

    1.2用SAX解析遍历整个xml文件并进行原样输出

    1.2.1 java代码

    package xml4;
    
    import java.io.File;
    import java.io.IOException;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class SaxTest {
    	public static void main(String[] args) {
    		// SAX解析 ①获取factory工厂
    		SAXParserFactory factory = SAXParserFactory.newInstance();
    
    		try {
    			// SAX ②获取解析器
    			SAXParser parser = factory.newSAXParser();
    			// 获取handel的对象
    			SaxTestHandel sh = new SaxTestHandel();
    			try {
    				parser.parse(new File("src/xml4/desk.xml"), sh);
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    		} catch (ParserConfigurationException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
    
    	}
    }
    
    class SaxTestHandel extends DefaultHandler {
    	//当开始读到这个文件时,触发该相应
    	@Override
    	public void startDocument() throws SAXException {
    		System.out.println("开始解析了!");
    	}
    	//读完了,所有的,触发该方法
    	@Override
    	public void endDocument() throws SAXException {
    		//System.out.println("解析完了!");
    	}
    	
    	//读到元素标签时,触发该方法
    	@Override
    	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    		System.out.print("<");
    		System.out.print(qName);
    		for(int i=0;i<attributes.getLength();i++) {
    			String qName2 = attributes.getQName(i);
    			String value = attributes.getValue(qName2);
    			System.out.print(" "+qName2+"="+"'"+value+"'");
    		}
    		System.out.print(">");
    	}
    	
    	@Override
    	public void endElement(String uri, String localName, String qName) throws SAXException {
    		System.out.print("</"+qName+">");
    	}
    
    	@Override
    	public void characters(char[] ch, int start, int length) throws SAXException {
    			String str=new String(ch,start,length);
    			System.out.print(str);
    	}
    
    }
    

    1.2.2 Xml代码

    <?xml version="1.0" encoding="UTF-8"?>
    <disks>
    	<disk name='c盘'>
    		<size>10G</size>
    		<directory>100</directory>
    		<file>200</file>
    	</disk>
    
    	<disk name='d盘'>
    		<size>20G</size>
    		<directory>200</directory>
    		<file>3000</file>
    	</disk>
    </disks>
    

     1.3  小练习 题目:获取一个xml 文件中的信息,并把它封装到一个实体类中去,并存放到一个集合中去,并保存到本地文件中去 

     1 package xml4;
     2 
     3 public class Disk {
     4     
     5     private String name;
     6     private String size;
     7     private String directory;
     8     private int  file;
     9     public Disk(String name, String size, String directory, int file) {
    10         super();
    11         this.name = name;
    12         this.size = size;
    13         this.directory = directory;
    14         this.file = file;
    15     }
    16     public Disk() {
    17         super();
    18     }
    19     public String getName() {
    20         return name;
    21     }
    22     public void setName(String name) {
    23         this.name = name;
    24     }
    25     public String getSize() {
    26         return size;
    27     }
    28     public void setSize(String size) {
    29         this.size = size;
    30     }
    31     public String getDirectory() {
    32         return directory;
    33     }
    34     public void setDirectory(String directory) {
    35         this.directory = directory;
    36     }
    37     public int getFile() {
    38         return file;
    39     }
    40     public void setFile(int file) {
    41         this.file = file;
    42     }
    43     @Override
    44     public String toString() {
    45         return "Disk [name=" + name + ", size=" + size + ", directory=" + directory + ", file=" + file + "]";
    46     }
    47     
    48 }
    package xml4;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import sun.awt.FwDispatcher;
    
    public class SaxTest2 {
    	public static void main(String[] args) {
    		SAXParserFactory factory = SAXParserFactory.newInstance();
    		try {
    			File f = new File("src/xml4/desk.xml");
    			SaxTest2Hander dh = new SaxTest2Hander();
    			SAXParser parser = factory.newSAXParser();
    			
    			try {
    				parser.parse(f, dh);
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		} catch (ParserConfigurationException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    class SaxTest2Hander extends DefaultHandler {
    	private ArrayList<Disk> list;
    	private Disk disk;
    	private String tagName;
    	
    
    	@Override
    	public void startDocument() throws SAXException {
    		list=new ArrayList<Disk>();
    	}
    
    	@Override
    	public void endDocument() throws SAXException {
    		
    		try {
    			PrintWriter fw=new PrintWriter("src/xml4/desk.txt");
    			for (Disk disk : list) {
    				fw.println(disk);
    				fw.flush();
    			}
    			fw.close();
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	@Override
    	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    			if("disk".equals(qName)) {
    				disk=new Disk();
    			}else {
    				tagName=qName;
    			}
    			for(int i=0;i<attributes.getLength();i++) {
    					String qName2 = attributes.getQName(0);
    					String value = attributes.getValue(qName2);
    					if(qName2.equals("name")){
    						disk.setName(value);
    					}					
    			}
    	}
    
    	@Override
    	public void endElement(String uri, String localName, String qName) throws SAXException {
    			if("disk".equals(qName)) {
    				list.add(disk);
    			}else {
    				tagName=null;
    			}
    		
    	}
    
    	@Override
    	public void characters(char[] ch, int start, int length) throws SAXException {
    		String str=new String(ch,start,length);
    		if("size".equals(tagName)) {
    			disk.setSize(str);
    		}
    		if("directory".equals(tagName)) {
    			disk.setDirectory(str);
    		}
    		if("file".equals(tagName)) {
    			disk.setFile(Integer.parseInt(str));
    		}
    	}
    
    }
    

      

    <?xml version="1.0" encoding="UTF-8"?>
    <disks>
    	<disk name='c盘'>
    		<size>10G</size>
    		<directory>100</directory>
    		<file>200</file>
    	</disk>
    
    	<disk name='d盘'>
    		<size>20G</size>
    		<directory>200</directory>
    		<file>3000</file>
    	</disk>
    </disks>
    
  • 相关阅读:
    Linux运维必会的MySql题之(四)
    Linux运维必会的MySql题之(三)
    Linux运维必会的MySql题之(二)
    Linux运维必会的MySql题之(一)
    Centos7 yum安装Mysql
    Devoos核心要点及kubernetes架构概述
    kubernetes基本概念
    BZOJ2631 tree 【LCT】
    BZOJ2431 [HAOI2009]逆序对数列 【dp】
    BZOJ1483 [HNOI2009]梦幻布丁 【链表 + 启发式合并】
  • 原文地址:https://www.cnblogs.com/yue-170305/p/11462181.html
Copyright © 2020-2023  润新知