文章目录
一、使用dom4j解析XML介绍
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来后独立开发的。与JDOM不同的是,dom4j使用接口和抽象父类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API
。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也使用了Dom4j。
使用Dom4j开发,需引入Dom4j相应的jar文件。
优点:性能优异,功能强大,极易使用。
缺点:暂不了解,但越来越多的Java软件都在使用dom4j来读写XML。
二、dom4j解析XML的步骤
使用Sax解析XML的准备工作:
(1)直接创建SaxReader解析器对象
SAXReader reader = new SAXReader();
(2)获得Document文档对象
Document doc = reader.read(new File("src/com/empList.xml"));
三、dom4j解析XML实例
(1)给出需要解析的XML的文件
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>张三</name>
<age>34</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="2">
<name>王五</name>
<age>18</age>
<gender>女</gender>
<salary>6500</salary>
</emp>
<emp id="3">
<name>赵六</name>
<age>28</age>
<gender>男</gender>
<salary>4400</salary>
</emp>
<emp id="4">
<name>钱七</name>
<age>19</age>
<gender>男</gender>
<salary>12000</salary>
</emp>
</list>
(2)将XML文件封装成Java对象
package com.entity;
/**
* 类说明:
* 将emlListXML封装成Emp对象
* @author qianliangguo
*/
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private double salary;
public Emp() {
super();
// Todo Auto-generated constructor stub
}
public Emp(int id, String name, int age, String gender, double salary) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", age=" + age
+ ", gender=" + gender + ", salary=" + salary + "]";
}
}
(3)使用dom4j对XML进行解析
查询XML文件中的节点
package com.test;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.entity.Emp;
/**
* 类说明:
* 使用dom4j解析XML
* 使用dom4j解析XML的准备工作:
* 1.引入dom4j的三个jar包后,添加环境依赖.
* 2.将XML封装成一个Java对象
* 使用dom4j的步骤:
* 1.直接创建SaxReader解析器对象
* 2.获得Document文档对象
*
* @author qianliangguo
*/
public class Dom4jXML {
public static void main(String[] args) throws Exception {
//1.创建SaxReader解析器
SAXReader reader = new SAXReader();
//2.获得Document文档对象
Document doc = reader.read(new File("src/com/empList.xml"));
/**
* 打印XML封装成对象后的所有属性和值
*/
//获得根节点
Element root = doc.getRootElement();
//获得根节点下所有子节点
List<Element> elements = root.elements();
//创建List<Emp>保存员工信息
List<Emp> list = new ArrayList<Emp>();
//遍历子节点
for (Element element : elements) {
//先获得节点的属性再获得节点的值
// String id = element.attribute("id").getValue();
//直接根据节点属性获得节点值
String id = element.attributeValue("id");
//先获得节点再获得节点值
String name = element.element("name").getText();
//直接根据节点名获得节点值
String age = element.elementText("age");
String gender = element.elementText("gender");
String salary = element.elementText("salary");
Emp emp = new Emp(Integer.parseInt(id),name,Integer.parseInt(age),gender,Double.parseDouble(salary));
list.add(emp);
}
System.out.println(list);
}
}
解析效果:
向XML文件中添加节点
创建文档,添加元素和节点(这里规定元素的下一级是节点)
为元素添加属性:addAttribute(,)
添加子节点:addElement()
添加文本值:addText()
添加子节点,并设置文本addElement().addText()
/**
* 测试说明:
* 向XML文件添加节点
*
* 用到的一些API:
* 为元素添加属性:addAttribute(,)
* 添加子节点:addElement()
* 添加文本值:addText()
* 添加子节点,并设置文本addElement().addText()
* (这里规定元素的下一级是节点)
*/
@Test
public void testAdd() throws Exception{
//list存放Emp对象
List<Emp> emps = new ArrayList<Emp>();
emps.add(new Emp(1,"Hudie",21,"男",9000.0));
emps.add(new Emp(2,"Huahua",20,"女",8000.0));
emps.add(new Emp(2,"冬雨",18,"女",10000.0));
//创建文档对象
Document doc = DocumentHelper.createDocument();
//创建根节点
Element root = doc.addElement("list");
for (Emp emp : emps) {
//向根节点中添加名为emp的子元素
Element ele = root.addElement("emp");
//为emp元素添加id属性
ele.addAttribute("id", String.valueOf(emp.getId()));
//添加子节点,并设置节点中的文本值
ele.addElement("name").addText(emp.getName());
ele.addElement("age").addText(String.valueOf(emp.getAge()));
ele.addElement("gender").addText(emp.getGender());
ele.addElement("salary").addText(String.valueOf(emp.getSalary()));
}
//创建输出流,指明输出路径
FileOutputStream fos = new FileOutputStream("src/com/EmpList2.xml");
XMLWriter writer = new XMLWriter();
writer.setoutputStream(fos);
//将文档写出到指定路径中
writer.write(doc);
writer.close();
}
修改XML文件的节点
/**
* 测试说明:
* 删除XML文件中的元素
* @throws Exception
*/
@Test
public void testRemo() throws Exception{
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read("src/com/EmpList2.xml");
//获得根节点
Element root = doc.getRootElement();
//获取下标为0的节点
Element element = (Element)root.elements().get(0);
System.out.println(element.attribute("id"));
//删除该节点的id属性
element.remove(element.attribute("id"));
System.out.println(element.attribute("id"));
//获得名为name节点
Element name = element.element("name");
System.out.println(name.getText());
//删除该节点
element.remove(name);
System.out.println(element.elementText("name"));
}
解析效果:
删除XML文档中的属性和节点
/**
* 测试说明:
* 修改XML文档中的节点和属性
* @throws Exception
*/
@Test
public void testUpdate() throws Exception{
//1.直接创建SaxReader解析器对象
SAXReader sax = new SAXReader();
//2.获得Document对象
Document doc = sax.read("src/com/EmpList2.xml");
//获取根节点
Element root = doc.getRootElement();
//获得第一个节点
Element element = (Element)root.elements().get(0);
Attribute id = element.attribute("id");
System.out.println("第一个节点的id是:"+id.getValue());
//修改属性值
id.setValue("19");
System.out.println("第一个节点修改后的id是:"+id.getValue());
//获得name节点
Element name = element.element("name");
System.out.println("name的值是"+name.getText());
//修改name的文本值
name.setText("Huahudiediedie");
System.out.println("修改后name的值是"+name.getText());
}
解析效果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。