XML相关知识点

Posted lxrm的博客空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML相关知识点相关的知识,希望对你有一定的参考价值。

本文内容:

一、XML语言概述

  1.1 XML和html的区别

  1.2 XML的常用场景

二、XML文件的基本语法知识(如何编写一个XML文件)

三、如何使用CSS或者XSL来控制XML文件的显示样式

四、如何解析一个XML文件(java中直接提供的两种XML文档解析方式)

  4.1概述

  4.2DOM法解析*.xml

  4.3SAX法解析*.xml

  4.4xml文件两种解析方法的比较(DOM和SAX的比较)

五、对用于XML文件解析(读取、写/修改)的Java API的进一步封装(用于xml文件解析的三方组件,需要手动导入相应jar包才可以使用其提供的API)

  5.1概述

  5.2 JDOM(由Jason Hunter和Brett Mclaughlin联合发布)

  5.3 DOM4J(由SourceForge发布)

一、XML语言概述:

1.1 XML和HTML的区别

    • HTML和XML都是由SGML发展而来的,但是两者又有很多的不同之处。其中最大的不同便是:

      • HTML中的元素都是固定的,且以显示为主

      • XML中的元素不是固定的,都是程序员自定义的,主要以数据保存为主
    • 实例:由下面的例子可以看出,HTML中的标签都是固定的,是由HTML标准定义好的,每种标签怎么写,拥有什么含义都是HTML标准中已经定义好的,要想编写出一个能够运行的HTML文件就必须按照HTML规则来使用相应的标签,并且按照HTML语法要求来写。而XML中的元素(标签)则是由程序员来根据实际需求自定义的,XML中的标签的标识符怎么写,各个标签代表什么意思,完全都是由程序员来定义的。
      •   
      •       
      •  上述例子中HTML页面中的<html> <head> <title> <body> <ul> <li> 等标签都是HTML标准中已经定义好的,HTML文件中程序员只能使用这些标签,不能使用其他标签

      • 上述例子中XML文件的<addresslist> <linkman> <name> <id> <company> <email> <tel> <site> 都是程序员自己定义的,程序员还可以在该XML文件中添加更多的自定义标签

      • XML文件中除了含有自定义标签之外,还必须含有一个文件头来表示这个文件是XML文件,这个文件头是必不可少的,如下:

        <?xml version="1.0" encoding="utf-8" standalone=“”?>
        <自定义标签1>
        
            ....其他自定义标签...
        
        </自定义标签1>

        这个文件头规定了该XML页面的一些属性:如version规定了当前xml版本,encoding规定了该xml页面使用的编码方式,standalone表示该xml文件是否是独立显示的(XML文件可以结合CSS或者XSL来控制xml文件的显示样式)

         

1.2 XML的常用场景

    • 数据交换
    • 系统配置
    • 内容管理  

二、XML文件语法知识(编写第一个xml文件)

  • 首先,所有的XML文件都必须含有文件头(即前导区)和数据区,前导区用于定义该XML文件的一些属性,数据区即为该XML文件的有效内容
  • 前导区:
    • <?xml version="1.0" encoding="utf-8" standalone=“”?>
    • 这个文件头规定了该XML页面的一些属性:如version规定了当前xml版本,encoding规定了该xml页面使用的编码方式,standalone表示该xml文件是否是独立显示的(XML文件可以结合CSS或者XSL来控制xml文件的显示样式)

    • 前导区的三个属性必须按照version  encoding  standalone的顺序来写,否则该XML编译时会出错 
  • 数据区:
    • 数据区就是开发人员自定义的一些标签了,他们的标识符、含义都是由开发者自行定义的
    • 所有的数据区必须有一个根元素,一个根元素下可以存放多个子元素,且要求每一个元素必须完结(即</**>)
    • XML中的每一个标记都是区分大小写的  
    • 自定义标签也可以拥有属性,但是属性的值必须用“”括起来。如果一个自定义标签有多个自定义属性,则属性之间用空格隔开
    • 什么时候用自定义标签,什么时候用自定义属性?(答:一般不建议使用自定义属性。因为如果该xml文件需要结合CSS或XSL来显示的话,XML文件的标签属性的值是无法显示的。)
    • 数据区的自定义标签要赋值,赋值时有一些特殊符号必须使用转义字符来表示:

       

    • XML文件内部注释:使用CDATA添加注释。

      • 当XML解析器处理到CDATA标识符处时,就知道这一块实际上只是注释,所以解析器不会解析CDATA内部所包含的内容。

      • 语法:<![CDATA[注释(该部分内容不会被XML解析器解析)]]>  

    • 如上所述,XML数据区的标签是可以由开发者自由定义的,如果要对一个XML文件中经常出现的元素或属性进行严格的定义,则需要使用DTD和Schema技术。

      • 如,Spring的配置文件*.xml中,<bean>标签专门用于定义bean,至于它的bean标签就是根据DTD技术定义的。   

  • xml文件实例:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <?xml-stylesheet type="text/css" href="../css/test.css"?>
    <linklist>
        <id>001</id>
        <name chinese="yes">lxrm</name>
        <email>123@qq.com</email>
        <textbook>&lt;&lt;Java Web开发实战经典&gt;&gt;</textbook>
        <![CDATA[
            ..注释..
            CDATA中包含的所有内容都不会被XML解析器解析
            相当于HTML中的<!--  -->
        ]]>
    </linklist>

     

     

     

三、通过CSS或者XSL来控制XML文件内容的显示样式

概述:如果xml文件前导区定义的standalone=“yes”,那么该XML文件运行后显示结果就如本文第二部分展示的那样,只是将数据区的内容以树的形式展示出来。

        如果将xml绑定了其他CSS文件或者XSL文件,则该XML文件中的内容就可以按照CSS或XSL中定义的格式来显示。

实例:

  • <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/css" href="../css/test.css"?>
    <linklist>
        <id>001</id>
        <name chinese="yes">lxrm</name>
        <email>123@qq.com</email>
    </linklist>

    @CHARSET "UTF-8";
    id{
        display:block;
        color:red;
        font-weight:bold;
        font-size:20pt;
    }
    name,email{
        dispaly:block;
        color:blue;
        font-weight:normal;
        font-size:16pt;    
    }

四、XML文件的解析 

4.1 概述:

    • XML文件有多种解析方式,如DOM解析、SAX解析法

4.2 DOM解析*.xml文件

基于DOM解析的XML分析器  
*.xml——>DOM树  
优点:支持随机访问,即支持应用程序在任何时候随机访问XML文档的任何一部分内容  

缺点:

  • 对内存的需求比较高(因为这种解析器是将XML文档全部存成一个DOM树放在内存中,所以当XML文档较大或者较为复杂时,对设备的内存的需求会比较高)
  • 由于DOM解析是将XML文件中元素存储成一个树结构,所以对XML中内容的随机访问就相当于对树的随机访问,每次访问都需要遍历树,而树的遍历又会非常慢,所以基于DOM解析的XML分析器,对于XML文件内容的随机访问速度也是很慢的
 

 

 

 

 基于DOM的XML文件解析器,所提供的DOM接口:

  • 应用程序中可以使用下述接口获取XML文件中的元素及其值。
  • Document接口
  • Node接口
  • NodeList接口
  • NameNodeMap接口
  •  

 

1. 读取*.xml文件:(编程思路)

    • 如何对一个XML文件施行DOM解析,并且在应用程序中使用XML文件中的元素:(编程思路)
    • 涉及到的类:
    • import java.io.File;
      import java.io.IOException;
      
      import javax.xml.parsers.DocumentBuilder;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.parsers.ParserConfigurationException;
      
      import org.w3c.dom.Document;
      import org.w3c.dom.Element;
      import org.w3c.dom.NodeList;
      import org.xml.sax.SAXException;

       

        

2.写*.xml文件:(编程思路)

    • 如何通过java程序修改一个*.xml文件
    • 编程思路:
      *    step1,创建DocumentBuilderFactory对象
      *    step2,通过DocumentBuilderFactory对象获取DocumentBuilder对象
      *    step3,通过DocumentBuilder对象创建DOM树(即Document对象)
      *    step4,使用Element元素定义*.xml文件中的元素
      *    step5,为step4中定义的xml元素进行赋值
      *    step6,设置上述所定义的xml元素的父子节点关系(也即为DOM树添加节点)
      *    step7,创建TransformerFactory对象
      *    step8,通过TransformerFactory对象获取Transformer对象
      *        step8.1  将DOM树(即step3中所获得的Document对象)封装成DOMSource对象
      *        step8.2  将{path}/*.xml封装成StreamResult对象
      *        step8.3  使用Transformer对象中的成员函数设置*.xml文件的属性(如编码方式等)
      *    step9,使用Transformer对象将上述DOM对象转化成*.xml文件(如果相应路径已经存在同名xml文件,则覆盖原有同名xml文件)

      涉及到的类:

      import java.io.File;
      
      import javax.xml.parsers.DocumentBuilder;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.parsers.ParserConfigurationException;
      import javax.xml.transform.OutputKeys;
      import javax.xml.transform.Transformer;
      import javax.xml.transform.TransformerConfigurationException;
      import javax.xml.transform.TransformerException;
      import javax.xml.transform.TransformerFactory;
      import javax.xml.transform.dom.DOMSource;
      import javax.xml.transform.stream.StreamResult;
      
      import org.w3c.dom.Document;
      import org.w3c.dom.Element;

       


       

 

 在应用程序中使用基于DOM的XML文件解析器解析*.xml文件,并且调用该XML文件解析器提供的DOM接口获取xml文件的内容,并做出后续操作:

  • 实例一,D:/testDOM.xml
  • <?xml version="1.0" encoding="UTF-8"?>
    <addresslist>
        <name>lxrm</name>
    </addresslist>
  • import java.io.File;
    import java.io.IOException;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    /**
     *@Author chen
     *@date 2017-4-2
     *@description:本程序用于测试XML文件的DOM解析
     *在应用程序中使用基于DOM的XML文件解析器解析xml文件,并且使用该解析器提供的DOM接口
     *获取该xml文档中的元素及其对应的值,并做出后续操作
     */
    
    public class TestXMLDOM {
        public static void main(String[] args){
            //1.建立DocumentBuilderFactory,以用于取得DocumentBuilder
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            //2.通过DocumentBuilderFactory实例获取DocumentBuilder对象
            DocumentBuilder builder=null;
            try{
                builder=factory.newDocumentBuilder();
            }catch(ParserConfigurationException e){
                e.printStackTrace();
            }
            //3.使用DocumentBuilder建立*.xml文件对应的DOM树(即Document对象)
            Document doc=null;
            String file="D:"+File.separator+"testDOM.xml";
            try{
                doc=builder.parse(file);
            }catch(SAXException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            //4.查找xml文件对应的DOM树中的节点
            NodeList nl=doc.getElementsByTagName("name");
            //5.操作4中所获取的xml文件的元素的值(本例中是在后台输出该元素的值)
            System.out.println(file+"中的<name>标签的值:"+nl.item(0).getFirstChild().getNodeValue());
        }
    }

     

  • 实例二:解析一个更复杂的*.xml文件,将其转化成一个DOM树,并且获取该xml文件中某些元素的值
  • D:/testDOM.xml
  • <?xml version="1.0" encoding="UTF-8"?>
    <addresslist>
        <linkman>
            <name>lxrm</name>       
            <email>123@**.cn</email>
        </linkman>
        <linkman>
            <name>lm</name>      
            <email>123@**.cn</email>
        </linkman>
    </addresslist>
    
    

    package
    xml.operation; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** *@Author chen *@date 2017-4-2 *@description:本程序用于测试XML文件的DOM解析 *在应用程序中使用基于DOM的XML文件解析器解析xml文件,并且使用该解析器提供的DOM接口 *获取该xml文档中的元素及其对应的值,并做出后续操作 */ public class TestXMLDOM { public static void main(String[] args){ //1.建立DocumentBuilderFactory,以用于取得DocumentBuilder DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //2.通过DocumentBuilderFactory实例获取DocumentBuilder对象 DocumentBuilder builder=null; try{ builder=factory.newDocumentBuilder(); }catch(ParserConfigurationException e){ e.printStackTrace(); } //3.使用DocumentBuilder建立*.xml文件对应的DOM树(即Document对象) Document doc=null; String file="D:"+File.separator+"testDOM.xml"; try{ doc=builder.parse(file); }catch(SAXException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } //4.查找xml文件对应的DOM树中的节点 NodeList nl=doc.getElementsByTagName("linkman"); //5.操作4中所获取的xml文件的元素的值(本例中是在后台输出该元素的值) System.out.println("从"+file+"中获取的信息:"); for(int i=0;i<nl.getLength();i++){ Element e=(Element) nl.item(i); System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()+" 联系方式:"+e.getElementsByTagName("phone").item(0).getFirstChild().getNodeValue()); }//end for }//end main }//end class

     

  • 实例三,将DOM树转变成*.xml文档
  • /**
    *@author lxrm
    *@date 2017年4月3日
    *@description:通过java程序创建一个*.xml文件,或者覆盖已经存在的同名xml文件
    *编程思路:
    *    step1,创建DocumentBuilderFactory对象
    *    step2,通过DocumentBuilderFactory对象获取DocumentBuilder对象
    *    step3,通过DocumentBuilder对象创建DOM树(即Document对象)
    *    step4,使用Element元素定义*.xml文件中的元素
    *    step5,为step4中定义的xml元素进行赋值
    *    step6,设置上述所定义的xml元素的父子节点关系(也即为DOM树添加节点)
    *    step7,创建TransformerFactory对象
    *    step8,通过TransformerFactory对象获取Transformer对象
    *        step8.1  将DOM树(即step3中所获得的Document对象)封装成DOMSource对象
    *        step8.2  将{path}/*.xml封装成StreamResult对象
    *        step8.3  使用Transformer对象中的成员函数设置*.xml文件的属性(如编码方式等)
    *    step9,使用Transformer对象将上述DOM对象转化成*.xml文件(如果相应路径已经存在同名xml文件,则覆盖原有同名xml文件)
    **/
    package xml.operation;
    
    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    public class BuildXMLFile {
        public static void main(String[] args){
            //step1,创建DocumentBuilderFactory对象,以便于获取DocumentBuilder对象
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            //step2,通过step1中所获取的DocumentBuilderFactory对象获取DocumentBuilder对象
            DocumentBuilder builder=null;
            try{
                builder=factory.newDocumentBuilder();
            }catch(ParserConfigurationException e){
                e.printStackTrace();
            }
            //step2,通过step2所获得的DocumentBuilder对象创建DOM树(也即Document对象)
            Document doc=null;
            doc=builder.newDocument();
            //step4,定义xml文件中的元素的标识符
            Element addresslist=doc.createElement("addresslist");
            Element linkman=doc.createElement("linkman");
            Element name=doc.createElement("name");
            Element email=doc.createElement("email");
            //step5,为xml文件中的元素赋值
            name.appendChild(doc.createTextNode("lxrm2"));
            email.appendChild(doc.createTextNode("123@qq.com"));
            
            //step6,设置xml文件中元素的父子关系(也即他们在DOM树中的父子节点关系)
            linkman.appendChild(name);
            linkman.appendChild(email);
            addresslist.appendChild(linkman);
            doc.appendChild(addresslist);//用Document对象指定父节点
            //step7,将上述建立好的DOM树存放至*.xml之前的准备工作
            TransformerFactory tranFactory=TransformerFactory.newInstance();
            Transformer tran=null;
            try{
                tran=tranFactory.newTransformer();
            }catch(TransformerConfigurationException e){
                e.printStackTrace();
            }
            tran.setOutputProperty(OutputKeys.ENCODING, "utf-8");
            DOMSource source=new DOMSource(doc);//将上述DOM树(即Document对象)包装成DOMSource对象,以便于写入*.xml
            String file="D:"+File.separator+"new.xml";//待修改的xml文件(如果该文件不存在则新建该文件并写入内容。如果该文件存在则新的DOM树会覆盖原有文件内容)
            StreamResult result=new StreamResult(new File(file));
            try{
                tran.transform(source, result);//将DOM树中内容转变成*.xml文件
            }catch(TransformerException e){
                e.printStackTrace();
            }
        }
    }

    <?xml version="1.0" encoding="utf-8" standalone="no"?>

    <addresslist>
      <
    linkman>
    <
    name>lxrm2</name>
    <
    email>123@qq.com</email>
    </
    linkman>
    </
    addresslist>

     

     

     

 

4.3 SAX法解析*.xml文件

SAX法解析*.xml文件

原理:

  • 采用顺序模式进行访问,是一种快速读取XML文件数据的方式。
  • SAX法读取*.xml文件的时候,会触发一系列的事件,如扫描到文档(也即Document对象)的开始和结束,XML文档的元素(也即Element对象)的开始和结束的时候,都会触发一定的事件,作出相应的操作,直至扫描完整个文档。
  •  

 

优点:

  对内存的需求不会随着*.xml文件的大小而改变,也就是说,即使*.xml文件很大,SAX解析法依然可以使用,因为SAX解析法对内存的需求不大

 

缺点:

  • 不支持随意读取,只能对*.xml从头到尾的顺序遍历
  • 只能读取*.xml文件,不可以修改该xml文件
  • 开发起来较为复杂,需要继承一些接口,实现一些函数(事件),如需要在子类中实现读取到文档开始和结束,读取到element开始与结束时触发的事件函数

 SAX法构造*.xml文件解析器:(编程思路)

  • 涉及到的类
    • import org.xml.sax.Attributes;
      import org.xml.sax.SAXException;
      import org.xml.sax.helpers.DefaultHandler;
      import javax.xml.parsers.ParserConfigurationException;
      import javax.xml.parsers.SAXParser;
      import javax.xml.parsers.SAXParserFactory;
      
      import org.xml.sax.SAXException;
        
  • 编程思路
    • step1,建立一个SAX解析器(实际上就是一个继承了org.xml.sax.helpers.DefaultHandlers类的Java class对象)  
      • step1.1,建立一个java class,使得该类继承DefaultHandlers类
      • step1.2,复写(@override)DefaultHandlers类中的成员方法(包括startDocument()、endDocument()、startElement()、endElement()、character()等函数的覆写)  
    • step2,使用step1中建立的SAX解析器解析*.xml文件  
      • step2.1,建立SAXParserFactory对象
      • step2.2,通过SAXParserFactory对象获取SAXParser对象
      • step2.3,通过step2.2中获得的SAXParser对象的parse(String path,DefaultHandlers saxParser)函数解析*.xml
          • parse()函数的两个参数分别制定了待解析*.xml文件的路径和将要用于解析*.xml文件的SAX解析器(也就是step1中所建立的SAX解析器)      
  • 实现示例(见下文)
    • 实例一,使用SAX解析方法解析d:/testDOM.xml文件(读取该文件内容,并且将他们在后台输出)
      • 编程思路,
        • step1,创建SAX解析器——SAX_Build_MySAXParser.java
        • step2,在SAX_Use_MySAXParser_readXML.java中测试自己创建的SAX解析器(即读取*.xml文件内容并在后台输出)      

 

 示例一:使用SAX解析方法解析d:/testDOM.xml文件(读取该文件内容,并且将他们在后台输出)

      • step1,创建SAX解析器——SAX_Build_MySAXParser.java
      • /**
        *@author lxrm
        *@date 2017年4月9日
        *@description:使用SAX解析法解析*.xml文件的第一步就是创建自己的SAX解析器(实际上就是一个继承了DefaultHandler类的class)
        *构建自己的SAX解析器的编程思路:
        *    step1.1,建立一个java class,使得该类继承DefaultHandlers类
        *    step1.2,复写(@override)DefaultHandlers类中的成员方法(包括startDocument()、endDocument()、startElement()、endElement()、character()等函数的覆写)      */
        package xml.operation;
        
        import org.xml.sax.Attributes;
        import org.xml.sax.SAXException;
        import org.xml.sax.helpers.DefaultHandler;
        
        public class SAX_Build_MySAXParser extends DefaultHandler{
        
            @Override
            public void startDocument() throws SAXException{
                System.out.println("扫描到了文档开头,实际工程中可能有一些后续操作。");
                
            }
            
            @Override
            public void endDocument() throws SAXException{
                System.out.println("扫描到了文档结尾,整个xml文件的SAX解析过程结束。");
            }
            
            /**
             * @param uri
             * @param localName
             * @param name *.xml文件中元素(标签)的名称
             * @param attributes XML文件中标签的属性
             * */
            @Override
            public void startElement(String uri,String localName,String name,
                    Attributes attributes) throws SAXException{
                System.out.println("<"+name);
                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 characters(char[] ch,int start,int length) throws SAXException{
                System.out.println(ch);
            }
            
            @Override 
            public void endElement(String uri,String localName,String name)throws SAXException{
                System.out.println("</"+name+">");
            }
        }

         

        step2,

        /**
        *@author lxrm
        *@date 2017年4月9日
        *@description:*/
        package xml.operation;
        
        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.SAXException;
        
        public class SAX_use_MySAXParser_to_readXML {
            public static void main(String[] args) {
                SAXParserFactory factory=SAXParserFactory.newInstance();
                SAXParser saxParser=null;
                try{
                    saxParser=factory.newSAXParser();
                }catch(ParserConfigurationException | SAXException e){
                    e.printStackTrace();
                }
                String path="D:"+File.separator+"testDOM.xml";
                try {
                    saxParser.parse(path, new SAX_Build_MySAXParser());
                } catch (SAXException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

        程序运行结果:(有点儿小bug,如下)

        <addresslist>
            <linkman>
                <name>lxrm</name>
                <phone>188**</phone>
                <email>123@**.cn</email>
            </linkman>
            <linkman>
                <name>lm</name>
                <phone>188**</phone>
                <email>123@**.cn</email>
            </linkman>
        </addresslist>
        扫描到了文档结尾,整个xml文件的SAX解析过程结束。

         

         

         

        

4.4 DOM解析法和SAX解析法的比较

基于DOM解析的XML分析器 基于SAX解析法的xml文件解析器
原理:将整个xml文件转化成一个DOM树,并且放到内存中

原理:

  • 采用顺序模式进行访问,是一种快速读取XML文件数据的方式。
  • SAX法读取*.xml文件的时候,会触发一系列的事件,如扫描到文档(也即Document对象)的开始和结束,XML文档的元素(也即Element对象)的开始和结束的时候,都会触发一定的事件,作出相应的操作,直至扫描完整个文档。

优点:

  支持随机访问,即支持应用程序在任何时候随机访问XML文档的任何一部分内容

优点:

  对内存的需求不会随着*.xml文件的大小而改变,也就是说,即使*.xml文件很大,SAX解析法依然可以使用,因为SAX解析法对内存的需求不大

缺点:

  • 对内存的需求比较高(因为这种解析器是将XML文档全部存成一个DOM树放在内存中,所以当XML文档较大或者较为复杂时,对设备的内存的需求会比较高)
  • 由于DOM解析是将XML文件中元素存储成一个树结构,所以对XML中内容的随机访问就相当于对树的随机访问,每次访问都需要遍历树,而树的遍历又会非常慢,所以基于DOM解析的XML分析器,对于XML文件内容的随机访问速度也是很慢的

缺点:

  • 不支持随意读取,只能对*.xml从头到尾的顺序遍历
  • 只能读取*.xml文件,不可以修改该xml文件
  • 开发起来较为复杂,需要继承一些接口,实现一些函数(事件),如需要在子类中实现读取到文档开始和结束,读取到element开始与结束时触发的事件函数

 

DOM法解析*.xml,编程实现:

  1.读取*.xml文件

    • 涉及到的类
      • import javax.xml.parsers.DocumentBuilder;
        import javax.xml.parsers.DocumentBuilderFactory;
        import javax.xml.parsers.ParserConfigurationException;
        
        import org.w3c.dom.Document;
        import org.w3c.dom.Element;
        import org.w3c.dom.NodeList;
        import org.xml.sax.SAXException;
          
    • 编程思路
    • 使用实例
      • 实例一,读取*.xml文件  
      • 实例二,读取复杂的*.xml文件

  2.java程序中修改*.xml文件(或者新建一个*.xml文件)

    • 涉及到的类
    • 编程思路
    • 使用实例
      • 实例三,修改已经存在的xml文件(或者生成一个新的*.xml)

SAX法解析*.xml文件,编程实现: