DOM4J解析xml&Sax解析XML

1.xml:是一种可扩展的标记语言,它也是由标签组成,不同的是它的标签名可以自定义.

后缀名:.xml.

2.xml作用:用来传输和存储数据。用来作为配置文件;用来跨平台进行数据交换格式.用来作为持久文件存数据.

注意:xml和html都是标记语言,由标签组成.html专门作为前端页面展示,xml用来作后台数据传输和存储.

3.xml的组成(了解)

3.1:xml标签规范:

3.1.1:XML标签区分大小写.

3.1.2:XML标签一定要关闭.

单标签:<标签名 属性名="属性值"/>

双标签:<标签名 属性名1="属性值1" 属性名2="属性值2">

3.1.3:XML文档必须有根元素(根标签)

3.1.4:XML标签要正确嵌套.

eg:<标签名1><标签名2>

3.1.5:XML标签名可以自定义,但是要像正常人取名就可以.

3.1.6:XML标签中换行和空格都会当作标签内容

3.2:文档声明:xml文件的版本,规定文件的字符编码等页面属性。

必须写在xml文件的第一句。

3.3:属性:每个标签名的括号中可以有0到多个属性。xml标签的属性值一定要用引号。在同一个标签中,属性不可以重名。

<标签名 属性1="值1" 属性2="值2" >

3.4:注释:。注释不能嵌套。

3.5:实体引用:一些字符拥有特殊的意义.

3.6:处理指令:用来指挥软件如何解析XML文档。语法:

eg:

3.7:xml约束:规范文件的内容。

xml约束的类型:xml Schema ,xml DTD

eg:

 

	

   

  
              
               
               
]>
eg:

         
   
  
              
              
             
]>

    
        赵天慧
        
        18
    
    
        刚哥
        
        18
    
    
        董超
        
        17
    
    
        司永康
        
        18
    

4.DOM4J解析xml:

4.1:DOM4J解析xml:用一个流将硬盘上xml内容加载到内存中再通过节点方式解析

优点:可读性;性能优异、功能强大和极其易使用的特点.

缺点:耗内存.

Document 文档类 用于加载指定的文档

常用方法:

4.1.1:getRootElement() 获取根节点 Element 标签类,元素

4.1.2:elements() 获取所有的直接子标签

4.1.3:element("子标签名")获取指定的直接子标签

4.1.4:element("子标签名").getText()获取指定标签名称的文本内容

4.1.5:elementText("标签名") 获取指定标签名称的文本内容 element 获取指定标签名称的标签对象.

4.1.6:attribute("属性名")属性节点对象

4.1.7:attribute("属性名").getText();获得属性值

4.1.8:attributeValue("属性名");获得属性值

4.2:DOM4j使用:导包:

eg:public static void main(String[] args) throws Exception {
    //1.创建dom4j的读取对象
    SAXReader reader=new SAXReader();
    //2.用读取对象将硬盘上xml文件读取内存中,用文档对象接收
    Document stuDocument=reader.read("Day40\\src\\students.xml");

    //声明一个学生对象集合用来存解析出学生信息
    List stuList=new ArrayList();

    /*3.解析xml文件*/
    //获得xml的根节点对象-students
    Element root=stuDocument.getRootElement();
    //获得根节点下面所有子节点-student
    List childs=root.elements();
    //遍历所有子节点
    for (Element child:childs){
        //创建一个学生对象,用属性来存解析出数据
        Student stu1=new Student();
        //获得节点sid属性值,并将值存在学生对象中
        stu1.setSid(Integer.valueOf(child.attribute("sid").getText()));
        //获得当前节点的子节点属性值
        stu1.setSname(child.element("sname").getText());
        stu1.setSage(Integer.valueOf(child.elementText("sage")));
        stu1.setSsex(child.elementText("ssex"));

        //解析完一个子标签student,将解析出的student对象存在集合中
        stuList.add(stu1);
    }

    //输出解析结果
    for (Student s:stuList){
        System.out.println(s);
    }
}

5.Sax解析XML:

5.1:Sax解析XML原理:基于事件流,自动解析xml文件.

优点:省内存,自动解析方便.

缺点:可读性差,不可控制(自动从文件开始解析结尾).

5.2:Sax解析:jdk自带.

eg:/**
*sax解析的自定义处理器类
 */
public class MyHandle extends DefaultHandler {
    /**
    *声明一个集合存解析出数据
    */
    List stuList;
    /**
    *声明一个学生对象存当前解析出数据
    */
    Student stu1;
    /**
     *声明一个变量存当前解析标签名
     */
    String tagName;

    /**
    *重写父类中开始解析xml文档的方法
    *@return void
    */
    @Override
    public void startDocument () throws SAXException
    {
        //初始化学生集合
        stuList=new ArrayList();
    }

    /**
    *重写父类中解析每个开始标签的方法
    *@param uri, localName, qName, attributes
    *@return void
    */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //存当前解析标签名,以便后面我们知道解析到哪个标签.
        tagName=qName;
        //如果当前解析标签名叫student
        if ("student".equals(qName)){
            stu1=new Student();
            //获得当前这个student标签的sid属性值,并存在学生对象中
            stu1.setSid(Integer.valueOf(attributes.getValue("sid")));
        }
    }

    /**
    *重写父类中获得每个标签内容的方法
    *@param ch, start, length
    *@return void
    */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        //当前标签内容不为空
        if (ch.length!=0){
            //声明一个变量存当前标签的内容,将数据类型文本内容转换字符串
            String content=new String(ch,start,length);
            //根据标签名判断当前值是对应的是哪个标签的文本值
            if ("sname".equals(tagName)){//姓名
                //将标签文本值存在当前对应学生对象的属性中
                stu1.setSname(content);
            }else if ("ssex".equals(tagName)){//性别
                //将标签文本值存在当前对应学生对象的属性中
               stu1.setSsex(content);
            }else if ("sage".equals(tagName)){//年龄
                //将标签文本值存在当前对应学生对象的属性中
               stu1.setSage(Integer.valueOf(content));
            }
        }
    }

    /**
    *重写父类中解析每个结束标签的方法
    *@param uri, localName, qName
    *@return void
    */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        //如果结束标签为student,说明已经解析完了一个学生对象,将当前解析出学生对象存入集合中
        if ("student".equals(qName)){
            stuList.add(stu1);
        }
    }

    /**
    *重写父类中结束解析xml文档的方法
    *@return void
    */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("当前xml解析完了");
    }
}
public static void main(String[] args) throws Exception {
    //1.创建sax解析器工厂对象
    SAXParserFactory factory=SAXParserFactory.newInstance();
    //2.用解析器工厂对象创建解析器对象
    SAXParser parser=factory.newSAXParser();
    //3.创建自定义解析器对象的处理器
    MyHandle mh=new MyHandle();
    //4用解析器对象调用解析方法解析xml
    parser.parse("Day40\\src\\students.xml",mh);

    //遍历解析结果
    for (Student s:mh.stuList){
        System.out.println(s);
    }
}

你可能感兴趣的:(DOM4J解析xml&Sax解析XML)