前言:Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM开发的。与JDOM不同的是,dom4j使用接口和抽象的人分离出来而后独立基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
使用:Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件。
l 具体应用:
a. DOM4j中,获得Document对象的方式有三种:
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument();
//创建根节点
Element root = document.addElement("members");
b. Tip:节点对象
Element root = document.getRootElement();
c. 取得某个节点的子节点.
Element element=root.element(“书名");
d. 取得节点的文字
String element=node.getText();
e. 取得某节点下所有名为“member”的子节点,并进行遍历.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
f. 对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
例如:
@Test
public void Test1() throws Exception {
// 创建读取器
SAXReader sr = new SAXReader();
Document doc = sr.read(new File("src\\student.xml"));
Element el = doc.getRootElement();
disPlayElement(el);
}
private void disPlayElement(Element el) {
disPlayAttribute(el);
for (Iterator<Element> it = el.elementIterator(); it.hasNext();) {
Element elem = it.next();
disPlayAttribute(elem);
if (elem.isTextOnly()) {
System.out.println(elem.getTextTrim());
} else {
disPlayElement(elem);
}
}
}
private void disPlayAttribute(Element el) {
for (Iterator<Attribute> it = el.attributeIterator(); it.hasNext();) {
Attribute att = it.next();
System.out.println(att.getValue());
}
}
g. 在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");
h. 在某节点下添加子节点.
element.setText("29");
i. 删除某节点.
//childElm是待删除的节点,parentElm是其父节点
parentElm.remove(childElm);
j. 添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
例如:
修改
@Test
public void Test3() throws Exception {
SAXReader sr = new SAXReader();
Document doc = sr.read("src\\student.xml");
sr.setStripWhitespaceText(true);
Element students = doc.getRootElement();
Element studen = students.addElement("student");
Element name = studen.addElement("name");
name.setText("测试");
List<Element> list = students.elements();
Element students_2 = list.get(0);
Element name_2 = (Element) students_2.elements().get(0);
name_2.setText("测试2");
OutputFormat format = new OutputFormat(" ", true, "utf-8");
XMLWriter xw = new XMLWriter(new FileWriter("src\\student2.xml"),
format);
xw.write(doc);
xw.close();
}
删除
// 删除xml信息
@Test
public void Test4() throws Exception {
SAXReader sr=new SAXReader();
Document doc=sr.read(new File("src\\student.xml"));
Element studentRoot =doc.getRootElement();
Element student=studentRoot.element("student");
Element name=student.element("name");
//删除时用父节点删除子节点
student.remove(name);
OutputFormat format = new OutputFormat(" ", true, "utf-8");
XMLWriter xw = new XMLWriter(new FileWriter("src\\student4.xml"),
format);
xw.write(doc);
xw.close();
}
l Tip:将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML编码
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();
例如:
@Test
public void Test2() throws Exception {
Document doc = DocumentHelper.createDocument();
Element students = doc.addElement("Students");
Element student = students.addElement("student");
Element name = student.addElement("name");
name.addText("朱磊");
Element age = student.addElement("age");
age.addText("22");
Element sex = student.addElement("sex");
sex.addText("男");
Element email = student.addElement("email");
email.addText("
[email protected]");
Element address = student.addElement("addRess");
address.addText("保定软件");
OutputFormat format = new OutputFormat(" ", true, "utf-8");
XMLWriter xw = new XMLWriter(new FileWriter("src\\student1.xml"),
format);
xw.write(doc);
xw.close();
}
l Dom4j在指定位置插入节点
1.得到插入位置的节点列表(list)
2.调用list.add(index,elemnent),由index决定element的插入位置。
Element元素可以通过DocumentHelper对象得到。示例代码:
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");
List list = root.element("书").elements();
list.add(1, aaa);
//更新document
例如:
@Test
public void Test3() throws Exception {
SAXReader sr = new SAXReader();
Document doc = sr.read("src\\student.xml");
sr.setStripWhitespaceText(true);
Element students = doc.getRootElement();
Element studen = students.addElement("student");
Element name = studen.addElement("name");
name.setText("测试");
List<Element> list = students.elements();
Element students_2 = list.get(0);
Element name_2 = (Element) students_2.elements().get(0);
name_2.setText("测试2");
OutputFormat format = new OutputFormat(" ", true, "utf-8");
XMLWriter xw = new XMLWriter(new FileWriter("src\\student2.xml"),
format);
xw.write(doc);
xw.close();
}