使用dom4j解析xml

在xml中如果在使用特殊字符想表示字符串的话,要么用转义字符要么用CDATA,它里面表示的都是纯文本

解析xml有两种方式  sax,dom两种方式 这两种是不需要导包的,使用java开发就行,但是代码比较底层编码麻烦,所以再它们的基础上有了二次开发JDOM和DOM4J

使用dom4j解析xml,dom4j属于dom方式解析xml

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.0</version>
</dependency>

把一个xml解析成实体对象存入集合 

package day12;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

//使用DOM解析xml文档
public class ParseXmlDemo {
	public static void main(String[] args) {
		/*
		 * 解析emplist.xml文档,将所有的员工
		 * 信息读取出来并转换为若干Emp实例,
		 * 存入一个List集合中
		 * 
		 * 解析XML的流程:
		 * 1:创建SAXReader
		 * 2:使用SAXReader读取XML文档并返回
		 * 	Document对象
		 * 这一步就是DOM解析耗时耗资源的体现
		 * 因为DOM会将XML文档全部读取并以
		 * 一个Document对象形式存于内存.
		 * Document对象用于描述解析的XML文档
		 * 内容.
		 * 3:根据Document对象获取根元素
		 * 4:按照xml的结构从根元素中开始逐级
		 * 获取子元素以达到遍历xml的目的
		 */
		
		try {
			//1
			SAXReader reader = new SAXReader();
			//2
			Document doc = reader.read(new FileInputStream("emplist.xml"));
			/*
			 * 3获取根元素
			 * Element的每一个实例用于表示xml文档
			 * 中的一个元素(一对标签)
			 * 这里获取的相当于是emplist.xml文档
			 * 中的<list>标签
			 */
			Element root = doc.getRootElement();
			/*
			 * Element提供了获取元素的相关方法:
			 * 
			 * String getName()
			 * 获取当前标签的名字
			 * 
			 * List elements()
			 * 获取当前标签下的所有子标签
			 * 
			 * List elements(String name)
			 * 获取当前标签下所有同名子标签
			 * 
			 * Element element(String name)
			 * 获取指定名字的子标签
			 * 
			 * Attribute attribute(String name)
			 * 获取指定名字的属性
			 * 
			 * String getText()
			 * 获取当前标签中的文本(前标签和后标签
			 * 中间的文本信息,前提是确实为文本而不是
			 * 子标签)
			 */
			List<Emp> empList = new ArrayList<Emp>();
			
			/*
			 * 获取根标签<list>下面的所有子标签<emp>
			 */
			List<Element> elements = root.elements();
			/*
			 * 遍历所有<emp>标签并解析出该员工
			 * 相关信息并以一个Emp实例保存然后
			 * 将其存入empList集合
			 */
			for(Element empEle:elements) {
				//获取名字
				Element nameEle = empEle.element("name");
				String name =  nameEle.getText();
				int age = Integer.parseInt(
						empEle.elementText("age"));
				String gender = empEle.elementText("gender");
				int salary = Integer.parseInt(
						empEle.elementText("salary"));
				/*
				 * 获取emp标签中的id属性
				 * Attribute的每一个实例用于表示一个
				 * 属性信息,常用方法:
				 * String getName()获取当前属性名
				 * String getValue()获取当前属性值
				 */
				
				Attribute attr = empEle.attribute("id");
				int id = Integer.parseInt(
						attr.getValue());
				Emp emp = new Emp(id, name, age, gender, salary);
				empList.add(emp);
			}
			System.out.println("解析完毕!");
			System.out.println("共"+empList.size()+"个员工");
			for(Emp emp:empList) {
				System.out.println(emp);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}
}
<?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>21</age>
		<gender>女</gender>
		<salary>4000</salary>
	</emp>
	<emp id="3">
		<name>王五</name>
		<age>46</age>
		<gender>女</gender>
		<salary>6500</salary>
	</emp>
	<emp id="4">
		<name>赵六</name>
		<age>28</age>
		<gender>男</gender>
		<salary>4400</salary>
	</emp>
	<emp id="5">
		<name>钱七</name>
		<age>53</age>
		<gender>男</gender>
		<salary>12000</salary>
	</emp>
</list>
package day12;
/**
 * 该类用于表示xml文档中的一个员工信息
 * @author Administrator
 *
 */
public class Emp {
	private int id;
	private String name;
	private int age;
	private String gender;
	private int salary;
	public Emp() {
		
	}
	
	public Emp(int id, String name, int age, String gender, int 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 int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", salary=" + salary + "]";
	}
	
}

使用java代码生成一个xml文件

package day12;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
 * 使用DOM生成xml文档
 * @author Administrator
 *
 */
public class WriteXmlDemo {
	public static void main(String[] args) {
		List<Emp> empList = new ArrayList<Emp>();
		empList.add(new Emp(1,"张三",22,"男",3000));
		empList.add(new Emp(2,"李四",23,"女",4000));
		empList.add(new Emp(3,"王五",24,"男",5000));
		empList.add(new Emp(4,"赵六",25,"女",6000));
		empList.add(new Emp(5,"钱七",26,"男",7000));
		
		/*
		 * 将empList集合中的员工信息保存到
		 * myemp.xml文档中.
		 * 
		 * 写出XML文档的大致步骤:
		 * 1:创建一个Document对象表示一个
		 * 空白的xml文档
		 * 2:向Document对象中添加根元素
		 * 3:按照应当生成的xml文档的格式逐级
		 * 向根元素中添加子元素以形成xml文档格式
		 * 4:创建XmlWriter
		 * 5:通过XmlWriter将Document写出
		 */
		XMLWriter w =null;
		try {
			//1
			Document document = DocumentHelper.createDocument();
			/*
			 * 2添加根标签<list>
			 * Document提供了添加根元素的方法
			 * 
			 * Element addElement(String name)
			 * 该方法可以向当前文档中添加给定名字
			 * 的根元素,并将添加进去的该元素以一个
			 * Element实例返回,以便对该元素继续
			 * 操作.
			 * 需要注意,该方法只能调用一次,因为一个
			 * 文档中只能有一个根元素.
			 */
			Element root = document.addElement("list");
			/*
			 * 将empList集合中的每个员工信息以一个
			 * <emp>标签的形式保存到<list>标签中
			 */
			for(Emp emp: empList) {
				/*
				 * Element提供了相关方法:
				 * 
				 * Element addElement(String name)
				 * 向当前文档中添加给定名字的子标签
				 * 并将其返回,以便继续操作.
				 * 
				 * Element addText(String text)
				 * 向当前标签中添加文本信息,返回值
				 * 为当前标签
				 * 
				 * Element addAttribute(String name,String value)
				 * 向当前标签中添加属性,返回值为
				 * 当前标签
				 */
				//向根标签<list>中添加子标签<emp>
				Element empEle = root.addElement("emp");
				
				//向<emp>标签中添加<name>标签
				Element nameEle = empEle.addElement("name");
				nameEle.addText(emp.getName());
				empEle.addElement("age").addText(String.valueOf(emp.getAge()));
				empEle.addElement("gender").addText(emp.getGender());
				empEle.addElement("salary").addText(String.valueOf(emp.getSalary()));
				empEle.addAttribute("id",String.valueOf(emp.getId()));
			}
			FileOutputStream fos = new FileOutputStream("myemp.xml");
			w = new XMLWriter(fos,OutputFormat.createPrettyPrint());
			w.write(document);
			System.out.println("写出完毕!");
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			if(w!=null) {
				try {
					w.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
<?xml version="1.0" encoding="UTF-8"?>

<list>
  <emp id="1">
    <name>张三</name>
    <age>22</age>
    <gender>男</gender>
    <salary>3000</salary>
  </emp>
  <emp id="2">
    <name>李四</name>
    <age>23</age>
    <gender>女</gender>
    <salary>4000</salary>
  </emp>
  <emp id="3">
    <name>王五</name>
    <age>24</age>
    <gender>男</gender>
    <salary>5000</salary>
  </emp>
  <emp id="4">
    <name>赵六</name>
    <age>25</age>
    <gender>女</gender>
    <salary>6000</salary>
  </emp>
  <emp id="5">
    <name>钱七</name>
    <age>26</age>
    <gender>男</gender>
    <salary>7000</salary>
  </emp>
</list>

使用xPath来读取xml文件https://blog.csdn.net/kxj19980524/article/details/86598746

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值