一、Xml简介
Xml是一种可以用来标记数据、定义数据类型且允许用户对自己的标记语言进行定义的源语言。
Xml的主要功能是存储、数据传输,那么如何通过xml文件进行数据读写,是本文关注的重点。
Xml的读写方式分为两种,一种是面向事件的SAX方式,另一种是面向模型的DOM方式。我们常常用的dom4j读取就是SAX读取方式的体现。
二、Xml读写的两种方式实现原理
1、SAX,即用即解析,按照从左往右从上往下的顺序。
什么时候用到就什么时候解析,而且用过之后不会留存,之后如果还想再用的话就要重新再解析了,类似于懒加载。它是要通过事件触发才能获取解析要求的,所以是面向事件的。
它的好处是内存占用相对较小,适合大型Xml文件使用,但速度相对较慢。
2、DOM,一次性的将Xml文档加入内存,在内存中形成一颗DOM树,然后通过操作树的节点进行读取。
由于一次性加入内存,所以这种方式更适合小型Xml文件使用,相应地,它的读取速度会更快。
三、实例分析
1、SAX方式读取Xml文件信息(基于dom4j)。
首先,先建立一个xml文件,我的这个是用来连接Oracle数据库的。
<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@192.168.11.111:1521:orcl</url>
<user-name>myusername</user-name>
<password>mypassword</password>
</db-info>
</config>
之后,我们建立一个jdbcConfig类,用于传递连接数据库的参数。
<pre name="code" class="java">package com.bjpowernode.drp.util;
/**
* jdbc配置信息
* @author Y
*
*/
public class JdbcConfig {
private String driverName;
private String url;
private String userName;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String password;
}
下面就是比较重点的xml数据读写工作了:这里我们通过dom4j。
private XmlConfigReader(){
SAXReader reader = new SAXReader();//创建一个DOM4J树,以 SAX方式读取;read可以传文件或InputStream
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try {
Document doc = reader.read(in);//读取xml文件,以dom树形式返回
//取得jdbc的相关信息
Element driverNameElt = (Element) doc.selectObject("/config/db-info/driver-name");//找到相关路径下的节点
Element urlElt = (Element) doc.selectObject("/config/db-info/url");
Element userNameElt = (Element) doc.selectObject("/config/db-info/user-name");
Element passwordElt = (Element) doc.selectObject("/config/db-info/password");
System.out.println(driverNameElt.getStringValue());//打印节点内信息。下面还有三个,就不一一写了
……
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
当然,我们还可以通过添加一个Dbutil工具类来更好的显示和管理jdbcConfig,由于并非本文重点,所以就不写了,大家可以网上查查。
2、DOM方式写入Xml(基于dom4j)。
import java.io.FileWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class addAnimal{
public static void main(String args[])throws Exception{
//创建一个文档对象
Document document = DocumentHelper.createDocument();
//构造一棵dom树
Element animal = document.addElement("动物");//根节点,动物标签
Element fish = animal.addElement("鱼类");//一级子节点,鱼类标签
fish.addAttribute("id","shark");//设置鱼类的一个子项id为shark
fish.setText("鲨鱼");//文本内容
Element fish1 = animal.addElement("鱼类");
fish1.addAttribute("id","carp");//设置鱼类的一个子项id为carp
fish1.setText("鲤鱼");
//设置字符编码方式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GB18030");
//把上述内容写入DOM树
XMLWriter xmlWriter = new XMLWriter(new FileWriter
("student.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
}
}
小结:对于读取xml的方法不只是基于dom4j的,其他的如普通读取和log4j读取都可以。掌握了两用应用方法和应用环境,对Xml实际的读写操作还是比较简单的。好了,对于XML的读写就先介绍到这里。