JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式。因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看。
JAVA作为一种高级语言,具备多种方法解析XML文件,诸如DOM, SAX,另外还有DOM4J等框架可供使用,本篇使用一个具体的例子,简单介绍通过DOM来解析一个XML文件的过程。
DOM解析基于文档格式,我们在前台编程中也会遇见这种说法,他就是“文档对象模型”,我们把XML看成是一颗倒立的树结构,基于此来解析文档。
上例子,提供的XML文件,包含了两本书的信息,我们需要解析出来,并转换为对应的JAVA实例对象!
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Book>
<name>偷影子的人</name>
<author>马克李维</author>
<year>2010</year>
</Book>
<Book>
<name>人生不设限</name>
<author>尼克胡哲</author>
<year>2010</year>
</Book>
</Root>
我们可以看见,每本书包括三个属性,那么对应的解析代码为:
package com.minlz.xml;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author minliangzhi
* @date 2016年9月7日
*/
public class DomParser {
public static void main(String[] args) {
/**
* DOM 解析XML的一般步骤:工厂模式
* 1、构建一个构造器工厂
* 2、构建一个构造器
* 3、使用构造器解析XML文件
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
Document document = null;
try {
builder = factory.newDocumentBuilder();
document = builder.parse("resources/books.xml");
} catch (Exception e) {
e.printStackTrace();
}
List<Book> allBook = new ArrayList<Book>();
if (document != null) {
/** 获取XML文件信息的数据根节点 */
NodeList books = document.getElementsByTagName("Book");
int bookCount = books.getLength();
for (int i = 0; i < bookCount; i++) {
/** 遍历每条数据记录 */
Map<String, Object> att = new HashMap<String, Object>();
NodeList properties = books.item(i).getChildNodes();
int proCount = properties.getLength();
for (int j = 0; j < proCount; j++) {
/** 遍历每条数据记录的所有属性 */
/** 注意,这里的proCount一共是7,因为它包括了节点与节点之间的空白部分,但实际我们处理的是ELEMENT_NODE */
Node node = properties.item(j);
if (node.getNodeType() == Node.ELEMENT_NODE) {
att.put(node.getNodeName(), node.getFirstChild().getNodeValue());
}
}
Book book = buildObject(Book.class, att);
allBook.add(book);
}
for(Book b : allBook) {
System.out.println(b.toString());
}
}
}
private static <T> T buildObject(Class<T> clazz, Map<String, Object> attributes) {
T t = null;
try {
/** 初始化一个实例 */
t = clazz.newInstance();
Field[] allFields = clazz.getDeclaredFields();
/** 遍历所有属性,如果发现已经提供了属性的值,则设置该值 */
for(Field f : allFields) {
if(attributes.containsKey(f.getName())) {
f.setAccessible(true);
f.set(t, attributes.get(f.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
class Book {
private String name;
private String author;
private String year;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
@Override
public String toString() {
return "Book [name=" + name + ", author=" + author + ", year=" + year
+ "]";
}
}
解析的结果:
Book [name=偷影子的人, author=马克李维, year=2010] Book [name=人生不设限, author=尼克胡哲, year=2010]
熟悉HTML或者JS的朋友可能会容易看出中间解析的那部分逻辑,具体的DOM结构还有很多种类和属性,在此不一一介绍,只要熟悉了这个过程和模式,以后多看文档多记忆就会慢慢熟悉,不必一次性背诵所有的规则,善用才是最重要的。
代码中,有一个方法叫做“buildObject”,这里使用了反射知识来根据提供的属性集合构建实例,不熟悉的可以看看反射相关知识。
最后:
如有错误,还请指正,不胜感激!
JAVA中使用DOM解析XML文件的更多相关文章
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- java中利用dom4j解析XML文件
官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回Li ...
- Qt中使用DOM解析XML文件或者字符串二(实例)
介绍 在Qt中提供了QtXml模块实现了对XML数据的处理,我们在Qt帮助中输入关键字QtXml Module,可以看到该模块的类表.在这里我们可以看到所有相关的类,它们主要是服务于两种操作XML文档 ...
- Java中实现SAX解析xml文件到MySQL数据库
大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...
- Qt中使用DOM解析XML文件或者字符串(实例)
因为需要读取配置文件,我的配置文件采用xml:因此编写了使用qt读取xml文件内容的代码,xml文件如下: <?xml version="1.0" encoding=&quo ...
- JAVA中使用Dom解析XML
在G盘下新建XML文档:person.xml,XML代码: <?xml version="1.0" encoding="utf-8"?> <s ...
- 转:在java中使用dom4j解析xml
JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...
- 使用DOM解析xml文件
使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Langu ...
- DOM解析XML文件例子
DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...
随机推荐
- toast组件小结
简介:toast是"吐司"的意思,它属于android杂项组件,是一个简单的消息提示框,类似于javascript中的alert. 作用 显示文本 显示图片 显示图文 3.常用方法 ...
- Web项目使用Oracle.DataAccess.dll 类库连接oracle数据库
首先我用的工具是oracle 32位免安装版+Oracle.DataAccess.dll 32位 文件版本4.121.1.0+vs2013 +win7 64位 Oracle.DataAccess.d ...
- 无线连接Android设备
有时设备处于低电,此时又需要进行设备与PC的数据传输,但是通过USB连接充电速度太慢.这时就可以通过无线进行传输数据,然后通过AC充电.一举两得. 前提: 1.在Android设备的开发者模式-打开U ...
- 【笔记】读取properties文件
package com.bshinfo.el.userInfo.util; import java.io.BufferedReader; import java.io.File; import jav ...
- kettle系列-我的开源kettle管理平台[kettle-manager]介绍
kettle管理工具 专门为kettle这款优秀的ETL工具开发的web端管理工具. 项目简介 kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操作管理,但问题 ...
- C# ADO.net 数据库连接池
前一阵开发一套系统,同组的同事提供了一个数据库连接组件,是他自己封装的,使用了自定义的连接池,用着很是不爽,而且经常会因为程序不严谨的原因,导致连接池里的连接被用完,也导致其他错误,因此我想自己研究一 ...
- python 新手遇到的问题
作为新手,我把之前遇到的问题贴出来 错误提示1: TypeError: unbound method a() must be called with A instance as first argum ...
- Codeforces #380 Subordinates(贪心 构造)
从前往后扫,找到一出现次数为0的数,从后面找一个出现不为0的数转化而来.设置两指针l, r来处理. #include<cstdio> #include<iostream> #i ...
- [UWP]创建自定义VisualState Trigger
这篇博客将介绍在UWP程序中如何创建和使用自定义VisualState Trigger. 上一篇博客中介绍了如何使用AdaptiveTrigger.目前UWP内置的StateTrigger只有Adap ...
- JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上
众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...