00 04Java Web开发之XML解析之dom4j

1 dom4j的简介

dom4j是一个组织,针对xml解析,提供解析器dom4j。

dom4j不是javase的一部分,想要使用:
第一步需要导入dom4j提供jar包

得到Document
public class SAXReader extends java.lang.Object

SAXReader reader = new SAXReader();
Document document = reader.read(url);

Document的父接口是Node
|——如果在Document里面找不到想要的方法,到Node里面找。

方法 描述
public Element getRootElement​() 获取根节点,返回Element

Element也是一个接口,父接口是Node

方法 描述
public Element getParent() 获取父节点
public Element addElement 添加标签
public Element element(qName) 表示获取标签下面的第一个子标签,qName指标签的名称
public List elements(qName) 表示获取标签下面的所有子标签(一层),qName指标签的名称
public List elements() 表示获取标签下面的所有子标签(一层)

2 使用dom4j实现查询xml操作

<?xml version="1.0" encoding="UTF-8"?>

<person> 
  <p1 id1="love"> 
    <name>lks</name>  
    <age>30</age>  
  </p1>  
  <p1> 
    <name>hhy</name>  
    <age>20</age> 
  </p1> 
</person>

查询所有name元素里面的值。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)得到所有的p1标签:使用elements(qName)方法返回所有list集合,然后遍历list得到每一个p1。
(5)得到name:在p1下执行element(qName)方法,返回Element
(6)得到name里面的值:getText()方法得到值

public static void allName() throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/dom4jlearn/person.xml");
		Element root = document.getRootElement();
		List<Element> p1 = root.elements("p1");
		for(Element e : p1) {
			Element name = e.element("name");
			String str = name.getText();
			System.out.println(str);
		}
	}

查询第一个name元素的值。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)得到第一个p1元素
(5)得到p1下面的name元素
(6)得到name元素里面的值

public static void getFirstName() throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/dom4jlearn/person.xml");
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		Element name = p1.element("name");
		System.out.println(name.getText());
	}

查询第二个name元素的值。
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)得到所有p1元素
(5)遍历得到第二个p1
(6)得到第二个p1下面的name元素
(7)得到name元素里面的值

public static void getSecondName()throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/dom4jlearn/person.xml");
		Element root = document.getRootElement();
		List<Element> p1 = root.elements("p1");
		Element name = p1.get(1).element("name");
		System.out.println(name.getText());
	}

3 使用dom4j实现在末尾添加节点

在第一个p1标签末尾添加一个元素<sex>女</sex>
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)获取到第一个p1:使用element()方法
(5)在p1下面添加元素:使用p1.addElement(“sex”)方法,返回一个Element
(6)在添加完成之后的元素下面添加文本:在sex上使用setText(“文本内容”)方法
(7)回写xml:格式化(OutputFormat),使用createPrettyPrint(),使用XMLWriter,直接new,传两个参数,第一个参数是xml路径,第二个参数是格式化类的值。之后使用write()回写

public static void addSex() throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/dom4jlearn/person.xml");
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		Element sex = p1.addElement("sex");
		sex.setText("女");
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/dom4jlearn/person.xml"), format);
		xmlWriter.write(document);
	}
	

4 使用dom4j实现在特定位置添加元素

在第一个p1下面的age标签之前添加<school>fjut</school>
(1)创建解析器。
(2)得到一个Document
(3)得到根节点
(4)获取到第一个p1
(5)获取p1下所有的元素:elements()方法,返回List集合
(6)使用List里面的方法add(int index, E element),在特定位置添加元素
|——使用DocumentHelper.createElement()创建元素,在下面创建文本。
(7)回写xml


```java
public static void addSchool() throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(PATH);
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		List<Element> list = p1.elements();
		Element school = DocumentHelper.createElement("school");
		school.setText("fjut");
		list.add(1, school);
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH), format);
		xmlWriter.write(document);
	}

# 5 dom4j里面封装方法的操作
可以对得到document的操作和回写xml操作,封装成方法,也可以把传递的文件路径,封装成一个常量,好处是可以提高开发速度,可以提高代码可维护性。 
1、返回document:public static Document getDocument(String path)
2、回写xml:public static void xmlWriters(String path, Document document);

```java
public final static String PATH = "src/dom4jlearn/person.xml";
	
	public static Document getDocument() {
		SAXReader saxReader = new SAXReader();
		try {
			Document document = saxReader.read(PATH);
			return document;
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static void xmlWriters(Document document) {
		
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH), format);
			xmlWriter.write(document);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

6 使用dom4j实现修改节点的操作

修改第一个p1下面的age元素的值<age>30</age>
(1)得到document
(2)得到第一个p1元素
(3)得到第一个p1下面的age
(4)修改值为30
(5)回写xml

public static void modifyAge() {
		Document document = Dom4jUtils.getDocument();
		
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		Element age = p1.element("age");
		age.setText("300");
		
		Dom4jUtils.xmlWriters(document);
	}

7 使用dom4j实现删除节点的操作

删除第一个p1下的<school>fjut</school>
(1)得到document
(2)获取根节点
(3)获取第一个p1标签
(4)得到第一个p1下的school元素
(5)使用p1删除school元素
(6)回写xml

public static void removeSchool() {
		Document document = getDocument();
		
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		Element school = p1.element("school");
		p1.remove(school);
		
		xmlWriters(document);
	}

8 使用dom4j实现获取属性值的操作

获取第一个p1里面的属性id1的值。
(1)得到document
(2)获取根节点
(3)获取第一个p1元素
(4)获取第一个p1元素的属性值,public String attributeValue(String attribute);

public static void getAttribute() {
		Document document = getDocument();
		
		Element root = document.getRootElement();
		Element p1 = root.element("p1");
		System.out.println(p1.attributeValue("id1"));
	}
发布了77 篇原创文章 · 获赞 11 · 访问量 2629

猜你喜欢

转载自blog.csdn.net/weixin_43762330/article/details/104533554
今日推荐