<?xml version="1.0" encoding="utf-8"?>
<root>
<class name="class1">
<student>
<name>张三</name>
<age>20</age>
<sex>男</sex>
</student>
<student>
<name>Andy</name>
<age>22</age>
<sex>female</sex>
</student>
</class>
<class name="class2">
<student>
<name>李四</name>
<age>15</age>
<sex>男</sex>
</student>
<student>
<name>bigbang</name>
<age>21</age>
<sex>女</sex>
</student>
</class>
</root>

1. DOM解析是一种消耗内存的解析方法,它先将整个xml文档装入内存,然后顺序读取,解析有些复杂。

 import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import com.entity.Student; public class DOMParse { private Student student;
private List<Student> students; public void pasre() {
students = new ArrayList<Student>();
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
// 在此没有使用InputStream作为参数,直接引用文件路径。
Document doc = builder.parse("src/com/parseDom/test.xml");
// 获取整个document元素
Element element = doc.getDocumentElement();
// 获取所有<class>子节点
NodeList list = element.getElementsByTagName("class"); // <class>
// 遍历class子节点
for (int i = 0; i < list.getLength(); i++) {
Element el = (Element) list.item(i);
// 获取<student>节点
NodeList stus = el.getElementsByTagName("student"); // <student>
// 遍历student子节点
for (int j = 0; j < stus.getLength(); j++) {
/**
* 获取student下所有子节点 此处有7个节点,分别是#text<name> #text<sex>
* #text<age> #text
* 对应的xml实际是<student>、<name>、#name、<sex>、#sex
* 、<age>、#age这七个子节点
* **/
NodeList lis = stus.item(j).getChildNodes();
// 每个student节点输出就是一个Student对象
student = new Student();
for (int k = 0; k < lis.getLength(); k++) {
// 当元素为节点元素时(非textValue),对比后取值
if (lis.item(k).getNodeType() == Node.ELEMENT_NODE) {
if ("name".equals(lis.item(k).getNodeName())) { // <name>
student.setName(lis.item(k).getFirstChild().getNodeValue());
}
if ("sex".equals(lis.item(k).getNodeName())) { // <sex>
student.setSex(lis.item(k).getFirstChild().getNodeValue());
}
if ("age".equals(lis.item(k).getNodeName())) { // <age>
student.setAge(Integer.parseInt(lis.item(k).getFirstChild().getNodeValue()));
}
}
}
students.add(student);
}
} } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
for (Student stus : students) {
System.out.println(stus.getName() + "--" + stus.getSex() + "--" + stus.getAge());
}
}
} public static void main(String[] args) {
DOMParse domParse = new DOMParse();
domParse.pasre();
}
}

2.SAX解析方法如下。

 import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import com.entity.Student; public class SAXParse extends DefaultHandler{ private Student student;
private static List<Student> stus;
private String preTag=null; //①程序启动执行
@Override
public void startDocument() throws SAXException {
stus = new ArrayList<Student>();
} //② 开始遍历元素时
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("student".equals(qName)){
student = new Student();
// student.setName(attributes.getValue(0));
}
preTag = qName;
} //④元素遍历结束
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("student".equals(qName)){
stus.add(student);
student = null;
}
preTag=null;
} //③ 遍历取值过程
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(preTag!=null){
String content = new String(ch,start,length);
if("name".equals(preTag)){
student.setName(content);
}
if("age".equals(preTag)){
student.setAge(Integer.parseInt(content));
}
if("sex".equals(preTag)){
student.setSex(content);
}
}
} public void fun(){
try {
SAXParserFactory factory =SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXParse handler = new SAXParse();
parser.parse("src/com/parseDom/test.xml", handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} public static List<Student> getStus(){
return stus;
} public static void main(String[] args) {
new SAXParse().fun();
for (Student stu : getStus()) {
System.out.println(stu.getName()+"--"+stu.getAge()+"--"+stu.getSex());
}
}
}

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

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import com.entity.Student; public class DOM4J { private Student student;
private List<Student> stus; @SuppressWarnings("unchecked")
public void parse(){
stus = new ArrayList<Student>();
try {
SAXReader reader = new SAXReader(); //此处Document类和Element类均为DOM4j的jar包中的类
Document doc = reader.read("src/com/parseDom/test.xml");
//获取根元素
Element root = doc.getRootElement();
//获取节点元素为"class"的迭代
Iterator<Element> classss = root.elementIterator("class");
while(classss.hasNext()){
Element classs =classss.next();
//获取节点元素为"student"的迭代
Iterator<Element> students = classs.elementIterator("student");
while (students.hasNext()) {
//每一个student节点元素都包括一个student对象
student = new Student();
Element els = students.next();
//根据节点元素取值
student.setName(els.elementText("name"));
student.setAge(Integer.parseInt(els.elementText("age")));
student.setSex(els.elementText("sex"));
stus.add(student);
}
}
} catch (DocumentException e) {
e.printStackTrace();
} finally{
for (Student stu : stus) {
System.out.println(stu.getName()+"++"+stu.getSex()+"++"+stu.getAge());
}
}
} public static void main(String[] args) {
new DOM4J().parse();
}
}

最后的输出结果是:

 张三++男++20
Andy++female++22
李四++男++15
bigbang++女++21

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

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

    解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...

  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. redis哨兵机制二(转)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  2. startActivityForResult()的用法(超好用啊)

    最近做的一个小东西遇到这样的情况,我从一个页面MainActivity修改一些内容,需要跳转到一个新的EditActivity去做修改操作,修改完成后就回到之前的MainActivity,因为信息被修 ...

  3. hdu 4686 Arc of Dream(矩阵快速幂)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意: 其中a0 = A0ai = ai-1*AX+AYb0 = B0bi = bi-1*BX+BY ...

  4. 通过jmap查看jvm采用的垃圾收集器

    1  tomcat 的PID获得 ps -ef|grep tomcat [root@iZ2zeapch8kbaw4bxnz8vxZ tomcat7]# ps -ef|grep tomcat root ...

  5. google 浏览器插件安装

    谷歌访问助手

  6. 每日一问(如何在List中加入、设置、获取和删除其中的元素?)

    作为集合接口的一部分,对List接口所做的操作,最常见的就是增删查改了.这里总结下JAVA 中List接口及实现该接口的类实现这些操作的方法. 一.增加新的元素的方法 在Collection接口中定义 ...

  7. VMware 三种网络模式的区别

    VMware 三种网络模式的区别 VMware 三种网络模式的区别 我们首先说一下VMware的几个虚拟设备 VMnet0:用于虚拟桥接网络下的虚拟交换机 VMnet1:用于虚拟Host-Only网络 ...

  8. BZOJ2276 [Poi2011]Temperature 【单调队列】

    题目链接 BZOJ2276 题解 一开始看错题,以为求的是可以不连续的,想出一个奇怪的线段树,发现空间根本开不下?? 题目要我们求连续的最长可能不下降区间 对于区间\([l,r]\)如果合法,当且仅当 ...

  9. docker attach 和 docker exec

    docker attach docker attach -- Attach to a running container. 常用选项: --sig-proxy=true:Proxy all recei ...

  10. scala 的安装 与 IDEA安装使用

    一.安装 scala 1.下载scala-2.11.8.msi 安装包,   首先去官网http://www.scala-lang.org/,然后点击导航栏的DOWNLOAD,进入下载链接:http: ...