加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML —— SAX方式解析XML

发布时间:2020-12-16 23:42:25 所属栏目:百科 来源:网络整理
导读:1. SAX 方式解析 XML 原理 SAX 的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element) 开始与结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同 样的扫描,直至文档结束。 优点:相对于DOM方

1. SAX 方式解析 XML 原理

  • SAX 的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element) 开始与结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同 样的扫描,直至文档结束。
  • 优点:相对于DOM方式消耗资源比较少,适合大文件解析;
  • 缺点:只能读取不能修改;开发复杂;

?

2. SAX 方式解析 XML 示例

  1. 扫描文档

    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 SAX01 extends DefaultHandler{
    
        @Override
        public void startDocument() throws SAXException {  //开始扫描文档事件
            System.out.println("<?xml version="1.0" encoding="UTF-8"?>");
        }
    
        @Override
        public void endDocument() throws SAXException {  //结束扫描文档事件
            System.out.print("n 扫描文档结束");
        }
    
        @Override
        public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {  //开始扫描元素事件  uri前缀
            System.out.print("<");
            System.out.print(qName);
            if(attributes!=null){
                for(int i=0;i<attributes.getLength();i++){
                    System.out.print(" "+attributes.getQName(i)+"=""+attributes.getValue(i)+""");
                }
            }
            System.out.print(">");
        }
    
        @Override
        public void endElement(String uri,String qName)
                throws SAXException {   //结束扫描元素事件
            System.out.print("</");
            System.out.print(qName);
            System.out.print(">");
        }
    
        @Override
        public void characters(char[] ch,int start,int length)
                throws SAXException { // 扫描文本节点事件
            System.out.print(new String(ch,start,length));
        }
    
        public static void main(String[] args) throws Exception{
            SAXParserFactory factory=SAXParserFactory.newInstance();
            SAXParser parser=factory.newSAXParser();
            parser.parse("src/student.xml",new SAX01());
        }
    }

    ?

  2. ?获取值

    import java.util.ArrayList;
    import java.util.List;
    
    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 com.learn.model.Student;
    
    public class SAX02 extends DefaultHandler{
        private List<Student> students=null;
        private Student student=null;
        private String preTag=null; // 标记上一个节点名称
        
        @Override
        public void startDocument() throws SAXException {
            System.out.println("开始读取学生信息");
            students=new ArrayList<Student>();
        }
    
        @Override
        public void endDocument() throws SAXException {
            System.out.println("n 学生信息读取完毕");
        }
    
        @Override
        public void startElement(String uri,Attributes attributes) throws SAXException {
            if("student".equals(qName)){
                student=new Student();
                student.setId(attributes.getValue(0));
            }
            preTag=qName;
        }
    
        @Override
        public void endElement(String uri,String qName)
                throws SAXException {
            if("student".equals(qName)){
                students.add(student);
                student=null;
            }
            preTag=null;
        }
    
        @Override
        public void characters(char[] ch,int length)
                throws SAXException {
            if(preTag!=null){
                String content=new String(ch,length);
                if("name".equals(preTag)){
                    student.setName(content);
                }else if("sex".equals(preTag)){
                    student.setSex(content);
                }else if("age".equals(preTag)){
                    student.setAge(Integer.parseInt(content));
                }
            }
        }
    
        public static void main(String[] args) throws Exception{
            SAXParserFactory factory=SAXParserFactory.newInstance();
            SAXParser parser=factory.newSAXParser();
            SAX02 sax02=new SAX02();
            parser.parse("src/students.xml",sax02);
            for(Student s:sax02.students){
                System.out.println(s);
            }
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读