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

 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>

1. 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 }

2.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 }

3.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
时间: 2024-11-03 13:43:25

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

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

解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 1 class MyDefaultHander extends DefaultHandler{ 2 private List<Student> list; 3 private Student student; 4 5 @Override 6 public void startDo

Java解析XML文件的四种方法

[摘要] 可扩展标志语言(XML)在实现信息标准化.信息的交流与共享上有其独特的技术优势,因此受到了广泛的重视.本文先简单的介绍了XML基本知识,然后从XML应用入手总结了四种现今最常见的XML的解析方法,介绍了这四种方法的特点,其中包括优点与不足之处.最后给出了一个简单的案例来对这四种解析进行代码介绍. [关键字] XML文件,DOM,SAX,JDOM,DOM4J [引言] XML即可扩展标记语言(EXtensible Markup Language),是标准通用标记语言的子集,是一种用于标记

解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一

UI进阶 解析XML文件的两种方式 SAX和DOM

1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 2.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能 数据交换 内容管理 用作配置文件 XML数据结构的语法 声明 节点使用一对标签表示:起始和结束标签. 根节点是起始节点,只有一

XML解析的三种方式(dom,sax,dom4j)

1.Dom解析: 要解析的xml文件内容: <?xml version="1.0" encoding="utf-8" standalone="no"?><class> <stu id="1"> <name>小灰灰</name> <age>23</age> <insto>好学生</insto> </stu> &

解析XML文件的几种方式和区别

DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问. SAX:不现于DOM,SAX是事件驱动型的XML解析方式.它顺序读取XML文件,不需要一次全部装载整个文件.当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问. STAX:Streaming API for XML (StAX

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

PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocument事件. 常用的XML pull的接口和类: XmlPullParser:该解析器是一个在org.xmlpull.v1中定义的解析功能的接口. XmlSerializer:它是一个接口,定义了XML信息集的序列. XmlPullParserFactory:这个类用于在XMPULL V1 API

java中采用dom4j解析xml文件

一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4j解析xml的具体操作. 二.代码详情    dom4j是一个第三方开发组开发出的插件,所以在我们使用dom4jf的时候我们要去下载一下dom4j对应版本的jar导入在我们项目中.  1)xml文件: <?xml version="1.0" encoding="UTF-8&

用Dom4j来解析XML文件

Dom4j jar包地址:https://pan.baidu.com/s/1eNExExlFHIecfW_6YkXpvw  提取码:w5om 首先解压Dom4j jar包,解压后如下 然后把  dom4j-1.6.1.jar  复制放到工程目录下(集成开发工具是myeclipse) 在myeclipse工程下直接右键dom4j-1.6.1.jar,点击Build Path → Add to Build Path myeclipse自动导入jar包,然后就可以使用jar包提供的接口了. 我们创建一