• 老王学jsp之sax解析xml


    第一天学习了dom解析xml的技术,dom是通过树形结构来解析的,一次读入整个文件,而sax是通过顺序的方式读取的,可以一次读入一个片段,效率更高

    sax解析通过defaulthander的函数来解析,每个部分会自动触发相应的函数。所在包为org.xml.sax.helpers

    1):文档开始 public void startDocument()
                      throws SAXException {} 不进行任何操作。

    2):

    public void startElement(String uri,
                             String localName,
                             String qName,
                             Attributes attributes)
                      throws SAXException
    接收元素开始的通知。

    默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件)。

    参数:   uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

        localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

        qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

        attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。

    3):

    public void endElement(String uri,
                           String localName,
                           String qName)
                    throws SAXException
    接收元素结束的通知。

    默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件)。

    指定者:
    接口 ContentHandler 中的 endElement
    参数:
    uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
    localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
    qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
    4):
    public void endDocument()
                     throws SAXException
    接收文档结束的通知。

    默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文档的结束处采取特定的操作(如,结束树或关闭输出文件)。

    通过这几个函数就可以完成对xml文件的读取。

    调用时需要先构造

    public abstract class SAXParserFactory extends Object
    
    

    定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。

    SAXParserFactory 对象,

    然后通过SAXParserFactory 构造 SAXParser

     SAXParser通过函数parse(String uri, HandlerBase hb)调用之前写好的defaulthander类。并且传入相关的xml文件的路径既可以了

    实例:

    xml文件:

    <?xml version="1.0" encoding="GBK" ?>
    <address>
    <person id="名片" 编号="0001">
        <name>老王</name>
        <sex></sex>
        <phone>15520081263</phone>
    </person>
    <person id="名片" 编号="0002">
        <name>老大</name>
        <sex></sex>
        <phone>15520081263</phone>
    </person>
    </address>

    saxtest代码:

    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    
    public class saxTest {
    
        /**
         * @param args
         */
        public static void main(String[] args)  throws Exception{
            // TODO Auto-generated method stub
            SAXParserFactory factory=SAXParserFactory.newInstance();
            SAXParser saxParser=factory.newSAXParser();
            saxParser.parse("src/demo1.xml", new saxHander());
    
        }
    
    }

    saxHander代码:

    import org.omg.CORBA.PUBLIC_MEMBER;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    
    public class saxHander extends DefaultHandler {
        public void startDocument()//读取文档的开始
                throws SAXException{
            System.out.print("<xml? version="1.0" encoding="GBK"?>");
            
        }
        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++)
            {
                System.out.print(" "+attributes.getQName(i)+"="+attributes.getValue(i));
            }
            System.out.println(">");
            
        }
        public void characters(char[] ch,
                int start,
                int length)
         throws SAXException{//接收元素中字符数据的通知。属于最重要的部分
            System.out.print(new String(ch, start, length));
            
        } 
        public void endElement(String uri,
                String localName,
                String qName)
         throws SAXException{//接收元素结束的通知。
            System.out.print("</");
            System.out.print(qName);
            System.out.print(">");
            
        } 
        public void endDocument()//读取文档的结束
                throws SAXException{
            System.out.println("文档读取完毕");
            
        }
    
        
    }

    运行结果如下:【可以自行组织saxHander里面函数的操作,获得不同的输出结果】

    <xml? version="1.0" encoding="GBK"?><address>
    
    <person id=名片 编号=0001>
    
        <name>
    老王</name>
        <sex></sex>
        <phone>
    15520080563</phone>
    </person>
    <person id=名片 编号=0002>
    
        <name>
    老大</name>
        <sex></sex>
        <phone>
    15520080563</phone>
    </person>
    </address>文档读取完毕
  • 相关阅读:
    吴恩达机器学习笔记 —— 3 线性回归回顾
    springboot整合pagehelper实现分页
    Spring 线程池实战
    Java web后台插入数据库中文乱码问题解决
    Cesium项目实战(5)-城市各类POI数据制作、加工、展示
    Cesium项目实战(2)-城市行政区划信息展示以及专题信息展示
    【mybatis】mybatis中避免where空条件后面添加1=1垃圾条件的 优化方法
    Java之Json转List实体
    Maven项目META-INF文件夹不存在的问题
    Maven打jar包把配置文件放在META-INF目录下
  • 原文地址:https://www.cnblogs.com/wanglei-134/p/3182643.html
Copyright © 2020-2023  润新知