public static void main ( String [] args ) {// 创建SAXReader对象SAXReader reader = new SAXReader ();// 解析XML获取Document对象try {Document doc = reader . read ( "/bin/LocalList.xml" );} catch ( DocumentException e ) {e . printStackTrace ();}}
private static String getElementText ( Document doc ) {// 获取根节点Element root = doc . getRootElement ();// 获取指定节点集合List < Element > elements = root . elements ( "City" );// 获取指定节点Element e = elements . get ( 7 );// 获取指定节点的文本内容String text = e . getText ();return text ;}
private static void getAllElementText(Document doc) {
// 获取根节点
Element root = doc.getRootElement();
// 递归遍历所有节点
recursion(root);
}
// 使用深度优先搜索递归遍历所有节点
private static void recursion(Element node) {
// 如果非元素节点,则直接返回
if (node.getNodeType() != Element.ELEMENT_NODE) {
return;
}
// 如果该节点无子元素节点,则输出元素文本
if (node.elements().isEmpty()) {
System.out.println(node.getText());
} else {
// 如果该节点有子元素,则递归遍历
List<Element> elements = node.elements();
for (Element element : elements) {
// 递归调用
recursion(element);
}
}
}
private static void getCityElementText(Document doc) {
// 获取根元素节点
Element root = doc.getRootElement();
// 使用元素迭代器进行迭代
for (Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
Element e = iterator.next();
// 如果该节点无子元素节点,则输出元素文本内容
if (e.elements().isEmpty()) {
System.out.println(e.getText());
}
}
}
private static void saveXML(Document doc) {
try {
// 创建XML文件的字节输出流
OutputStream out = new FileOutputStream("src/LocalList.xml");
// 获取数据格式的对象,createCompactFormat紧凑格式,createPrettyPrint缩进格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 创建XMLWriter对象
XMLWriter writer = new XMLWriter(out, format);
// 将DOM树写入XML文件
writer.write(doc);
// 关闭资源
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void update(Document doc) {
// 获取要修改节点
Element root = doc.getRootElement();
Element element = (Element) root.elements().get(3);
// 修改文本内容
element.setText("天上人间");
// 保存文件
saveXML(doc);
}
private static void addChild(Document doc) {
// 获取要添加的父元素节点
Element root = doc.getRootElement();
Element city = (Element) root.elements().get(3);
// 创建要添加的子元素节点
Element street = DocumentHelper.createElement("street");
// Element streetE1 = new DefaultElement("street");
// Element streetE2 = new BaseElement("street");
// 设置节点的文本内容
street.setText("南天门大街");
// 将子节点添加到父节点中
city.add(street);
// 保存文件
saveXML(doc);
}
public static void addSibling(Document doc) {
// 获取目标元素节点
Element root = doc.getRootElement();
List<Element> elist = root.elements("City");
// 创建要添加的元素节点
Element city = new DefaultElement("City");//
// 设置新节点的文本
city.setText("哈哈区");
// 在指定位置加入元素 city
elist.add(4, city);
// 保存文件
saveXML(doc);
}
public static void removeElement(Document doc) {
// 获取要删除节点
Element root = doc.getRootElement();
Element city = (Element) root.elements("City").get(3);
Element street = (Element) city.elements("street").get(0);
// 用父节点删除子节点
city.remove(street);
// 保存文件
saveXML(doc);
}
public static void addAttribute(Document doc) {
// 获取要添加属性的节点
Element root = doc.getRootElement();
Element city = (Element) root.elements("City").get(3);
// 为节点添加属性
city.addAttribute("type", "food");
// 保存文件
saveXML(doc);
}
private static void getNode(Document doc) {
Node node = doc.selectSingleNode("/State/City/street");
System.out.println(node.getText());
}
private static void getNodes(Document doc) {
List<Node> nodes = doc.selectNodes("/State/City");
System.out.println(nodes.size());
}
private static void getAttribute(Document doc) {
// 获取拥有Name属性的节点
Node node = doc.selectSingleNode("//*[@Name]");
// 获取该节点的Name属性值
String name = node.valueOf("@Name");
System.out.println(name);
}
public class Dom4jUtils {
/**
* 获取XML数据的Document对象
*
* @return
*/
public static Document getDocument(String path) {
if (path == null) {
return null;
}
// 创建XML解析器
Document doc = null;
SAXReader reader = new SAXReader();
try {
// 解析XML文件
doc = reader.read(path);
} catch (DocumentException e) {
// 异常处理
System.out.println("读取XML失败!");
e.printStackTrace();
}
return doc;
}
/**
* 将Document对象保存到XML文件中
*
* @param doc 要保存的Document对象
* @return
*/
public static boolean saveXml(Document doc, String path) {
if (path == null || doc == null) {
return false;
}
// 创建保存格式
OutputFormat of = OutputFormat.createPrettyPrint();
// 创建XML写入对象
XMLWriter writer = null;
try {
// 将Document对象写入到XML文件中
OutputStream os = new FileOutputStream(new File(path));
writer = new XMLWriter(os, of);
writer.write(doc);
} catch (IOException e) {
// 异常处理
System.out.println("文件写入错误!");
e.printStackTrace();
return false;
} finally {
// 资源释放
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
System.out.println("资源关闭错误!");
e.printStackTrace();
return false;
}
}
}
return true;
}
}
xml version="1.0" encoding="UTF-8"?>
com.xml.dao.impl.StudentDaoByDom4j
src/com/xml/db/student.xml
xml version="1.0" encoding="UTF-8"?>
studentid="1255" classid="55">
帅哥
男
90
package com.xml.dao;
import com.xml.bean.Student;
public interface StudentDao {
/**
* 添加学生信息
* @param s 要添加的学生对象
* @return
*/
public boolean add(Student s);
/**
* 删除学生的信息
* @param sid 要删除的学生id
* @return
*/
public boolean delete(int sid);
/**
* 查询学生成绩
* @param sid 要查询的学生id
* @return
*/
public float getScore(int sid);
}
package com.xml.dao;
import org.dom4j.Document;
import com.xml.util.Dom4jUtils;
public enum StudentDaoFactory {
dao;
public StudentDao getInstance() {
StudentDao sdao = null;
// 获取配置信息XML文档的Document对象
Document doc = Dom4jUtils.getDocument("bin/com/xml/config/config.xml");
// 获取StudentDao的实现类名
String className = doc.selectSingleNode("/dao/student/class").getText();
// 创建StudentDao实现类
try {
sdao = (StudentDao) Class.forName(className).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
System.out.println("配置信息错误!找不到该类。");
e.printStackTrace();
}
return sdao;
}
}
package com.xml.dao.impl;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import com.xml.bean.Student;
import com.xml.dao.StudentDao;
import com.xml.util.Dom4jUtils;
public class StudentDaoByDom4j implements StudentDao {
private Document doc = null;
private String path = null;
public StudentDaoByDom4j() {
// 获取配置信息XML文档的Document对象
Document config = Dom4jUtils.getDocument("bin/com/xml/config/config.xml");
// 获取学生信息存储路径
this.path = config.selectSingleNode("/dao/student/db").getText();
// 获取学生信息XML文档的Document对象
this.doc = Dom4jUtils.getDocument(this.path);
}
@Override
public boolean add(Student s) {
// 性别预处理
String[] mask = {"男", "女", "人妖"};
// 在根节点下创建学生元素并设置属性
Element e = doc.getRootElement().addElement("student")
.addAttribute("studentid", String.valueOf(s.getId()))
.addAttribute("classid", String.valueOf(s.getClassId()));
// 为学生元素添加子元素
e.addElement("name").setText(s.getName());
e.addElement("gender").setText(mask[s.getGender()]);
e.addElement("score").setText(String.valueOf(s.getScore()));
// 将Document保存到XML文件中
Dom4jUtils.saveXml(doc, this.path);
return true;
}
@Override
public boolean delete(int sid) {
// 获取要删除的节点
Node node = doc.selectSingleNode("/students/student[@studentid='" + String.valueOf(sid) + "']");
// 使用父节点删除该节点
node.getParent().remove(node);
// 将Document保存到XML文件中
Dom4jUtils.saveXml(doc, this.path);
return true;
}
@Override
public float getScore(int sid) {
// 获取要查询成绩的学生成绩
String score = doc.selectSingleNode("/students/student[@studentid='"
+ String.valueOf(sid) + "']/score").getText();
// 返回成绩
return Float.parseFloat(score);
}
}
package com.xml.test;
import org.junit.Test;
import com.xml.bean.Student;
import com.xml.dao.StudentDao;
import com.xml.dao.StudentDaoFactory;
public class StudentDaoTest {
private StudentDao sdao = null;
{
sdao = StudentDaoFactory.dao.getInstance();
}
@Test
public void testAdd() {
Student s = new Student(1248, "苏苏", 55, 2, 80);
sdao.add(s);
}
@Test
public void testDelete() {
sdao.delete(1248);
}
@Test
public void testGetScore() {
float score = sdao.getScore(1255);
System.out.println(score);
}
}