`
xp9802
  • 浏览: 1211079 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

解析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/PULL

    例如,在Java中,有JDOM、DOM4J等DOM库,SAX有Java内置的SAX解析器,而Android SDK提供了一个名为XmlPullParser的PULL解析器。在Python中,有ElementTree作为DOM和SAX的结合,以及lxml库提供高性能的解析选项。 总...

    XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较,超详细

    常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...

    java处理xml的四种方式jdom/dom4j/dom/sax

    在Java编程语言中,处理XML(可扩展标记语言)数据有四种主要方法:JDOM、DOM4J、DOM和SAX。这些API提供了不同的方法来解析、创建和修改XML文档,各有其优缺点,适用于不同的场景。下面我们将详细介绍这四种方式。 ...

    dom4j下sax解析xml

    在Java编程中,dom4j库提供了对这两种解析方式的支持。 **DOM解析**: DOM解析器将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点遍历整个文档。虽然DOM提供了一种方便的方式来访问和修改XML文档...

    xml 三种解析方式dom,sax,dom4j

    在提供的压缩包中,包含了关于这三种解析方式的代码示例,你可以参考这些代码了解如何在Java环境中使用DOM、SAX和DOM4J进行XML解析。通过阅读和理解这些示例,你可以更好地掌握XML解析技术,并根据项目需求选择合适...

    使用dom4j和jaxen解析xml

    在Java开发中,dom4j和jaxen是两个常用的库,用于解析和操作XML文档。 **dom4j** 是一个非常灵活且功能强大的Java XML API,它提供了全面的XML解决方案,包括XML的读取、写入、修改以及XPath查询等功能。dom4j的...

    解析XML的dom、sax和dom4j的jar包

    在Java中,解析XML有多种方法,主要包括DOM、SAX和DOM4J。下面将详细介绍这三种解析方式及其对应的jar包。 1. DOM (Document Object Model) DOM是一种基于树形结构的XML解析方法,它将整个XML文档加载到内存中,...

    dom,dom4j,sax 解析xml文件实例

    本文将深入探讨DOM、DOM4J和SAX三种常用的XML解析方法,并结合具体的实例进行详细讲解。 首先,DOM(Document Object Model)是W3C组织推荐的一种XML解析标准。它将整个XML文档加载到内存中,构建一个树形结构,...

    XML解析DOM/SAX/PULL

    本文将详细介绍XML的三种解析方法:DOM(Document Object Model)、SAX(Simple API for XML)和PULL(Pull Parser),并提供相关的程序示例。 **DOM解析** DOM解析器将整个XML文档加载到内存中,创建一个树形结构...

    Java使用sax、dom、dom4j解析xml文档

    Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document Object Model)以及DOM4J。下面我们将详细探讨这些解析方式及其在实际开发中的应用。 1. SAX解析器: SAX是一种基于事件驱动的解析器,...

    dom4j解析xml详解

    DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时的强大工具。DOM4J的最大亮点在于其简洁易用的API...

    生成、解析xml的四种方式(dom,dom4j,sax,jdom)

    本文将详细介绍生成和解析XML的四种主要方法:DOM、DOM4J、SAX和JDOM。 1. DOM(Document Object Model) DOM是W3C组织推荐的一种解析XML的标准方式。它将XML文档视为一个树形结构,每个节点代表XML文档的一部分。...

    dom4j解析xml文件的压缩包

    5. **事件驱动解析(SAX)**:除了传统的DOM解析外,DOM4J还支持SAX解析器,这种解析方式适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 6. **Namespace支持**:DOM4J提供了对XML命名空间的全面...

    dom4j下的sax解析xml

    总之,DOM4J结合SAX解析XML为处理大文件提供了一种高效且内存友好的方式。通过创建SAXReader,设置事件监听器,然后解析XML文件,你可以实现对XML文档的流式处理,从而在处理大量数据时避免内存瓶颈。

    SAX解析XML文件实例

    一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml文件的实例

    分别使用DOM和DOM4j解析XML文件

    本篇文章将详细介绍如何使用DOM(Document Object Model)和DOM4j这两种流行的方法来解析XML文件。 首先,DOM是一种标准的W3C推荐的解析XML的方法,它将整个XML文档加载到内存中,形成一个树形结构,便于程序进行...

    XML文件c语言 dom和sax模式解析

    XML(eXtensible Markup Language)是一种用于存储和交换结构化数据的标准格式,广泛应用于软件开发、网络...Xerces-C++库为这两种解析方式提供了强大的支持,通过注册事件处理器或操作DOM树,可以灵活地处理XML数据。

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较.txt )

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与

    读取XML文件的四种方法

    在Java中,读取XML文件有多种方法,本文将介绍四种常见的方法:DOM、DOM4J、JDOM和SAX。 DOM(Document Object Model) DOM是W3C组织制定的XML文档对象模型,它提供了对XML文档的树形结构表示。使用DOM方法读取XML...

    java dom4j解析xml

    Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得开发者能够方便地读取、写入、修改以及操作XML文件。DOM4J是Java中一个非常强大的XML处理库,它结合了DOM、SAX和JDOM的优点,同时也...

Global site tag (gtag.js) - Google Analytics