zoukankan      html  css  js  c++  java
  • java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)

    本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容

        1、xml解析的含义
        2、XML的解析方式
        3、xml的解析工具
        4、XML的解析原理
        5、实例
        6、附录1(获取xml中的所有节点、根标签、根标签下的子标签、子标签中的文本内容)
        7、附录2(获取xml中的所有节点、根标签、根标签下的子标签、子标签中的文本内容)
        8、附录3(把xml文档中的信息封装到对象中)



    1、xml解析的含义

        xml文件除了给开发者看,更多情况下是使用程序读取xml文件中的内容

    2、XML的解析方式

        DOM解析
        SAX解析

    3、xml的解析工具

    3.1、DOM解析工具

        1.JAXP(oracle-Sun公司官方)
        2.JDOM工具(非官方)
        3.Dom4j工具(非官方的)。 三大框架(默认读取xml的工具就是DOM4j)

    3.2、SAX解析工具

        1.Sax解析工具(oracle-Sun公司官方)

    4、XML的解析原理

    4.1、DOM解析的原理

        xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一个Document的对象树,通过document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容.

        缺点:内存消耗大
        优点:文档增删改查比较容易

    4.2、SAX解析的原理

        从上往下读,读一行处理一行。      DOM与SAX解析的区别         SAX解析原理

        优点:内存消耗小,适合读
        缺点:不适合增删改

    5、实例    

    例1:

     1 package com.bw.test;
     2 
     3 import org.dom4j.Document;
     4 import org.dom4j.DocumentException;
     5 import org.dom4j.io.SAXReader;
     6 
     7 public class Demo1 {
     8     /*
     9      * 第一个Dom4j读取xml文档的例子
    10      * 
    11      * */
    12     public static void main(String[] args) {
    13         try {
    14             //1.创建一个xml解析器对象
    15             SAXReader reader = new SAXReader();
    16             //2.读取xml文档,返回Document对象
    17             Document doc= reader.read("./src/contact.xml");
    18             System.out.println(doc);
    19         } catch (DocumentException e) {
    20             // TODO Auto-generated catch block
    21             e.printStackTrace();
    22         }
    23     }
    24 }

    contact.xml文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <contactList>
     3     <contact id="001" sex="男">
     4         <name>张三</name>
     5         <age>18</age>
     6         <phone>15779593710</phone>
     7         <email>872855221@qq.com</email>
     8         <qq>872855221</qq>
     9         <abc>
    10             <a><b></b></a>
    11         </abc>
    12     </contact>
    13     <contact id="038">
    14         <name>李四</name>
    15         <age>20</age>
    16         <phone>1314580</phone>
    17         <email>12580@qq.com</email>
    18         <qq>832144529</qq>
    19     </contact>
    20 </contactList>

    例2:

     1 package com.shore.test;
     2 
     3 import java.io.File;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 
     7 import org.dom4j.Document;
     8 import org.dom4j.DocumentException;
     9 import org.dom4j.Element;
    10 import org.dom4j.Node;
    11 import org.dom4j.io.SAXReader;
    12 import org.junit.Test;
    13 
    14 /**
    15  * @author DSHORE / 2018-8-29
    16  *
    17  */
    18 public class Demo1 {
    19     @Test
    20     public void test1() throws DocumentException{
    21         //1.读取xml文档,返回一个document对象
    22         SAXReader reader=new SAXReader();
    23         Document doc=reader.read(new File("./src/contact.xml"));
    24         //nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
    25         Iterator<Node> it=doc.nodeIterator();
    26         while(it.hasNext()){//判断是否有下一位元素
    27             Node node=it.next();
    28             System.out.println(node.getName());
    29             //继续获取下面的子节点
    30             //只有标签有子节点
    31             //判断当前节点是否为标签节点
    32             if(node instanceof Element){
    33                 Element elem=(Element)node;
    34                 Iterator<Node> it2=elem.nodeIterator();
    35                 while(it2.hasNext()){
    36                     Node n2=it2.next();
    37                     System.out.println(n2.getName());
    38                 }    
    39             }        
    40         }
    41     }
    42 }

    实例结果图

    附录1

      1 package com.shore.test;
      2 
      3 import java.io.File;
      4 import java.util.Iterator;
      5 import java.util.List;
      6 
      7 import org.dom4j.Attribute;
      8 import org.dom4j.Document;
      9 import org.dom4j.DocumentException;
     10 import org.dom4j.Element;
     11 import org.dom4j.Node;
     12 import org.dom4j.io.SAXReader;
     13 import org.junit.Test;
     14 
     15 /**
     16  * @author DSHORE / 2018-8-29
     17  *
     18  */
     19 /*
     20  * 第二个dom4j读取的xml文件内容
     21  * 节点
     22  * 标签
     23  * 属性
     24  * 文本
     25  * */
     26 public class Demo1 {
     27     @Test
     28     public void test1() throws DocumentException{
     29         //1.读取xml文档,返回一个document对象
     30         SAXReader reader=new SAXReader();
     31         Document doc=reader.read(new File("./src/contact.xml"));
     32         //nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
     33         Iterator<Node> it=doc.nodeIterator();
     34         while(it.hasNext()){//判断是否有下一位元素
     35             Node node=it.next();
     36             System.out.println(node.getName());
     37             //继续获取下面的子节点
     38             //只有标签有子节点
     39             //判断当前节点是否为标签节点
     40             if(node instanceof Element){
     41                 Element elem=(Element)node;
     42                 Iterator<Node> it2=elem.nodeIterator();
     43                 while(it2.hasNext()){
     44                     Node n2=it2.next();
     45                     System.out.println(n2.getName());
     46                 }    
     47             }        
     48         }
     49     }
     50     /*
     51      * 遍历xml文件的所有节点
     52      * */
     53     @Test
     54     public void test2() throws DocumentException{
     55         //1.读取xml文档获取Document对象
     56         SAXReader reader=new SAXReader();
     57         Document doc=reader.read(new File("./src/contact.xml"));
     58         //得到跟标签
     59         Element rootEls=doc.getRootElement();
     60         getChildNodes(rootEls);
     61     }
     62     /*
     63      * 获取传入标签下的所有子标签
     64      * */
     65     private void getChildNodes(Element rootEls) {
     66         if(rootEls instanceof Element){
     67             System.out.println(rootEls.getName());
     68         }
     69         //得到子节点
     70         Iterator<Node> it=rootEls.nodeIterator();
     71         while(it.hasNext()){
     72             Node node=it.next();
     73             //判断是否是标签节点
     74             if(node instanceof Element){
     75                 Element el=(Element)node;
     76                 //递归
     77                 getChildNodes(el);
     78             }
     79         }
     80     }
     81     /*
     82      * 获取标签
     83      * */
     84     @Test
     85     public void test3() throws DocumentException{
     86         //1.读取xml文档,返回Document对象
     87         SAXReader reader=new SAXReader();
     88         Document doc=reader.read(new File("./src/contact.xml"));
     89         //得到跟标签
     90         Element elt=doc.getRootElement();
     91         //得到标签名称
     92         String name=elt.getName();
     93         System.out.println(name);//返回值:contactList
     94         
     95         //方法1:得到当前标签下指定的名称的第一个子标签
     96         Element contactElem=elt.element("contact");
     97         String name1=contactElem.getName();
     98         System.out.println(name1);//返回值:contact
     99         
    100         //方法2:得到当前根标签下的所有下一级子标签
    101         List<Element> list=elt.elements();
    102         //遍历list
    103         //1).传统的for循环   2).增强for循环  3).迭代器
    104         for(int i=0;i<list.size();i++){
    105             Element e=list.get(i);
    106             System.out.println(e.getName());//返回值:contact   注意:这里的返回值是有两个contact,因为contact.xml文件中有两个根标签的下一级标签contact(两个contact是同一级)
    107         }
    108         for (Element e : list) {//增强for循环
    109             System.out.println(e.getName());//返回值:contact   同上
    110         }
    111         Iterator<Element> it=list.iterator();
    112         while(it.hasNext()){//迭代器
    113             Element e=it.next();
    114             System.out.println(e.getName());//返回值:contact   同上
    115         }
    116         
    117         //方法3:获取更深层次标签(方法只能一层层地获取)
    118         Element element=doc.getRootElement().element("contact").element("name");
    119         System.out.println(element.getName());//返回值:name
    120     }
    121     /*
    122      * 获取属性值
    123      * */
    124     @Test
    125     public void test4() throws DocumentException{
    126         //1.读取xml文档,返回一个Document对象
    127         SAXReader reader=new SAXReader();
    128         Document doc=reader.read(new File("./src/contact.xml"));
    129         //获取属性(先获取标签对象,然后在获取属性)
    130         //获得标签对象
    131         Element contactElt=doc.getRootElement().element("contact");
    132         //获取属性,得到指定名称属性值
    133         String idValue=contactElt.attributeValue("id");
    134         System.out.println(idValue);//返回值:001
    135         //得到指定属性名称的属性对象
    136         Attribute idAttr=contactElt.attribute("id");
    137         //getName()属性名   getValue属性值
    138         System.out.println(idAttr.getName()+"/"+idAttr.getValue());//返回值:id/001
    139     }
    140 }

    结果图

                

       注:test3()的结果,看代码中的注释

    附录2

     1 package com.shore.test;
     2 
     3 import java.io.File;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 
     7 import org.dom4j.Attribute;
     8 import org.dom4j.Document;
     9 import org.dom4j.DocumentException;
    10 import org.dom4j.Element;
    11 import org.dom4j.io.SAXReader;
    12 import org.junit.Test;
    13 /**
    14  * @author DSHORE / 2018-8-29
    15  *
    16  */
    17 
    18 public class Demo2 {
    19     /*
    20      * 获取属性
    21      * */
    22     @Test
    23     public void test() throws DocumentException{
    24         //1.解析xml文档,返回一个document对象
    25         Document doc=new SAXReader().read(new File("./src/contact.xml"));
    26         //获取属性:(先获取属性所在标签对象,然后才能获取属性值)
    27         //2.得到标签
    28         Element elt=doc.getRootElement().element("contact");
    29         //3.得到属性
    30         //得到指定名称的属性值
    31         String idValue=elt.attributeValue("id");
    32         System.out.println(idValue);//返回值:001
    33         //得到指定名称的属性对象
    34         Attribute aib=elt.attribute("id");
    35         //getName() 属性名称       getValue()属性值
    36         System.out.println("属性名称:"+aib.getName()+"/"+"属性值:"+aib.getValue());//返回值:属性名称:id/属性值:001
    37 
    38         //方式1:得到所有属性对象,返回一个list()
    39         List<Attribute> list=elt.attributes();
    40         for (Attribute attr: list) {
    41             System.out.println(attr.getName());//返回值:id/001   sex/男
    42         }
    43         
    44         //方式2:得到所有属性对象,返回一个迭代器
    45         Iterator<Attribute> attr2=elt.attributeIterator();
    46         while(attr2.hasNext()){
    47             Attribute a=attr2.next();
    48             System.out.println(a.getName()+"/"+a.getValue());//返回值:id/001   sex/男
    49         }
    50     }
    51     /*
    52      * 获取文本内容
    53      * */
    54     @Test
    55     public void test2() throws DocumentException{
    56         //1.解析xml文档,返回一个document对象
    57         Document doc=new SAXReader().read(new File("./src/contact.xml"));
    58         /*
    59          * 注意:空格和换行也是xml的内容
    60          * */
    61         String content=doc.getRootElement().getText();
    62         //获取文本内容(先获取标签,在获取标签上的内容)
    63         Element elt=doc.getRootElement().element("contact").element("name");
    64         //方式1:得到文本内容
    65         String test=elt.getText();
    66         System.out.println(test);//返回值:张三
    67         
    68         //方式2:得到指定标签的文本内容
    69         String test2=doc.getRootElement().element("contact").elementText("phone");
    70         System.out.println(test2);    //返回值:15779593710
    71     }
    72 }

    附录3

    contact.xml文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <contactList>
     3     <contact id="001" sex="男">
     4         <name>张三</name>
     5         <age>18</age>
     6         <phone>15779593710</phone>
     7         <email>872855221@qq.com</email>
     8         <qq>872855221</qq>
     9         <abc>
    10             <a>  </a>
    11         </abc>
    12     </contact>
    13     <contact id="038">
    14         <name>李四</name>
    15         <age>20</age>
    16         <phone>1314580</phone>
    17         <email>12580@qq.com</email>
    18         <qq>832144529</qq>
    19     </contact>
    20 </contactList>

    Contact实体(模型)

     1 package com.shore.test;
     2 
     3 /**
     4  * @author DSHORE / 2018-8-29
     5  *
     6  */
     7 public class Contact {
     8     private String id;
     9     private String name;
    10     private String age;
    11     private String phone;
    12     private String email;
    13     private String qq;
    14     
    15     public String getId() {
    16         return id;
    17     }
    18     public void setId(String id) {
    19         this.id = id;
    20     }
    21     public String getName() {
    22         return name;
    23     }
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27     public String getAge() {
    28         return age;
    29     }
    30     public void setAge(String age) {
    31         this.age = age;
    32     }
    33     public String getPhone() {
    34         return phone;
    35     }
    36     public void setPhone(String phone) {
    37         this.phone = phone;
    38     }
    39     public String getEmail() {
    40         return email;
    41     }
    42     public void setEmail(String email) {
    43         this.email = email;
    44     }
    45     public String getQq() {
    46         return qq;
    47     }
    48     public void setQq(String qq) {
    49         this.qq = qq;
    50     }
    51     @Override
    52     public String toString() {
    53         return "Contact [id=" + id + ", name=" + name + ", age=" + age
    54                 + ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
    55     }
    56 }

    把xml文档中的信息封装到对象中

     1 package com.shore.test;
     2 
     3 import java.io.File;
     4 import java.util.ArrayList;
     5 import java.util.Iterator;
     6 import java.util.List;
     7 
     8 import org.dom4j.Document;
     9 import org.dom4j.DocumentException;
    10 import org.dom4j.Element;
    11 import org.dom4j.io.SAXReader;
    12 
    13 /**
    14  * @author DSHORE / 2018-8-29
    15  *
    16  */
    17 //把xml文档中的信息封装到对象中
    18 public class Demo3 {
    19     public static void main(String[] args) throws DocumentException {
    20         List<Contact> list=new ArrayList<Contact>();
    21         //读取xml,封装对象
    22         Document doc=new SAXReader().read(new File("./src/contact.xml"));
    23         Iterator<Element> it=doc.getRootElement().elementIterator("contact");
    24         while(it.hasNext()){
    25             Element elt=it.next();
    26             //创建
    27             Contact contact=new Contact();
    28             contact.setId(elt.attributeValue("id"));
    29             contact.setName(elt.elementText("name"));
    30             contact.setAge(elt.elementText("age"));
    31             contact.setPhone(elt.elementText("phone"));
    32             contact.setEmail(elt.elementText("email"));
    33             contact.setQq(elt.elementText("qq"));
    34             list.add(contact);
    35         }
    36         for (Contact contact : list) {
    37             System.out.println(contact);
    38         }
    39     } 
    40 }

    结果图

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/9550048.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    Django框架(二)—— 基本配置:app注册、模板配置、静态文件配置、数据库连接配置post和get
    Django框架(六)—— 视图层:HttpRequest、HTTPResponse、JsonResponse、CBV和FBV、文件上传
    mysql添加上log_bin步骤如下
    Could not synchronize database state with session问题,说保存空
    使用JSONArray.fromObject转化list时,如果有集合属性,很容易出错,此刻把集合属性过滤掉便可
    遇到奇葩的现象,给input的id为10的value属性赋值为6,但是怎么显示的时候值还是原先的9的
    ligerui有时候竖直的线没对齐,是因为某一列的内容太长,此刻可以调整一下此列的宽度为适当的值便可消除此现象
    powerdesigner 连接数据库
    建实体类时,属性可不能用数据库关键字
    birt分组时,如何让居中
  • 原文地址:https://www.cnblogs.com/dshore123/p/9550048.html
Copyright © 2011-2022 走看看