Javaweb学习笔记之XML(一):Dom4J读取XML文档

其中 contact.xml 文档放在 src 目录下:

 

<?xml version="1.0" encoding="utf-8"?>
<contactList>
	<contact id="001" name="eric">
		<name>张三</name>
		<age>20</age>
		<phone>134222223333</phone>
		<email>zhangsan@qq.com</email>
		<qq>432221111</qq>
	</contact>
	<contact id="002">
		<name>李四</name>
		<age>20</age>
		<phone>134222225555</phone>
		<email>lisi@qq.com</email>
		<qq>432222222</qq>
	</contact>
	<abc></abc>
</contactList>
package com.demo.a_dom4j;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.SAXReader;
import org.junit.Test;

/*
XML 解析方式根据原理不同分为:
	DOM 解析
	SAX 解析
	
XML 解析工具:
	DOM:
		1、JAXP 官方
		2、JDOM 非官方
		3、Dom4J 非官方,应用最广;三大框架默认读取 XML 的工具就是 DOM4J;
	SAX:
		SAX 解析工具:官方
		
	DOM 解析和 SAX 解析比较:
		DOM 解析:
			1、原理:XML 解析器一次性把整个 XML 文档加载进内存,然后在内存中构建一棵 Document 的对象树,
				通过 Document 对象,得到树上的节点对象,通过节点对象操作 XML 文档的内容。
				一次性加载 XML 文档,不适合大容量的文件读取,比较占用内存;
			2、DOM 解析可以任意进行增删改查;
			3、DOM 解析可以读取任意位置的数据,甚至往回读;
			4、DOM 解析是面向对象的编程方法(Node、Element、Attribute),开发编码比较简单;
		SAX 解析:
			1、原理:加载一点,读取一点,解析一点。适合大容量文件的读取。
			2、SAX 解析只能读取;
			3、SAX 解析只能从上往下,按顺序读取,不能往回读;
			4、SAX 解析是基于事件的读取方法,开发编码相对复杂。
	
	需要导入  dom4j-1.6.1.jar 包
	
	DOM4J 读取 XML 文档:
 */	

public class Demo1 {
	
	/*
	 * 读取 XML 子节点信息
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void test1() throws Exception{
		// 创建一个 XML 解析器对象
		SAXReader reader = new SAXReader();
		
		// 加载 XML 文档,返回一个 Document 对象
		Document doc = reader.read("./src/contact.xml");
		System.out.println(doc);
		
		// 得到当前节点下的所有子节点(直接子节点,不包括孙节点)的迭代器对象(Document 也可以看作一个节点)
		Iterator<Node> it = doc.nodeIterator();
		
		// 循环获取子节点;hasNext() 判断是否有下一个子节点;
		while(it.hasNext()){
			Node node = it.next(); 			// 取出下一个子节点
			String name = node.getName();	// 获取节点的名称
			System.out.println(name);
			
			// 继续取出下一层的子节点
			// 注意:节点(Node)包括 标签、属性、文本,其中只有标签才会有子节点,属性和文本没有子节点,
			// 所以需要先判断当前节点是否是标签节点
			if (node instanceof Element){ 
				Element element = (Element)node;
				Iterator<Node> it2 = element.nodeIterator();
				
				while(it2.hasNext()){
					// 此处取出的节点对象也有可能是 标签,或者 文本;(注意:换行也是文本对象)
					Node node2 = it2.next();
					if(node2 instanceof Element)
						System.out.println(node2.getName());
				}
			}
		}
	}
	
	/*
	 * 遍历 XML 文档的所有节点
	 */
	@Test
	public void test2() throws Exception{
		// 读取 XML 文档,返回 Document 对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read("./src/contact.xml");
		
		// 获取 XML 文档的根标签
		Element rootElement = doc.getRootElement();
		
		getChileNodes(rootElement);
	}
	
	/**
	 * 获取指定标签下的所有子节点
	 * @param element
	 */
	@SuppressWarnings("unchecked")
	private void getChileNodes(Element element){
		System.out.println(element.getName());
		
		// 获取标签下的所有子节点的迭代器对象
		Iterator<Node> it = element.nodeIterator();
		while(it.hasNext()){					// 判断是否有下一个子节点
			Node node = it.next();				// 取出下一个子节点对象,有可能是 标签、文本,或者属性

			if (node instanceof Element){		// 判断子节点是否是标签节点
				Element elem = (Element)node;	// 将子节点转换成标签对象
				getChileNodes(elem);			// 递归,继续循环获取下一级子节点
			}
		}
	}
	
	/*
	 * 获取标签
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void test3() throws Exception{
		// 读取 XML 文档,返回 Document 对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read("./src/contact.xml");
		
		// 得到根标签
		Element rootElement = doc.getRootElement();
		System.out.println(rootElement.getName());
		System.out.println("---------------------");
		
		// 得到当前节点下的第一个名称为 contact 的子标签
		Element contactElement = rootElement.element("contact");
		System.out.println(contactElement.getName());
		System.out.println("---------------------");
		
		// 得到当前节点下指定名称为 contact 的所有子标签(有两个 contact 子标签)
		Iterator<Element> it = rootElement.elementIterator("contact");
		while (it.hasNext()){
			Element elem = it.next();
			System.out.println(elem.getName());
		}
		System.out.println("---------------------");
		
		// 获取当前标签下的所有子标签
		List<Element> elements = rootElement.elements();
		for (Element elem : elements){
			System.out.println(elem.getName());
		}
		System.out.println("---------------------");
		
		// 如果想获取更深层次的标签,只能一层一层获取
		Element nameElem = doc.getRootElement().element("contact").element("name"); // 获取 name 标签
		System.out.println(nameElem.getName());
	}
	
	/*
	 * 获取属性
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void test4() throws Exception{
		// 读取 XML 文档,返回 Document 对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read("./src/contact.xml");
		
		// 获取属性(由于属性是在标签内的,所以需要先获取属性所在的标签对象)
		// 1、得到标签对象
		Element element = doc.getRootElement().element("contact");
		
		// 2、获取标签中属性为 id 的值
		String id = element.attributeValue("id");
		System.out.println(id);
		
		// 3、得到指定属性名称的属性对象
		Attribute idAttr = element.attribute("id");
		System.out.println(idAttr.getName() + "-" + idAttr.getValue()); // 获取属性名和属性值
		System.out.println("---------------------");
		
		// 4、得到当前标签下所有属性的对象(返回 list 集合)
		List<Attribute> list = element.attributes();
		for(Attribute attr : list){
			System.out.println(attr.getName() + "-" + attr.getValue());
		}
		System.out.println("---------------------");
		
		// 5、得到当前标签下所有属性的对象(返回 迭代器)
		Iterator<Attribute> it = element.attributeIterator();
		while (it.hasNext()){
			Attribute attr = it.next();
			System.out.println(attr.getName() + "-" + attr.getValue());
		}
	}
	
	/*
	 * 获取文本
	 */
	@Test
	public void test5() throws Exception{
		// 读取 XML 文档,返回 Document 对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read("./src/contact.xml");
		
		// 获取文本(由于文本是在标签内的,所以需要先获取标签对象)
		// 获取标签对象
		Element nameElem = doc.getRootElement().element("contact").element("name");
		// 获取标签内的文本
		String name = nameElem.getText();
		System.out.println(name);
		
		// 根据指定的子标签名,直接获取标签的文本内容
		String age = doc.getRootElement().element("contact").elementText("age");
		System.out.println(age); 
	}

	/*
	 * 完整的读取 XML 文档
	 */
	@Test
	public void test6() throws Exception{
		// 读取 XML 文档,返回 Document 对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read("./src/contact.xml");
		
		// 获取根标签
		Element rootElement = doc.getRootElement();

		StringBuffer sb = new StringBuffer();
		sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
		
		getChildNodes(rootElement, sb);
		System.out.println(sb.toString());
	}
	
	/**
	 * 获取指定标签下的所有子标签
	 */
	@SuppressWarnings("unchecked")
	private void getChildNodes(Element element, StringBuffer sb){

		// 开始标签
		sb.append("<" + element.getName());

		// 获取标签下的所有属性
		List<Attribute> attributes = element.attributes();
		for (Attribute attr : attributes){
			sb.append(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
		}
		
		sb.append(">");

		// 获取指定标签下所有子节点
		Iterator<Node> it = element.nodeIterator();
		while(it.hasNext()){
			Node node = it.next(); // 取出下一级子节点
			
			// 如果子节点是 Text,则将 文本内容添加到 sb 中
			if (node instanceof Text){
				Text text = (Text)node;
				sb.append(text.getText());
			}
			
			// 如果子节点是 Element,则递归
			if (node instanceof Element){
				Element elem = (Element)node;
				getChildNodes(elem, sb);
			}
		}
		
		// 结束标签
		sb.append("</" + element.getName() + ">");
	}
	
	/*
	 * 读取 XML 文档,封装到 Javabean 对象中
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void test7() throws Exception{
		// 读取 XML 文档,返回 Document 对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read("./src/contact.xml");
		
		// 获取根标签
		Element rootElement = doc.getRootElement();
		
		// 定义一个存储 javabean 对象的集合
		List<Contact> lists = new ArrayList<Contact>();
		
		// 获取所有子标签
		List<Element> listElements = rootElement.elements();
		for (Element element : listElements){
			// 获取数据并封装到 Javabean 中
			Contact contact = new Contact();
			contact.setId(element.attributeValue("id"));
			contact.setName(element.elementText("name"));
			contact.setAge(element.elementText("age"));
			contact.setPhone(element.elementText("phone"));
			contact.setEmail(element.elementText("email"));
			contact.setQq(element.elementText("qq"));
			
			// 将 javabean 对象添加到 集合中
			lists.add(contact);
		}
		
		// 循环读取 javabean 
		for (Contact contact : lists){
			System.out.println(contact);
		}
	}
}

其中 Javabean( Contact.java )为:

package com.demo.a_dom4j;

public class Contact {
	private String id;
	private String name;
	private String age;
	private String phone;
	private String email;
	private String qq;

	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 getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getQq() {
		return qq;
	}

	public void setQq(String qq) {
		this.qq = qq;
	}

	@Override
	public String toString() {
		return "Contact [id=" + id + ", name=" + name + ", age=" + age + ", phone=" + phone + ", email=" + email
				+ ", qq=" + qq + "]";
	}

}

Dom4J下载地址:https://download.csdn.net/download/qq_29331365/11164486

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值