• XML解析的四种方式


    1. 首先介绍XML的四种解析方式

      ①DOM (Document Object Model) 文档对象模型

      ②SAX (Simple API for XML)

      ③JDOM (Java-based Document Object Model)

      ④DOM4J (Document Object Model for java)

    2.以下以代码为例进行说明

      首先以下的所有解析xml文件以 person.xml 为例

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <person>
     3     <teacher id="1">
     4         <name>苗创</name>
     5         <desc>哈哈哈,我是是一个好人</desc>
     6     </teacher>
     7 
     8     <teacher id="2">
     9         <name>saoke</name>
    10         <desc>她是我的室友</desc>
    11     </teacher>
    12 </person>
    person.xml

    1.DOM

     1 package com.baba.miao.xml;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.util.ArrayList;
     6 import java.util.List;
     7 
     8 import javax.xml.parsers.DocumentBuilder;
     9 import javax.xml.parsers.DocumentBuilderFactory;
    10 import javax.xml.parsers.ParserConfigurationException;
    11 
    12 import org.w3c.dom.Document;
    13 import org.w3c.dom.Node;
    14 import org.w3c.dom.NodeList;
    15 import org.xml.sax.SAXException;
    16 
    17 import com.baba.miao.vo.Teacher;
    18 
    19 public class DomParseDemo {
    20 
    21     public static void main(String[] args) throws ParserConfigurationException,
    22             SAXException, IOException {
    23         // 创建Dom工厂
    24         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    25         // 通过解析工厂创建解析器
    26         DocumentBuilder db = dbf.newDocumentBuilder();
    27         // 构造指定文件的输入流
    28         InputStream is = Thread.currentThread().getContextClassLoader()
    29                 .getResourceAsStream("person.xml");
    30         // 开始解析,并返回Document
    31         Document docu = db.parse(is);
    32 
    33         List<Teacher> teachers = new ArrayList<Teacher>();
    34         Teacher t = null;
    35         // 根据存档的节点获取
    36         NodeList nodeList = docu.getElementsByTagName("teacher");
    37         for (int i = 0; i < nodeList.getLength(); i++) {
    38             t = new Teacher();
    39             Node teachernode = nodeList.item(i);
    40             // 获取当前节点的属性id值
    41             String id = teachernode.getAttributes().getNamedItem("id")
    42                     .getNodeValue();
    43             System.out.println(id);
    44             t.setId(Integer.parseInt(id));
    45             // 获取当前节点下的所有子节点列表
    46             NodeList childNodeLise = teachernode.getChildNodes();
    47             for (int j = 0; j < childNodeLise.getLength(); j++) {
    48                 // 获取teacher节点下的其中子节点
    49                 Node childNode = childNodeLise.item(j);
    50                 String tagName = childNode.getNodeName();
    51                 if ("name".equals(tagName)) {
    52                     // 获取teacher节点下的name节点的值
    53                     t.setName(childNode.getFirstChild().getNodeValue());
    54                 } else if ("desc".equals(tagName)) {
    55                     // 获取teacher节点下的desc节点的值
    56                     t.setDesc(childNode.getFirstChild().getNodeValue());
    57                 }
    58             }
    59             teachers.add(t);
    60         }
    61         // 输出
    62         System.out.println(teachers);
    63     }
    64 }
    View Code

    2.SAX

    四个接口:① ContentHandler接口 ②DTDHandler接口EntityResolver接口ErrorHandler接口

    由于DefaultHandler类是sax默认基类,同时实现了上面的四个接口,因此继承该类即可。

    SAX解析内容处理器

     1 package com.baba.miao.xml;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import org.xml.sax.Attributes;
     7 import org.xml.sax.SAXException;
     8 import org.xml.sax.helpers.DefaultHandler;
     9 
    10 import com.baba.miao.vo.Teacher;
    11 
    12 /**
    13  * SAX解析内容处理器
    14  * 
    15  * @author Administrator
    16  * 
    17  */
    18 public class PersonHandler extends DefaultHandler {
    19 
    20     private List<Teacher> teachers = null;
    21 
    22     public List<Teacher> getTeachers() {
    23         return teachers;
    24     }
    25 
    26     private Teacher teacher;
    27     private String tag;
    28 
    29     // XML文档开始解析时,调用的方法
    30     @Override
    31     public void startDocument() throws SAXException {
    32         teachers = new ArrayList<Teacher>();
    33     }
    34 
    35     // 解析开始元素是调用该方法
    36     // uri : 标签的命名空间
    37     // localName :元素的本地名称(不带前缀)
    38     // qName : 带前缀的元素名称
    39     // attributes:属性的集合
    40     @Override
    41     public void startElement(String uri, String localName, String qName,
    42             Attributes attributes) throws SAXException {
    43         if ("teacher".equals(qName)) {
    44             teacher = new Teacher();
    45             // 取出属性,并添加teacher中
    46             teacher.setId(Integer.parseInt(attributes.getValue("id")));
    47         }
    48         tag = qName;
    49     }
    50 
    51     // 解析结束元素时调用的方法
    52     @Override
    53     public void endElement(String uri, String localName, String qName)
    54             throws SAXException {
    55         if ("teacher".equals(qName)) {
    56             teachers.add(teacher);
    57         }
    58         tag = null;
    59     }
    60 
    61     // 解析文本内容时调用的方法
    62     @Override
    63     public void characters(char[] ch, int start, int length)
    64             throws SAXException {
    65         if (tag != null) {
    66             if ("name".equals(tag)) {
    67                 teacher.setName(new String(ch, start, length));
    68             } else if ("desc".equals(tag)) {
    69                 teacher.setDesc(new String(ch, start, length));
    70             }
    71         }
    72     }
    73 
    74     // XML解析完成
    75     @Override
    76     public void endDocument() throws SAXException {
    77         super.endDocument();
    78         System.out.println("XML解析完毕");
    79     }
    80 }
    View Code

    解析xml

     1 package com.baba.miao.xml;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.util.List;
     6 
     7 import javax.xml.parsers.ParserConfigurationException;
     8 import javax.xml.parsers.SAXParser;
     9 import javax.xml.parsers.SAXParserFactory;
    10 
    11 import org.xml.sax.SAXException;
    12 
    13 import com.baba.miao.vo.Teacher;
    14 
    15 public class SaxParseDemo {
    16 
    17     public static void main(String[] args) throws ParserConfigurationException,
    18             SAXException, IOException {
    19         // 创建Sax解析器工厂对象
    20         SAXParserFactory factory = SAXParserFactory.newInstance();
    21         // 根据工厂创建解析器对象
    22         SAXParser sax = factory.newSAXParser();
    23         InputStream is = Thread.currentThread().getContextClassLoader()
    24                 .getResourceAsStream("person.xml");
    25         PersonHandler ph = new PersonHandler();
    26         // 开始解析
    27         sax.parse(is, ph);
    28         List<Teacher> list = ph.getTeachers();
    29         System.out.println(list);
    30     }
    31 }
    View Code

    3.JDOM

    该文档对象,必须引入第三方组件  ---> jdom-2.0.5.jar

    下载地址:http://www.jdom.org/downloads/index.html

    下载如图:

     1 package com.baba.miao.xml;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.util.ArrayList;
     6 import java.util.List;
     7 
     8 import org.jdom2.Document;
     9 import org.jdom2.Element;
    10 import org.jdom2.JDOMException;
    11 
    12 
    13 import org.jdom2.input.SAXBuilder;
    14 
    15 import com.baba.miao.vo.Teacher;
    16 
    17 /**
    18  * 使用第三方组件
    19  * 
    20  * @author Administrator
    21  * 
    22  */
    23 public class JdomParseDemo {
    24 
    25     public static void main(String[] args) throws JDOMException, IOException {
    26         //创建解析器
    27         SAXBuilder saxBuilder = new SAXBuilder();
    28         InputStream is = Thread.currentThread().
    29                 getContextClassLoader().getResourceAsStream("person.xml");
    30         //开始解析
    31         Document docu = saxBuilder.build(is);
    32         
    33         //获取根元素
    34         Element root = docu.getRootElement();
    35         //获取根元素下的所有的子元素
    36         
    37         List<Element> list = root.getChildren();
    38         
    39         List<Teacher> teachers = new ArrayList<Teacher>();
    40         //遍历
    41         for(int i = 0;i < list.size();i++){
    42             Teacher t = new Teacher();
    43             Element e = list.get(i);
    44             String id = e.getAttributeValue("id");
    45             t.setId(Integer.parseInt(id));
    46             //获取当前元素的子元素的文本内容
    47             t.setName(e.getChildText("name"));
    48             t.setDesc(e.getChildText("desc"));
    49             teachers.add(t);
    50         }
    51         System.out.println(teachers);
    52     }
    53 }
    View Code

    4.DOM4J

    必须引入第三方组件 ---> dom4j-1.6.1.jar

    下载网站 :  http://www.dom4j.org/dom4j-1.6.1/

     1 package com.baba.miao.xml;
     2 
     3 import java.io.InputStream;
     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 import com.baba.miao.vo.Teacher;
    14 
    15 public class Dom4jParseDemo {
    16 
    17     public static void main(String[] args) throws DocumentException {
    18         // 创建解析器
    19         SAXReader saxReader = new SAXReader();
    20 
    21         InputStream is = Thread.currentThread().getContextClassLoader()
    22                 .getResourceAsStream("person.xml");
    23         // 开始解析,并返回Document
    24         Document docu = saxReader.read(is);
    25         Element root = docu.getRootElement();
    26         // 获取根元素的所有子元素
    27         Iterator<Element> iters = root.elementIterator();
    28         List<Teacher> list = new ArrayList<Teacher>();
    29         while (iters.hasNext()) {
    30             Teacher t = new Teacher();
    31             Element e = iters.next();
    32             t.setId(Integer.parseInt(e.attributeValue("id")));
    33             t.setName(e.elementText("name"));
    34             t.setDesc(e.elementText("desc"));
    35             list.add(t);
    36         }
    37         System.out.println(list);
    38     }
    39 
    40 }
    View Code

        比较:

        1.JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出

        2.SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,

         但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中). 

         |--> 如果是做手机方面的可以考虑,因为手机很难扩容

        3.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,

         例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

         |--> 如果是考虑服务器方面的可以考虑,服务器很容易扩容

                本人是一个JAVA爱好者,欢迎交流

                            ------By 小苗

  • 相关阅读:
    739. Daily Temperatures
    535. Encode and Decode TinyURL
    811. Subdomain Visit Count
    706. Design HashMap
    C++-static作用(转)
    大学四年应当如何渡过(转)
    计算机导论第八章-总结
    计算机导论第四章习题
    计算机导论-第一章习题
    20世纪最伟大的十大算法
  • 原文地址:https://www.cnblogs.com/sxmcACM/p/3647545.html
Copyright © 2020-2023  润新知