解析XML文件的几种常见操作方法:DOM/SAX/DOM4j
<?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的更多相关文章
- 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j
解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...
- 解析Xml文件的三种方式及其特点
解析Xml文件的三种方式 1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...
- 解析xml文件的几种技术与Dom4j与sax之间的对比
一.解析xml文件的几种技术:dom4j.sax.jaxb.jdom.dom 1.dom4j dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常优秀的 ...
- 解析xml文件的四种方式
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- 解析XML文件的几种方式及其比较
解析xml文件目前比较流行的主要有四种方式: 1. DOM(Document Object Model)它把整个XML文档当成一个对象加载到内 存,不管文档有多大.它一般处理小文件 2.SAX(Si ...
- 解析Xml文件的三种方式
1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. clas ...
- [android]解析XML文件的方法有三种:PULL,DOM,SAM
PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
随机推荐
- Thinking in Java & 内部类
静态内部类可以直接创建对象new B.C(); 如果内部类不是静态的,那就得这样 B b = new B(); B.C c = b.new C(); //要想直接创建内部类的对象,不能按照想象的方式, ...
- ssh结合使用
springxml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=& ...
- 配置高可用集群(实验) corosyne+pacemaker
环境准备: 一准备三个虚拟机,把/etc/hosts/文件配置好 192.168.43.9 node0 ...
- URL query string中文字符问题
如果URL的query string中包含中文字符,在不做特殊处理的情况下通过 request.getParameter 方法是获取不到正确的信息的,这是由于下面的两个机制造成的 浏览器会自动对URL ...
- 隐藏基于Dialog的MFC的主窗体
最近需要做一个主窗体常态隐藏的程序,类似360卫士那样,只有托盘图标常显示.本以为隐藏主窗体很简单,但遇到了意想不到的情况. 无效的做法 最初的想法是设置主对话框资源的 Visiable 属性为 fa ...
- MySQL/Oracle/SQL Server默认端口、JDBCdriver、Url
sqlserver默认端口号为:1433URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname"DRI ...
- python配合Fiddler获取windows app登录时生成cookie实例
工具Fiddler/python3 打开Fiddler,清空一下Fidder里面的请求记录 打开app,进行登录,注意Fiddler里的请求变化 在弹出app登录的时候Fiddler里已经有了四个请求 ...
- 关于Swift中的泛函数find的问题
对于一个数组Array,我们往往需要判断其是否包含某个子项,又或者要查找某个子项是否在这个数组中. 假设有这样一个包含坐标的数组 var pointArray:[CGPoint] = [CGPoint ...
- 洛谷 P1685 游览 解题报告
P1685 游览 题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!! ...
- WEB入门三 CSS样式表基础
学习内容 Ø CSS的基本语法 Ø CSS选择器 Ø 常见的CSS样式 Ø 网页中3种使用CSS的方式 能力目标 Ø 理解CSS的 ...