解析XML文件的几种常见操作方法—DOM/SAX/DOM4j

  一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识。看到了xml解析,目前我还没用到过。但多了解一下,加深点记忆和理解也无害处,权当复习吧。

  在此只写下常见的三种XML解析方法,即DOM解析、SAX解析、DOM4J解析。

  先上一份xml文件,关于xml文件的格式和创建方法,在此不多说了。

 1 <?xml version="1.0" encoding="utf-8"?>
2 <root>
3 <class name="class1">
4 <student>
5 <name>张三</name>
6 <age>20</age>
7 <sex>男</sex>
8 </student>
9 <student>
10 <name>Andy</name>
11 <age>22</age>
12 <sex>female</sex>
13 </student>
14 </class>
15 <class name="class2">
16 <student>
17 <name>李四</name>
18 <age>15</age>
19 <sex>男</sex>
20 </student>
21 <student>
22 <name>bigbang</name>
23 <age>21</age>
24 <sex>女</sex>
25 </student>
26 </class>
27 </root>

DOM解析是一种消耗内存的解析方法,它先将整个xml文档装入内存,然后顺序读取,解析也是有些复杂,具体的操作都在注释中,不多说了。

 1 import java.io.IOException;
2 import java.util.ArrayList;
3 import java.util.List;
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.Element;
11 import org.w3c.dom.Node;
12 import org.w3c.dom.NodeList;
13 import org.xml.sax.SAXException;
14
15 import com.entity.Student;
16
17 public class DOMParse {
18
19 private Student student;
20 private List<Student> students;
21
22 public void pasre() {
23 students = new ArrayList<Student>();
24 try {
25 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
26 DocumentBuilder builder = dbf.newDocumentBuilder();
27 // 在此没有使用InputStream作为参数,直接引用文件路径。
28 Document doc = builder.parse("src/com/parseDom/test.xml");
29 // 获取整个document元素
30 Element element = doc.getDocumentElement();
31 // 获取所有<class>子节点
32 NodeList list = element.getElementsByTagName("class"); // <class>
33 // 遍历class子节点
34 for (int i = 0; i < list.getLength(); i++) {
35 Element el = (Element) list.item(i);
36 // 获取<student>节点
37 NodeList stus = el.getElementsByTagName("student"); // <student>
38 // 遍历student子节点
39 for (int j = 0; j < stus.getLength(); j++) {
40 /**
41 * 获取student下所有子节点 此处有7个节点,分别是#text<name> #text<sex>
42 * #text<age> #text
43 * 对应的xml实际是<student>、<name>、#name、<sex>、#sex
44 * 、<age>、#age这七个子节点
45 * **/
46 NodeList lis = stus.item(j).getChildNodes();
47 // 每个student节点输出就是一个Student对象
48 student = new Student();
49 for (int k = 0; k < lis.getLength(); k++) {
50 // 当元素为节点元素时(非textValue),对比后取值
51 if (lis.item(k).getNodeType() == Node.ELEMENT_NODE) {
52 if ("name".equals(lis.item(k).getNodeName())) { // <name>
53 student.setName(lis.item(k).getFirstChild().getNodeValue());
54 }
55 if ("sex".equals(lis.item(k).getNodeName())) { // <sex>
56 student.setSex(lis.item(k).getFirstChild().getNodeValue());
57 }
58 if ("age".equals(lis.item(k).getNodeName())) { // <age>
59 student.setAge(Integer.parseInt(lis.item(k).getFirstChild().getNodeValue()));
60 }
61 }
62 }
63 students.add(student);
64 }
65 }
66
67 } catch (ParserConfigurationException e) {
68 e.printStackTrace();
69 } catch (SAXException e) {
70 e.printStackTrace();
71 } catch (IOException e) {
72 e.printStackTrace();
73 } finally {
74 for (Student stus : students) {
75 System.out.println(stus.getName() + "--" + stus.getSex() + "--" + stus.getAge());
76 }
77 }
78 }
79
80 public static void main(String[] args) {
81 DOMParse domParse = new DOMParse();
82 domParse.pasre();
83 }
84 }

SAX解析方法如下,依然看注释说明。

 1 import java.io.IOException;
2 import java.util.ArrayList;
3 import java.util.List;
4
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.parsers.SAXParser;
7 import javax.xml.parsers.SAXParserFactory;
8
9 import org.xml.sax.Attributes;
10 import org.xml.sax.SAXException;
11 import org.xml.sax.helpers.DefaultHandler;
12
13 import com.entity.Student;
14
15 public class SAXParse extends DefaultHandler{
16
17
18 private Student student;
19 private static List<Student> stus;
20 private String preTag=null;
21
22 //①程序启动执行
23 @Override
24 public void startDocument() throws SAXException {
25 stus = new ArrayList<Student>();
26 }
27
28 //② 开始遍历元素时
29 @Override
30 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
31 if("student".equals(qName)){
32 student = new Student();
33 // student.setName(attributes.getValue(0));
34 }
35 preTag = qName;
36 }
37
38 //④元素遍历结束
39 @Override
40 public void endElement(String uri, String localName, String qName) throws SAXException {
41 if("student".equals(qName)){
42 stus.add(student);
43 student = null;
44 }
45 preTag=null;
46 }
47
48 //③ 遍历取值过程
49 @Override
50 public void characters(char[] ch, int start, int length) throws SAXException {
51 if(preTag!=null){
52 String content = new String(ch,start,length);
53 if("name".equals(preTag)){
54 student.setName(content);
55 }
56 if("age".equals(preTag)){
57 student.setAge(Integer.parseInt(content));
58 }
59 if("sex".equals(preTag)){
60 student.setSex(content);
61 }
62 }
63 }
64
65 public void fun(){
66 try {
67 SAXParserFactory factory =SAXParserFactory.newInstance();
68 SAXParser parser = factory.newSAXParser();
69 SAXParse handler = new SAXParse();
70 parser.parse("src/com/parseDom/test.xml", handler);
71 } catch (ParserConfigurationException e) {
72 e.printStackTrace();
73 } catch (SAXException e) {
74 e.printStackTrace();
75 } catch (IOException e) {
76 e.printStackTrace();
77 }
78 }
79
80 public static List<Student> getStus(){
81 return stus;
82 }
83
84 public static void main(String[] args) {
85 new SAXParse().fun();
86 for (Student stu : getStus()) {
87 System.out.println(stu.getName()+"--"+stu.getAge()+"--"+stu.getSex());
88 }
89 }
90 }

DOM4J的解析方法如下,需要注意的是它的Document类和Element类是DOM4J的jar包提供的,不要引用错了。

 1 import java.util.ArrayList;
2 import java.util.Iterator;
3 import java.util.List;
4
5 import org.dom4j.Document;
6 import org.dom4j.DocumentException;
7 import org.dom4j.Element;
8 import org.dom4j.io.SAXReader;
9
10 import com.entity.Student;
11
12 public class DOM4J {
13
14 private Student student;
15 private List<Student> stus;
16
17 @SuppressWarnings("unchecked")
18 public void parse(){
19 stus = new ArrayList<Student>();
20 try {
21 SAXReader reader = new SAXReader();
22
23 //此处Document类和Element类均为DOM4j的jar包中的类
24 Document doc = reader.read("src/com/parseDom/test.xml");
25 //获取根元素
26 Element root = doc.getRootElement();
27 //获取节点元素为"class"的迭代
28 Iterator<Element> classss = root.elementIterator("class");
29 while(classss.hasNext()){
30 Element classs =classss.next();
31 //获取节点元素为"student"的迭代
32 Iterator<Element> students = classs.elementIterator("student");
33 while (students.hasNext()) {
34 //每一个student节点元素都包括一个student对象
35 student = new Student();
36 Element els = students.next();
37 //根据节点元素取值
38 student.setName(els.elementText("name"));
39 student.setAge(Integer.parseInt(els.elementText("age")));
40 student.setSex(els.elementText("sex"));
41 stus.add(student);
42 }
43 }
44 } catch (DocumentException e) {
45 e.printStackTrace();
46 } finally{
47 for (Student stu : stus) {
48 System.out.println(stu.getName()+"++"+stu.getSex()+"++"+stu.getAge());
49 }
50 }
51 }
52
53
54 public static void main(String[] args) {
55 new DOM4J().parse();
56 }
57 }

最后的输出结果是:

1 张三++男++20
2 Andy++female++22
3 李四++男++15
4 bigbang++女++21

其实每个解析的方法差不多,代码量比较小,很好理解。每个方法都有自己的特点,具体使用要看使用的环境了。

解析XML文件的几种常见操作方法—DOM/SAX/DOM4j的更多相关文章

  1. 解析XML文件的几种常见操作方法:DOM/SAX/DOM4j

    <?xml version="1.0" encoding="utf-8"?> <root> <class name="c ...

  2. 解析Xml文件的三种方式及其特点

    解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...

  3. 解析xml文件的几种技术与Dom4j与sax之间的对比

    一.解析xml文件的几种技术:dom4j.sax.jaxb.jdom.dom 1.dom4j dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常优秀的 ...

  4. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  5. 解析XML文件的几种方式及其比较

    解析xml文件目前比较流行的主要有四种方式: 1. DOM(Document Object Model)它把整个XML文档当成一个对象加载到内  存,不管文档有多大.它一般处理小文件 2.SAX(Si ...

  6. 解析Xml文件的三种方式

    1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. clas ...

  7. [android]解析XML文件的方法有三种:PULL,DOM,SAM

    PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...

  8. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  9. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

随机推荐

  1. ACM_ICPC hdu-2111(简单贪心算法)

    一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...

  2. struts1 Demo

    每次都会忘记一些东西,反复查找原因,其实struts1很简单,可是不去巩固也很容易忘记并且犯错误.这是一个最简单的登录Demo. 1.建立web工程,引入struts1.2包 2.建package:a ...

  3. Glide 下载Gif文件

    之前做了一个类似朋友圈里的查看大图功能,现在也要加上保存功能. 保存图片有很多思路,可以从imageview里提取bitmap,可以用url下载到本地.imageview提取的话,gif图就会变成一张 ...

  4. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...

  5. 通过dblink的方式查看表的结构

    有dba权限: SELECT * FROM DBA_TAB_COLUMNS@DBLINK_TEST WHERE TABLE_NAME = '表名'; 没有dba权限:SELECT * FROM USE ...

  6. 【javascript基础】2、函数

    前言 我在上一篇[javascript基础]基本概念中介绍了javascript的一些基本概念,多谢大家的阅读和意见,自己写的东西可以被大家阅读,真心高兴,刚开始发布的时候我一直盯着阅读人数,虽然知道 ...

  7. Chapter7: question 49 - 50

    49. 把字符串转换为整数 很多细节需要注意.(空格,符号,溢出等) Go: 8. String to Integer (atoi) 50. 树种两个结点的最低公共祖先 A. 若是二叉搜索树,直接与根 ...

  8. [zhang] ViewController的生命周期分析和使用

    iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面是我的一些经验. 一.结构 按结构可以对iOS的所有ViewController分成两类:1.主要用于展示内容的 ...

  9. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

  10. innerText引发的错误

    因为firefox对innerText的不支持,所以以下代码在firefox里运行有错误. //重新加载饼图 ") { var gridView = document.getElementB ...