java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)
本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容
1、xml解析的含义
2、XML的解析方式
3、xml的解析工具
4、XML的解析原理
5、实例
6、附录1(获取xml中的所有节点、根标签、根标签下的子标签、子标签中的文本内容)
7、附录2(获取xml中的所有节点、根标签、根标签下的子标签、子标签中的文本内容)
8、附录3(把xml文档中的信息封装到对象中)
1、xml解析的含义
xml文件除了给开发者看,更多情况下是使用程序读取xml文件中的内容
2、XML的解析方式
DOM解析
SAX解析
3、xml的解析工具
3.1、DOM解析工具
1.JAXP(oracle-Sun公司官方)
2.JDOM工具(非官方)
3.Dom4j工具(非官方的)。 三大框架(默认读取xml的工具就是DOM4j)
3.2、SAX解析工具
1.Sax解析工具(oracle-Sun公司官方)
4、XML的解析原理
4.1、DOM解析的原理
xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一个Document的对象树,通过document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容.
缺点:内存消耗大
优点:文档增删改查比较容易
4.2、SAX解析的原理
从上往下读,读一行处理一行。 DOM与SAX解析的区别 SAX解析原理
优点:内存消耗小,适合读
缺点:不适合增删改
5、实例
例1:
package com.bw.test; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader; public class Demo1 {
/*
* 第一个Dom4j读取xml文档的例子
*
* */
public static void main(String[] args) {
try {
//1.创建一个xml解析器对象
SAXReader reader = new SAXReader();
//2.读取xml文档,返回Document对象
Document doc= reader.read("./src/contact.xml");
System.out.println(doc);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
contact.xml文件
<?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001" sex="男">
<name>张三</name>
<age>18</age>
<phone>15779593710</phone>
<email>872855221@qq.com</email>
<qq>872855221</qq>
<abc>
<a><b></b></a>
</abc>
</contact>
<contact id="038">
<name>李四</name>
<age>20</age>
<phone>1314580</phone>
<email>12580@qq.com</email>
<qq>832144529</qq>
</contact>
</contactList>
例2:
package com.shore.test; import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test; /**
* @author DSHORE / 2018-8-29
*
*/
public class Demo1 {
@Test
public void test1() throws DocumentException{
//1.读取xml文档,返回一个document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
Iterator<Node> it=doc.nodeIterator();
while(it.hasNext()){//判断是否有下一位元素
Node node=it.next();
System.out.println(node.getName());
//继续获取下面的子节点
//只有标签有子节点
//判断当前节点是否为标签节点
if(node instanceof Element){
Element elem=(Element)node;
Iterator<Node> it2=elem.nodeIterator();
while(it2.hasNext()){
Node n2=it2.next();
System.out.println(n2.getName());
}
}
}
}
}
实例结果图
附录1
package com.shore.test; import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test; /**
* @author DSHORE / 2018-8-29
*
*/
/*
* 第二个dom4j读取的xml文件内容
* 节点
* 标签
* 属性
* 文本
* */
public class Demo1 {
@Test
public void test1() throws DocumentException{
//1.读取xml文档,返回一个document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//nodeIterator:得到当前节点下的所有子节点对象(不包含孙以及孙以下的节点)
Iterator<Node> it=doc.nodeIterator();
while(it.hasNext()){//判断是否有下一位元素
Node node=it.next();
System.out.println(node.getName());
//继续获取下面的子节点
//只有标签有子节点
//判断当前节点是否为标签节点
if(node instanceof Element){
Element elem=(Element)node;
Iterator<Node> it2=elem.nodeIterator();
while(it2.hasNext()){
Node n2=it2.next();
System.out.println(n2.getName());
}
}
}
}
/*
* 遍历xml文件的所有节点
* */
@Test
public void test2() throws DocumentException{
//1.读取xml文档获取Document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//得到跟标签
Element rootEls=doc.getRootElement();
getChildNodes(rootEls);
}
/*
* 获取传入标签下的所有子标签
* */
private void getChildNodes(Element rootEls) {
if(rootEls instanceof Element){
System.out.println(rootEls.getName());
}
//得到子节点
Iterator<Node> it=rootEls.nodeIterator();
while(it.hasNext()){
Node node=it.next();
//判断是否是标签节点
if(node instanceof Element){
Element el=(Element)node;
//递归
getChildNodes(el);
}
}
}
/*
* 获取标签
* */
@Test
public void test3() throws DocumentException{
//1.读取xml文档,返回Document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//得到跟标签
Element elt=doc.getRootElement();
//得到标签名称
String name=elt.getName();
System.out.println(name);//返回值:contactList //方法1:得到当前标签下指定的名称的第一个子标签
Element contactElem=elt.element("contact");
String name1=contactElem.getName();
System.out.println(name1);//返回值:contact //方法2:得到当前根标签下的所有下一级子标签
List<Element> list=elt.elements();
//遍历list
//1).传统的for循环 2).增强for循环 3).迭代器
for(int i=0;i<list.size();i++){
Element e=list.get(i);
System.out.println(e.getName());//返回值:contact 注意:这里的返回值是有两个contact,因为contact.xml文件中有两个根标签的下一级标签contact(两个contact是同一级)
}
for (Element e : list) {//增强for循环
System.out.println(e.getName());//返回值:contact 同上
}
Iterator<Element> it=list.iterator();
while(it.hasNext()){//迭代器
Element e=it.next();
System.out.println(e.getName());//返回值:contact 同上
} //方法3:获取更深层次标签(方法只能一层层地获取)
Element element=doc.getRootElement().element("contact").element("name");
System.out.println(element.getName());//返回值:name
}
/*
* 获取属性值
* */
@Test
public void test4() throws DocumentException{
//1.读取xml文档,返回一个Document对象
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/contact.xml"));
//获取属性(先获取标签对象,然后在获取属性)
//获得标签对象
Element contactElt=doc.getRootElement().element("contact");
//获取属性,得到指定名称属性值
String idValue=contactElt.attributeValue("id");
System.out.println(idValue);//返回值:001
//得到指定属性名称的属性对象
Attribute idAttr=contactElt.attribute("id");
//getName()属性名 getValue属性值
System.out.println(idAttr.getName()+"/"+idAttr.getValue());//返回值:id/001
}
}
结果图
注:test3()的结果,看代码中的注释
附录2
package com.shore.test; import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* @author DSHORE / 2018-8-29
*
*/ public class Demo2 {
/*
* 获取属性
* */
@Test
public void test() throws DocumentException{
//1.解析xml文档,返回一个document对象
Document doc=new SAXReader().read(new File("./src/contact.xml"));
//获取属性:(先获取属性所在标签对象,然后才能获取属性值)
//2.得到标签
Element elt=doc.getRootElement().element("contact");
//3.得到属性
//得到指定名称的属性值
String idValue=elt.attributeValue("id");
System.out.println(idValue);//返回值:001
//得到指定名称的属性对象
Attribute aib=elt.attribute("id");
//getName() 属性名称 getValue()属性值
System.out.println("属性名称:"+aib.getName()+"/"+"属性值:"+aib.getValue());//返回值:属性名称:id/属性值:001 //方式1:得到所有属性对象,返回一个list()
List<Attribute> list=elt.attributes();
for (Attribute attr: list) {
System.out.println(attr.getName());//返回值:id/001 sex/男
} //方式2:得到所有属性对象,返回一个迭代器
Iterator<Attribute> attr2=elt.attributeIterator();
while(attr2.hasNext()){
Attribute a=attr2.next();
System.out.println(a.getName()+"/"+a.getValue());//返回值:id/001 sex/男
}
}
/*
* 获取文本内容
* */
@Test
public void test2() throws DocumentException{
//1.解析xml文档,返回一个document对象
Document doc=new SAXReader().read(new File("./src/contact.xml"));
/*
* 注意:空格和换行也是xml的内容
* */
String content=doc.getRootElement().getText();
//获取文本内容(先获取标签,在获取标签上的内容)
Element elt=doc.getRootElement().element("contact").element("name");
//方式1:得到文本内容
String test=elt.getText();
System.out.println(test);//返回值:张三 //方式2:得到指定标签的文本内容
String test2=doc.getRootElement().element("contact").elementText("phone");
System.out.println(test2); //返回值:15779593710
}
}
附录3
contact.xml文件
<?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001" sex="男">
<name>张三</name>
<age>18</age>
<phone>15779593710</phone>
<email>872855221@qq.com</email>
<qq>872855221</qq>
<abc>
<a> </a>
</abc>
</contact>
<contact id="038">
<name>李四</name>
<age>20</age>
<phone>1314580</phone>
<email>12580@qq.com</email>
<qq>832144529</qq>
</contact>
</contactList>
Contact实体(模型)
package com.shore.test; /**
* @author DSHORE / 2018-8-29
*
*/
public class Contact {
private String id;
private String name;
private String age;
private String phone;
private String email;
private String qq; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "Contact [id=" + id + ", name=" + name + ", age=" + age
+ ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
}
}
把xml文档中的信息封装到对象中
package com.shore.test; import java.io.File;
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; /**
* @author DSHORE / 2018-8-29
*
*/
//把xml文档中的信息封装到对象中
public class Demo3 {
public static void main(String[] args) throws DocumentException {
List<Contact> list=new ArrayList<Contact>();
//读取xml,封装对象
Document doc=new SAXReader().read(new File("./src/contact.xml"));
Iterator<Element> it=doc.getRootElement().elementIterator("contact");
while(it.hasNext()){
Element elt=it.next();
//创建
Contact contact=new Contact();
contact.setId(elt.attributeValue("id"));
contact.setName(elt.elementText("name"));
contact.setAge(elt.elementText("age"));
contact.setPhone(elt.elementText("phone"));
contact.setEmail(elt.elementText("email"));
contact.setQq(elt.elementText("qq"));
list.add(contact);
}
for (Contact contact : list) {
System.out.println(contact);
}
}
}
结果图
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9550048.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)的更多相关文章
- xml解析中的DOM和SAX的区别
面试题:DMO和SAX的区别? DOM解析的优点:增删查改操作方便,缺点:占用内存较大,不适合解析大的XML文件: SAX解析的优点:占用内存小,解析快:缺点:不适合增删查改:
- Java 中,DOM 和 SAX 解析器有什么不同?
DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树,这样可以 更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器, 不会将整个 XML 文档加载到内存.由 ...
- java基础58 JavaScript的几种格式和变量的声明方式(网页知识)
1.JavaScript的几种格式 1.1.JavaScript的特点 1.跨平台性 2.安全性.(javaScript代码不能直接访问电脑硬盘上的信息) 1.2.Java与javaScript ...
- java基础74 XML解析中的SAX解析相关知识点(网页知识)
1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.* 点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...
- Java SE之XML<二>XML DOM与SAX解析
[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...
- java基础之XML
目录 java基础之XML 1. XML解析概述 2. DOM4J介绍 2.1 常用包 2.2 内置元素 2.2 Element类 2.3 Attribute类 2.4 常用操作 3. 代码演示 3. ...
- schema文件及XML文件的DOM和Sax解析
schema文件 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="htt ...
- Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
- JAXP进行DOM和SAX解析
1.常用XML的解析方式:DOM和SAX 1)DOM思想:将整个XML加载内存中,形成文档对象,所以对XML操作都对内存中文档对象进行. 2)SAX思想:一边解析,一边处理,一边释放内存资源---不允 ...
随机推荐
- 【bzoj3926】 Zjoi2015—诸神眷顾的幻想乡
http://www.lydsy.com/JudgeOnline/problem.php?id=3926 (题目链接) 题意 给出一棵树,每个节点有一个编号,范围在${[0,9]}$.一个序列是指树上 ...
- bzoj 4199 && NOI 2015 品酒大会
一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainbow 调制了 ...
- 【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp
Prelude 快THUWC了,所以补一下以前的题. 真的是一道神题啊,网上的题解没几篇,而且还都看不懂,我做了一天才做出来. 传送到LOJ:(>人<:) Solution 直接切入正题. ...
- Head内常用标签
一.标签分类 1.1 自闭和标签 自闭和标签只有开头没有结尾,自动闭合: <meta> 标签 <link> 标签 1.2主动闭合标签 有开头也有结尾,是主动闭合的,称为主动闭合 ...
- python【数据类型:集合】
- Linux操作系统常见安装方式
Linux操作系统常见安装方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在window操作系统安装程序只需要点点鼠标就能搞定的事情,但是在Linux操作系统中,尤其是字符终端 ...
- 基于索引的MySQL优化
今天查看MySQL慢查询日志,查看一个四表关联的SQL操作,耗时1006s.这次也是基于基于子查询的思路,对上表进行优化.使时间复杂度降到n^2级别.但优化之后时间反而是原来的三倍多. 原SQL语句: ...
- 视音频数据处理入门:RGB、YUV像素数据处理
===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...
- (一)在Lingo中使用集合
1. 在Lingo中使用集合 4.1 集合的基本用法和lingo模型的基本要素 Lingo虽然使用方便,但是如果要解决几万个,几十万个变量的优化问题时,我们总不能一个一个地列出x1,x2,…,x ...
- zz 启动Matlab提示Microsoft Visual C++ 2005 Redistributable存在问题问题
帮助领导搞Matlab 2010a 绿色版; 领导把绿色版的文件夹挪了一下位置 (领导就是领导,做什么都按照自己的想当然的想法做) 然后, 脆弱的绿色版Matlab 2010a Portable就罢工 ...