xml解析性能比较

前端之家收集整理的这篇文章主要介绍了xml解析性能比较前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文转载自:http://www.cnblogs.com/Qian123/p/5231303.html

Java文件操作①——XML文件的读取

一、邂逅XML

文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输。所以XML在现今应用程序中是非常流行的。本文主要讲Java解析和生成XML。用于不同平台、不同设备间的数据共享通信。

XML文件的表现:以“.xml”为文件扩展名的文件

   存储结构:树形结构;

节点名称区分大小写。

1、<book id="1"></book> id为属性, <book><id>1</id></book> id为节点
2、xml文件开头要加上版本信息和编码方式<?xml version="1.0" encoding="UTF-8"?>

比如:

❤ 为什么要使用XML?

思考1:不同应用程序之间的通信?

思考2:不同平台间的通信?

思考3:不同平台间的数据共享

答案就是我们要学习的XML文件。我们可以使用相同的xml把不同的文件联系起来

二、应用 DOM 方式解析 XML

❤在Java程序中如何获取XML文件内容

解析的目的:获取节点名、节点值、属性名、属性值;

四种解析方式:DOM、SAX、DOM4J、JDOM

DOM、SAX :java 官方方式,不需要下载jar包
DOM4J、JDOM :第三方,需要网上下载jar包

示例:解析XML文件,目标是解析XML文件后,Java程序能够得到xml文件的所有数据

思考:如何在Java程序中保留xml数据的结构?

如何保留节点之间的层级关系?

注意常用的节点类型:

下面介绍DOM方式解析XML:

功能说明:

代码示例:

 1 package com.study.domtest;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.xml.parsers.DocumentBuilder;
 6 import javax.xml.parsers.DocumentBuilderFactory;
 7 import javax.xml.parsers.ParserConfigurationException;
 8 
 9 import org.w3c.dom.Document;
10 import org.w3c.dom.NamedNodeMap;
11 import org.w3c.dom.Node;
12 import org.w3c.dom.NodeList;
13 import org.xml.sax.SAXException;
14 
15 /**
16  * DOM方式解析xml
17  */
18 public class DOMTest {
19 
20     public static void main(String[] args) {
21         //1、创建一个DocumentBuilderFactory的对象
22         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
23         //2、创建一个DocumentBuilder的对象
24         try {
25             //创建DocumentBuilder对象
26             DocumentBuilder db = dbf.newDocumentBuilder();
27             //3、通过DocumentBuilder对象的parser方法加载books.xml文件到当前项目下
28             /*注意导入Document对象时,要导入org.w3c.dom.Document包下的*/
29             Document document = db.parse("books.xml");//传入文件名可以是相对路径也可以是绝对路径
30             //获取所有book节点的集合
31             NodeList bookList = document.getElementsByTagName("book");
32             //通过nodelist的getLength()方法可以获取bookList的长度
33             System.out.println("一共有" + bookList.getLength() + "本书");
34             //遍历每一个book节点
35             for (int i = 0; i < bookList.getLength(); i++) {
36                 System.out.println("=================下面开始遍历第" + (i + 1) + "本书的内容=================");
37         //❤未知节点属性的个数和属性名时:
38                 //通过 item(i)方法 获取一个book节点,nodelist的索引值从0开始
39                 Node book = bookList.item(i);
40                 //获取book节点的所有属性集合
41                 NamedNodeMap attrs = book.getAttributes();
42                 System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性");
43                 //遍历book的属性
44                 for (int j = 0; j < attrs.getLength(); j++) {
45                     //通过item(index)方法获取book节点的某一个属性
46                     Node attr = attrs.item(j);
47                     //获取属性
48                     System.out.print("属性名:" + attr.getNodeName());
49                     //获取属性
50                     System.out.println("--属性值" + attr.getNodeValue());
51                 }
52           //❤已知book节点有且只有1个id属性:
53              /* 
54               //前提:已经知道book节点有且只能有1个id属性
55               //将book节点进行强制类型转换,转换成Element类型
56               Element book1 = (Element) bookList.item(i);
57               //通过getAttribute("id")方法获取属性58               String attrValue = book1.getAttribute("id");
59               System.out.println("id属性属性值为" + attrValue);
60               */
61                 
62              //解析book节点的子节点
63                 NodeList childNodes = book.getChildNodes();
64               //遍历childNodes获取每个节点的节点名和节点值
65                 System.out.println("第" + (i+1) + "本书共有" + childNodes.getLength() + "个子节点");
66                 for (int k = 0; k < childNodes.getLength(); k++) {
67                   //区分出text类型的node以及element类型的node
68                     if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
69                       //获取了element类型节点的节点名
70                         System.out.print("第" + (k + 1) + "个节点的节点名:" + childNodes.item(k).getNodeName());
71                       //获取了element类型节点的节点值
72                         System.out.println("--节点值是:" + childNodes.item(k).getFirstChild().getNodeValue());
73 //                        System.out.println("--节点值是:" + childNodes.item(k).getTextContent());
74                     }
75                 }
76                 System.out.println("======================结束遍历第" + (i + 1) + "本书的内容=================");
77             }
78 
79         } catch (ParserConfigurationException e) {
80             e.printStackTrace();
81         } catch (SAXException e) {
82             e.printStackTrace();
83         } catch (IOException e) {
84             e.printStackTrace();
85         }
86     }
87 
88 }

三、应用 SAX 方式解析 XML

SAX是SIMPLE API FOR XML的缩写,与DOM比较而言,SAX是一种轻量型的方法

Dom解析会将整个xml文件加载到内存中,然后再逐个解析
Sax解析是通过Handler处理类逐个依次解析每个节点

在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个NODE对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事。这时候,一个较好的替代解决方法就是SAX。 SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。在XMLReader接受XML文档,在读入XML文档的过程中就进行解析,也就是说读入文档的过程和解析的过程是同时进行的,这和DOM区别很大。

代码示例:Book实体类

 1 package com.study.saxtest.entity;
 2 
 3 /**
 4  * 用Book实体类代表XML文件中的"<book>...</book>"中整个元素
 5  * 在遇到<book>标签,证明我们要存储新的book时需要创建Book对象
 6  */
 7 public class Book {
 8     private String id;
 9     private String name;
10     private String author;
11     private String year;
12     private String price;
13     private String language;
14     public String getId() {
15      return id;
16     }
17     public void setId(String id) {
18      this.id = id;
19     }
20     public String getName() {
21      return name;
22     }
23     public void setName(String name) {
24      this.name = name;
25     }
26     public String getAuthor() {
27      return author;
28     }
29     public void setAuthor(String author) {
30      this.author = author;
31     }
32     public String getYear() {
33      return year;
34     }
35     public void setYear(String year) {
36      this.year = year;
37     }
38     public String getPrice() {
39      return price;
40     }
41     public void setPrice(String price) {
42      this.price = price;
43     }
44     public String getLanguage() {
45      return language;
46     }
47     public void setLanguage(String language) {
48      this.language = language;
49     }
50 }

SAXParserHandler类:

按 Ctrl+C 复制代码