本文知识点(目录):本文下面的“实例及附录”全是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解析工具】相关知识点(网页知识)的更多相关文章

  1. xml解析中的DOM和SAX的区别

    面试题:DMO和SAX的区别? DOM解析的优点:增删查改操作方便,缺点:占用内存较大,不适合解析大的XML文件: SAX解析的优点:占用内存小,解析快:缺点:不适合增删查改:

  2. Java 中,DOM 和 SAX 解析器有什么不同?

    DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树,这样可以 更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器, 不会将整个 XML 文档加载到内存.由 ...

  3. java基础58 JavaScript的几种格式和变量的声明方式(网页知识)

    1.JavaScript的几种格式 1.1.JavaScript的特点 1.跨平台性    2.安全性.(javaScript代码不能直接访问电脑硬盘上的信息) 1.2.Java与javaScript ...

  4. java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.*         点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...

  5. Java SE之XML<二>XML DOM与SAX解析

    [文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...

  6. java基础之XML

    目录 java基础之XML 1. XML解析概述 2. DOM4J介绍 2.1 常用包 2.2 内置元素 2.2 Element类 2.3 Attribute类 2.4 常用操作 3. 代码演示 3. ...

  7. schema文件及XML文件的DOM和Sax解析

    schema文件 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="htt ...

  8. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

  9. JAXP进行DOM和SAX解析

    1.常用XML的解析方式:DOM和SAX 1)DOM思想:将整个XML加载内存中,形成文档对象,所以对XML操作都对内存中文档对象进行. 2)SAX思想:一边解析,一边处理,一边释放内存资源---不允 ...

随机推荐

  1. 【spoj SUBLEX】 Lexicographical Substring Search

    http://www.spoj.com/problems/SUBLEX/ (题目链接) 题意 给出一个字符串,询问其中字典序第K小的子串. Solution 后缀自动机例题. 构出后缀自动机以后,对每 ...

  2. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)

    从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...

  3. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  4. hihocoder #1162 矩阵加速dp

    #1162 : 骨牌覆盖问题·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 前两周里,我们讲解了2xN,3xN骨牌覆盖的问题,并且引入了两种不同的递推方法.这一次我 ...

  5. 【Asp.net入门4-01】基本开发工具

  6. Pycharm远程连接服务器,并在本地调试服务器代码

    问题描述 其实有很多教程了,我只是想记录一下设置得记录,这样就能充分利用阿里云服务器为我跑代码了... 步骤一:配置deployment 步骤二:选择远程python解释器 步骤三:将本地文件上传至远 ...

  7. jdk与jdt

    jdk是java的开发环境 ,程序的编译.运行都需要jdk.一个java开发平台,jdk少不了,而编辑器 可以多种多样,除了 eclipse中的JDT,还有独立的jcreate ,或者用记事本以其他加 ...

  8. pom.xml错误:org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter)的解决方法

    pom.xml文件在添加了新的依赖后,一直报:org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter)的错误,Maven ...

  9. 转:NSString / NSData / char* 类型之间的转换

    1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...

  10. Ubuntu 14.04安装和3556sdk环境配置

    1.配置为固定ip: vi /etc/network/interfaces 最后添加 iface eth0 inet staticaddress 192.168.1.100netmask 255.25 ...