jar包神作之 dom4j (让xml解析变得如此简单)

xml的增删改查(dom4j.jar)

应该不用多久就可以使用通过jdk自带的jar包实现解析,–》dom解析,现在基础比较薄弱

首先通过用来xml的操作的demo4j.jar包( 配合一些其他的包 ),学会了如何使用第三方的jar包,

我在查看源码过程中,遇到反编译问题、然后给eclipse安装了反编译工具jadJADClipse

//小伙伴如果有相同的需求,可以去我的博客里找一下反编译安装的博客,搜索配置eclipse即可

1.xml的解析

public static void main(String[] args) throws DocumentException {
		// TODO Auto-generated method stub
		
		//将xml加入到内存中形成file对象
		File file = new File("e:/person.xml");
		
		//初始化domj4的核心类
		SAXReader  reader = new SAXReader();
		
		//调用read方法去读取xml文件
		Document document = reader.read(file);
		
		//展示在控制台上
//		System.out.println(doucment.asXML());
		
		//获取文档根元素
		Element rootElement =document.getRootElement();
		
		将根目录的属性转为链表
		List<Attribute> attributes = rootElement.attributes();
		
		//属性数量
		System.out.println(rootElement.attributeCount());
		//是否有内容
		System.out.println(document.hasContent());
		//将属性链表循环打印
		for (Attribute attribute : attributes) {
			System.out.println(attribute.getName()+" "+attribute.getValue());
		}
		//输出xml
		System.out.println(document.asXML());
	}

2.xml的写入

public static void main(String[] args) throws IOException, DocumentException {

		//创建一个文档对象
		Document document = DocumentHelper.createDocument();
		
		//创建根元素
		Element rootElement = document.addElement("person");
		
		//给根元素添加属性
		rootElement.addAttribute("sex", "男");
		
		//通过根元素创建子元素
		Element brainElement = rootElement.addElement("brain");
		
		//给brain添加属性
		brainElement.addAttribute("size", "36");
		
		//给brain添加文本值
		brainElement.setText("脑袋");
		
		//.通过根元素创建子元素
		Element lefteyes = brainElement.addElement("eyes");
		//给lefteyes添加属性
		lefteyes.addAttribute("num", "0.3");
		//给lefteyes添加文本值
		lefteyes.setText("左眼");
		
		//.通过眼元素创建子元素
		Element righteyes = brainElement.addElement("eyes");
		//给righteyes添加属性
		righteyes.addAttribute("num", "0.5");
		//给lefteyes添加文本值
		righteyes.setText("右眼");
		
		//设定格式化输出标准
		OutputFormat format = new OutputFormat().createPrettyPrint(); //漂亮的输出  (有回车的输出)
//		OutputFormat format = new OutputFormat().createCompactFormat(); //紧凑的输出
		
		format.setEncoding("utf-8");//设定输出的内容的编码的格式
		
		//最后写入    写入其实是一个io操作
		//s设定文件存放的路径
		String path = "E://person.xml";
		FileWriter fileWriter = new FileWriter(path);//开启一个写入对象,意思为与path构建一个流链接
		
		//将文件对象存放到xml
		XMLWriter xmlWriter = new XMLWriter(fileWriter,format);//第二个参数是使用相对应的 输出格式样式
		
		//将文档输入到xml对象中
		xmlWriter.write(document);
		
		//关闭相对应的流对象
		xmlWriter.close();
		fileWriter.close();
		
		System.out.println("写入成功了");
		//测试
		
		//使用demoj4核心类取读取xml文件,然后再次输出刚刚写的xml文件
		File file = new File("E://person.xml");//xml对象
		SAXReader r = new SAXReader();//核心类
		Document d = r.read(file);
		System.out.println(d.asXML());
		
		
	}

3.xml删除节点元素

public static void main(String[] args) throws DocumentException, IOException {
		String filepath = "e://person.xml";//获取xml对象
		File file = new File(filepath);//存入文件对象
		SAXReader r = new SAXReader();//实例xml核心类
		Document document = r.read(file);
		
		//然后获取根节点
		Element e = document.getRootElement();
		
		//通过根元素直接获取迭代对象
		Iterator<Element> it = e.elementIterator();
		
		//遍历二级节点,抽取属性,进行查找,然后进行删除
		while (it.hasNext()) {
			//获取子节点
			Element evey = it.next();
			System.out.println(evey.attributeValue("sid"));
			//如果这个节点的sid属性不为空
            if(evey.attributeValue("sid")!=null) {
				//如果sid的值为102
                if (evey.attributeValue("sid").equals("102")) 
				{
					it.remove();//删除节点
				}
			} 
		}
		//删除完的写入对象
		OutputFormat o = OutputFormat.createPrettyPrint();
		o.setEncoding("utf-8");//文件的编码格式
		XMLWriter xmlWriter =new XMLWriter(new FileWriter(filepath),o);
		xmlWriter.write(document);
		xmlWriter.close();
	}

4.xml更改节点元素

public static void main(String[] args) throws DocumentException, IOException {
		String filepath = "e://person.xml";//创建路径
		File file = new File(filepath);//写入文件对象
		SAXReader reader = new SAXReader(); //创建demj4的核心类
		Document document = reader.read(file);//读取xml对象 存储为document
		Element root = document.getRootElement();//获取xml文件的根元素
		List<Element> list = root.elements();//将root的子节点转为列表
		//将root的子节点遍历
		for (Element element : list) {
			//将每个结点的属性转为迭代器
			Iterator<Attribute> it = element.attributeIterator();
			//遍历节点的属性
			while (it.hasNext()) {
				//提出每个属性
				Attribute a = it.next();
				//打印属性名和值
				System.out.println(a.getName()+"   "+a.getValue());
				if(a.getValue().equals("102")) 
				{
					element.selectSingleNode("姓名").setText("王五");
				}
			}
			//又将二级节点下的节点查询了一遍,后续在实战中可以使用递归进行全部遍历
			List<Element> list2 = element.elements();
			for (Element element2 : list2) {
				Iterator<Attribute> it2 = element2.attributeIterator();
				while (it2.hasNext()) {
					//提出每个属性
					Attribute a = it2.next();
					//打印属性名和值
					System.out.println(a.getName()+"   "+a.getValue());
					if(a.getValue().equals("102")) 
					{
						element2.selectSingleNode("姓名").setText("王五");
					}
				}
			}
			
		}
		//将document 更改后的对象存入xml
		OutputFormat o = new OutputFormat().createPrettyPrint();
		o.setEncoding("utf-8");
		XMLWriter xmlWriter = new XMLWriter(new FileWriter(filepath),o);
		xmlWriter.write(document);
		xmlWriter.close();
	}

5.查询元素,属性、属性值、节点

public static void main(String[] args) throws DocumentException {
		// TODO Auto-generated method stub
		String path = "e://person.xml";
		//文件对象
		File file = new File(path);
		//核心类
		SAXReader saxReader = new SAXReader();
		//读取xml
		Document document = saxReader.read(file);
		//获取根目录
		 Element rootElement = document.getRootElement();
		//查询根目录子节点
		 List<Element> secondElement = rootElement.elements();
		 //遍历子节点
		 for (Element element : secondElement) {
			 //节点属性转列表
			 List<Attribute> a = element.attributes();
			 //获取第一个属性
			 Attribute attr = a.get(0);
			 //打印节点名字,节点属性,属性值
			System.out.println(element.getName()+" ,"+attr.getName()+" : "+attr.getValue());
		}
}

6.练习使用添加

/**
 * @Description:xml作业 
 * 1.将以下信息写入一个名字为User的xml文件中
             001     23岁              男                           张三                                1383838438
             002     24岁             女                            李美丽                            1393939439
             003     25岁              男                           王五                               1585858598  
 * @auther:Li Ya Hui
 * @Time:2021年4月16日上午9:58:02
 */
public class homework {
	public static void main(String[] args) throws DocumentException, IOException {
		// TODO Auto-generated method stub
		File file =new File("e://person.xml");
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(file);
		Element root = document.getRootElement();
		root.setName("User");
		//遍历出根节点下所有节点
		List<Element> a = root.elements();
		//遍历删除
		for (Element element : a) { //我首先把文件中的所有节点删除,,又练习了一边删除
			//根目录的remmove方法每个节点
			root.remove(element);
		}
		System.out.println(root.asXML());//输出xml信息
		
		Element stu1 = root.addElement("学号");//根节点添加一个二级节点,
		stu1.addAttribute("学号","001" );//属性为学号  001
		stu1.addElement("年龄").setText("23岁");//001添加年龄节点
		stu1.addElement("性别").setText("男");  //001添加性别节点
		stu1.addElement("名字").setText("张三"); //001添加名字节点
		stu1.addElement("电话").setText("1383838438");//001添加电话节点
        
		Element stu2 = root.addElement("学号");//根节点添加一个二级节点,
		stu2.addAttribute("学号","002" );//属性为学号  001
		stu2.addElement("年龄").setText("24岁");//001添加年龄节点
		stu2.addElement("性别").setText("女");  //001添加性别节点
		stu2.addElement("名字").setText("李美丽 "); //001添加名字节点
		stu2.addElement("电话").setText("1393939439");//001添加电话节点
		
		Element stu3 = root.addElement("学号");//根节点添加一个二级节点,
		stu3.addAttribute("学号","003" );//属性为学号  001
		stu3.addElement("年龄").setText("25岁");//001添加年龄节点
		stu3.addElement("性别").setText("男");  //001添加性别节点
		stu3.addElement("名字").setText("王五"); //001添加名字节点
		stu3.addElement("电话").setText("1585858598");//001添加电话节点
		
		OutputFormat o = new OutputFormat().createPrettyPrint();//漂亮的换行输出
		o.setEncoding("utf-8");	//设置编码格式
		XMLWriter s = new XMLWriter(new FileWriter(file),o);//创建写入流
		s.write(document);	//写入文件
		s.close();//关闭流
		//重新加载了一遍xml新的文件
		document = saxReader.read(file);
		System.out.println(document.asXML());
	}
}

7.练习递归查找、添加、删除、更改

/**
 * @Description:作业2从person.xml文件中将所有人的姓名展示出来
 * 				//3.张三的名字改为007
 * 				//4.向person.xml中添加一条数据信息,004  26岁     男       李四     1343434394
 *				//5.将person.xml文件中的性别为女的那一条数据删除      
 * @auther:Li Ya Hui
 * @Time:2021年4月16日上午10:49:36
 */
public class homework2 {
	//递归展示  姓名
	public static void main(String[] args) throws Exception {
		//创建文件对象
		File file = new File("e://person.xml");
		//创建核心类
		SAXReader saxReader = new SAXReader() ;
		//读取xml文件
		Document docu = saxReader.read(file);
		//根节点的子节点转为链表
		Element root = docu.getRootElement();
		//递归查找
		diGui(root);
		
		//创建写入格式和开辟写入流
		OutputFormat o = new OutputFormat().createPrettyPrint();
		o.setEncoding("utf-8");
		XMLWriter x = new XMLWriter(new FileWriter(file),o);
		
		// 4小题  添加数据 004    26岁                  男                         李四                                  1343434394
		Element e =root.addElement("学号").addAttribute("学号", "003");
		e.addElement("年龄").setText("26岁");
		e.addElement("性别").setText("男");
		e.addElement("姓名").setText("李四");
		e.addElement("电话").setText("1343434394");

		//	写入文件
		x.write(docu);
		//  关闭流
		x.close();
	}
	//递归实现查找所有姓名   //实现查找张三  //实现删除性别女的整条数据
	private static void diGui(Element docu) {
		@SuppressWarnings("unchecked")
		List<Element> root = docu.elements(); 
		
		//获取元素的长度,长度为零代表没有节点
		if (root.size()==0) 
		{
			System.out.println(docu.getName()+":此节点结束");
		}else {
			//遍历根目录的子节点
			for (Element element : root) {
				// 5 小题  删除数据  条件性别:女
				if (element.selectSingleNode("性别")!=null) 
				{		//查找性别女
					if (element.selectSingleNode("性别").getText().equals("女")) {
						docu.remove(element);
					}
				}
				//3 小题  更改名字张三
				if (element.selectSingleNode("名字")!=null) 
				{		//查找张三
					if (element.selectSingleNode("名字").getText().equals("张三")) {
						element.selectSingleNode("名字").setText("007");
					}
				}
				if(element.getName().equals("名字"))
				{
					System.out.println(element.getText());
				}
				diGui(element);
			}
		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DataPulse-辉常努腻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值