Dom4j操作XML实战,解析和插入XML实例
本例子是用XML来代替数据库的,XML的每个节点代替数据库一行数据。
直说过程:
XML文件结构:定义了一个名为:User.xml的文件:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="0001" name="小米" password="xiaomi" birthday="1980-09-03" nickname="小强"/>
</users>
定义一个XML操作的工具类:
获取XML文件路径的方法:
private static String fillpath=XmlUtill.class.getClassLoader().getResource("User.xml").getPath();
但是,由于fillpath的路径名称中包含中文,为了处理这个,需要做中文处理,加上:
private static String fillpath;
static {
fillpath=XmlUtill.class.getClassLoader().getResource("User.xml").getPath();
try {
fillpath = URLDecoder.decode(fillpath,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(fillpath);
}
工具类完整代码:
主要包含:获取Document和写入XML两个操作:
package com.Utill;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XmlUtill {
private static String fillpath;
static {
fillpath=XmlUtill.class.getClassLoader().getResource("User.xml").getPath();
try {
fillpath = URLDecoder.decode(fillpath,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//System.out.println(fillpath);
}
//获取Document
public static Document getDocument() throws Exception
{
SAXReader reader=new SAXReader();
Document document=reader.read(new File(fillpath));
return document;
}
//将Document写入XML
public static void writToXml(Document document) throws IOException
{
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileOutputStream(fillpath),format);
writer.write(document);
format=OutputFormat.createPrettyPrint();
writer=new XMLWriter(System.out,format);
writer.write(document);
}
}
定义一个POJO:User
package com.domain;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date birthday;
private String nickname;
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + ", birthday=" + birthday + ", nickname="
+ nickname + "]";
}
}
定义一个UserImpl类,用来对xml进行查询,新增操作,模拟数据库的查询和新增操作
package com.dao;
import java.text.SimpleDateFormat;
import org.dom4j.Document;
import org.dom4j.Element;
import com.Utill.XmlUtill;
import com.domain.User;
public class UserDaoImpl {
public void add(User user)
{
try {
Document document=XmlUtill.getDocument();
Element root=document.getRootElement();
Element user_tag=root.addElement("user");
user_tag.addAttribute("id", "0002");
user_tag.addAttribute("name", "华为");
user_tag.addAttribute("password","华为");
user_tag.addAttribute("birthday", user.getBirthday()==null?" ":user.getBirthday().toLocaleString());
user_tag.addAttribute("nickname", "大强");
XmlUtill.writToXml(document);
} catch (Exception e) {
e.printStackTrace();
}
}
public User find(String name,String password)
{
try {
Document document;
document = XmlUtill.getDocument();
Element e=(Element) document.selectSingleNode("//user[@name='"+name+"' and @password='"+password+"']");
if(e==null)
return null;
User user=new User();
String date=e.attributeValue("birthday");
if(date==null||date.equals(""))
user.setBirthday(null);
else
{
//日期转换类
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM--dd");
user.setBirthday(df.parse(date));
}
user.setId(e.attributeValue("id"));
user.setName(e.attributeValue("name"));
user.setPassword(e.attributeValue("password"));
user.setNickname(e.attributeValue("nickname"));
System.out.println(user.toString());
return user;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
测试类,测试查询和新增功能:
package com.Test;
import java.util.Date;
import org.junit.jupiter.api.Test;
import com.dao.UserDaoImpl;
import com.domain.User;
class UserTest {
@Test
void testAdd() {
User user=new User();
user.setId("0002");
user.setName("华为");
user.setPassword("huawei");
user.setBirthday(new Date());
user.setNickname("大强");
UserDaoImpl dao=new UserDaoImpl();
dao.add(user);
}
public void TestFind()
{
UserDaoImpl dao=new UserDaoImpl();
dao.find("小米", "xiaomi");
}
}