javaee关于dom4j对xml的基本认识

昨天,我做了关于xml的一些简单操作和对dtd约束的简单了解,但是,发现使用jaxp的效果不佳,代码冗余,所以今天学习了一个新的技术去对xml进行更加简便的操作,那就是使用dom4j工具。

从学习xml的方面中:我们知道

关于xml的解析方法:
1)DOM解析:
jaxp jdom dom4j
   特点:
一次性把整个文档存在内存里面,要解析需要把整个加载构建成一个DOM树
,通过操作DOM树来操作xml,占用的内存大
2)SAX解析:
   特点:
不需要把整个文档存进内存,需要解析的时候而是读取一点,解析一点,占用的内存小

关于DOM4j的解析方法
1)首先需要的步骤一:加载dom4j.jar的jar包
2)然后需要加载xml文件:
SAXReader sr  = new SAXReader();
Document doc = sr.read(xml的文件路径);

3)读取标签,通过doc
getRootElement()  根标签
      element("name")  获取指定名称的第一个子标签
      elements("name")  获取指定名称的所有子标签,返回List集合
elements()    获取所有子标签,返回List集合
elementIterator()  获取所有子标签,返回迭代器


4)读取属性,可以通过doc,也可以通过doc得到的子标签
atttribute("name") 获取指定名称的属性对象
Attribute.getName() /getValue() 获取属性名称和属性值
attributes(): 获取所有属性,返回LIst
  attributeIterator()  获取所有属性,返回迭代器
  attributeValue("name") 获取指定名称的属性值


5)读取文本的值,可以通过doc,也可以通过doc得到的子标签
getText()  获取当前标签的文本内容
elementText("name") 获取指定名称的子标签文本内容(只能获取第一个)




6)通过dom4j修改文本,需要在内存的读取的同时,还需要把修改的结果保存在硬盘上,
//读取xml文件
SAXReader sr  = new SAXReader();
Document doc = sr.read(xml的文件路径);


//写出xml文件
XMLWriter writer = new XMLWriter(
new FileOutputStream(写出的xml文件路径),
//OutputFormat.createCompactFormat()  :此默认值,输出的格式是紧凑的
  | OutputFormat.createPrettyPrint()  :输出的格式是漂亮的
);
writer.write(doc);
writer.close();

增加:
标签: addElement("name")
属性:  addAttribute("name","value");
修改:
属性值: addAttribute("name","vaue") / Attribute.setValue("value")
文本:   setText("value")
删除:
标签:   detach()  / getParent().remove(xxx);
    属性:   detach()  / getParent().remove(xxx);


下面是关于dom4j的一些基础的联系:

一、首先是需要操作的xml文件

<?xml version="1.0" encoding="GBK"?>
<exam>
	<student idcard="111" examid="222">
		<name>张三</name>
		<location>沈阳</location>
		<grade>89</grade>
	</student>
	
	<student idcard="333" examid="444">
		<name>李四</name>
		<location>大连</location>
		<grade>97</grade>
	</student>
	
</exam>

二、创建一个类并导入dom4j的包

package xml.example.reader;

import java.io.FileOutputStream;
import java.io.IOException;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

public class demo2_writer {

	//1.添加属性、标签
	@Test
	public void test01() throws Exception{
		Document doc = read();
		Element root = doc.getRootElement();
		Element addElement1 = root.addElement("employer");
		//已过时 addElement1.setAttributeValue("id", "04");
		addElement1.addAttribute("id", "04");
		
		addElement1.addElement("id").addText("4");
		addElement1.addElement("name").addAttribute("name", "zl").addText("赵六");
		addElement1.addElement("age").addText("15");
		addElement1.addElement("departement").addText("服务部");
		addElement1.addElement("money").addText("9k");
		
		write(doc);
	}
	
	@Test
	public void test02() throws Exception{
		//修改属性和文本
		Document doc = read();
		Element root = doc.getRootElement();
		//方式一、直接从标签中得到元素的属性然后在覆盖它
//		Element element = (Element) root.elements().get(1);
//		element.addAttribute("id", "04");
		
		
		//方式二、从元素中得到了属性之后,再重新设值
		/*Element element = (Element) root.elements().get(1);
		Attribute attribute = element.attribute("id");
		attribute.setValue("05");
		*/
		
		//修改文本
		Element element = (Element) root.elements().get(1);
		element.element("name").addAttribute("name", "zl").setText("赵六");
		
		
		write(doc);
	}
	
	
	@Test
	public void test03() throws Exception{
		//删除标签或者属性
		Document doc = read();
		Element root = doc.getRootElement();
		
		//方式一:从标签中得到属性之后,直接detach删除
		Element element = (Element) root.elements().get(2);
		element.detach();
		
		//方式二:得到标签之后再从标签得到他的父标签,再删除
//		Element element = (Element) root.elements().get(2);
//		element.getParent().remove(element);
		
		write(doc);
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	//读取xml文件
	public Document read() throws Exception{
		SAXReader sr  = new SAXReader();
		Document doc = sr.read("src/example02.xml");
		return doc;
	}
	
	
	//修改到xml文件中
	public void write(Document doc) throws Exception{
		XMLWriter writer = new XMLWriter(
							new FileOutputStream("src/example02.xml")
							//,OutputFormat.createCompactFormat()
							);
		writer.write(doc);
		writer.close();
	}
}

通过今天的学习,基本了解了dom4j的工作原理与基本操作,明天将学习有关SAX解析和XPath的基本操作,因为如果使用dom4j的操作,当xml的量比较多的话,使用dom4j就比较麻烦了,这个时候就需要XPath了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值