dom4j学习笔记

1.XML文件的一些概念

1.1XML文件的常见应用
①数据传送的通用格式
②配置文件,例如程序的设置信息
③充当小型数据库

1.2XML的语法
①文档声明
<?xml version="1.0" encoding="utf-8" standalone="yes|no"?>
其中standalone="yes|no"表示该xml文件是否独立使用,yes表示是独立使用,no表示不是单独使用。默认是no

②一个xml文件,有且只有一个根元素

③在xml文件中
<name>xiaoming</name>
不等价与
<name>
xiaoming
</name>

④属性值用双引号(")或单引号(')分隔。如果属性值中有',则用"分隔;如果有",则用'分隔。
如果属性值既有'又有",则需要使用实体:
&lt;<
&gt;>
&amp;&
&quot;"
&apos'

⑤CDATA节
有时我们希望传递一些特殊字符,如<>@!&,这时可以使用CDATA节
基本用法:
<![CDATA[
……
]]>
例如,可以使用xml去传递小图片(如头像等),将文件读取成byte[],然后放到CDATA节中,再传递。

2.使用dom4j操作XML文件

使用的xml文件如下:
<?xml version="1.0" encoding="utf-8"?>

<班级> 
  <学生> 
    <名字 别名="及时雨">宋江</名字>  
    <年龄>50</年龄> 
    <介绍>学习认真</介绍> 
  </学生>  
  <学生> 
    <名字 别名="玉麒麟">卢俊义</名字>  
    <年龄>53</年龄>  
    <介绍>学习认真</介绍> 
  </学生>  
  <学生>
    <名字>林冲</名字>
  </学生>
  <学生> 
    <名字 别名="行者">武松</名字>  
    <年龄>53</年龄>  
    <介绍>学习认真</介绍> 
  </学生> 
</班级>

2.1对xml进行CRUD操作

/**
 * 使用dom4j对xml文件进行crud操作
 */
package com.hh.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
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.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//1.获得解析器
		SAXReader saxReader = new SAXReader();
		//2.指定解析哪个xml文件
		Document document = saxReader.read(new File("src/com/hh/dom4j/myClass.xml"));
		//传入document的根元素
		list(document.getRootElement());
		read(document);
		add(document);
		del(document);
		update(document);
		addByIndex(document);
		
	}
	
	//添加一个元素到指定位置(添加林冲在卢俊义之后,武松之前)
	public static void addByIndex(Document document)throws Exception{
		//创建一个元素
		Element newHero = DocumentHelper.createElement("学生");
		Element newHeroName = DocumentHelper.createElement("名字");
		newHeroName.setText("林冲");
		newHero.add(newHeroName);
		//得到所有学生的list
		List allHeros = document.getRootElement().elements("学生");
		allHeros.add(2, newHero);
		
		//更新xml
		//直接输出会出现中文乱码,所以需要指定样式
		OutputFormat output = OutputFormat.createPrettyPrint();
		output.setEncoding("utf-8");//指定输出编码方式
		
		
		//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
		XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
		writer.write(document);
		writer.close();
	}
	
	//更新元素(把所有学生年龄增加3岁)
	public static void update(Document document) throws Exception{
		//得到所有学生的年龄
		List<Element> students = document.getRootElement().elements("学生");
		for(Element el:students){
			//从el中取出年龄
			int newAge = Integer.parseInt(el.element("年龄").getText()) + 3;
			el.element("年龄").setText(newAge+"");
			//修改属性,将别名都修改为hello
			el.element("名字").addAttribute("别名2", "hello");
		}
		
		//更新xml
		//直接输出会出现中文乱码,所以需要指定样式
		OutputFormat output = OutputFormat.createPrettyPrint();
		output.setEncoding("utf-8");//指定输出编码方式
		
		
		//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
		XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
		writer.write(document);
		writer.close();
	}
	
	//删除元素(删除第一个学生)
	public static void del(Document document) throws Exception{
		Element root = document.getRootElement();
		//找到该元素
		Element delStu = (Element)root.elements().get(0);
		//从父节点删除该元素
//		delStu.getParent().remove(delStu);
		//删除介绍节点
		Element delStu_nickName = delStu.element("介绍");
		//方法一
		delStu.remove(delStu_nickName);
		//方法二
//		delStu.element("介绍").getParent().remove(delStu.element("介绍"));
		//删除名字元素的属性
//		Element delStu_name = delStu.element("名字");
//		delStu_name.remove(delStu_name.attribute("别名"));
		
		//更新xml
		//直接输出会出现中文乱码,所以需要指定样式
		OutputFormat output = OutputFormat.createPrettyPrint();
		output.setEncoding("utf-8");//指定输出编码方式
		
		
		//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
		XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
		writer.write(document);
		writer.close();
	}
	
	//添加元素(添加一个学生)
	public static void add(Document document) throws Exception {
		//首先创建一个学生节点对象 
		Element newStu = DocumentHelper.createElement("学生");
		Element newStu_name = DocumentHelper.createElement("名字");
		newStu_name.setText("刘德华");
		newStu_name.addAttribute("别名", "德华");
		Element newStu_age = DocumentHelper.createElement("年龄");
		newStu_age.setText("35");
		Element newStu_intro = DocumentHelper.createElement("介绍");
		newStu_intro.setText("学习认真");
		
		//把三个子元素(节点)加到newStu下
		newStu.add(newStu_name);
		newStu.add(newStu_age);
		newStu.add(newStu_intro);
		
		//再把newStu节点加到根元素
		document.getRootElement().add(newStu);
		
		//直接输出会出现中文乱码,所以需要指定样式
		OutputFormat output = OutputFormat.createPrettyPrint();
		output.setEncoding("utf-8");//指定输出编码方式
		
		
		//此时所有数据都在内存,并没有存入xml中,所以需要把xml文件更新
//		XMLWriter writer = new XMLWriter(new FileWriter("src/com/hh/dom4j/myClass.xml"),output);
		XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/com/hh/dom4j/myClass.xml")),output);
		writer.write(document);
		writer.close();
	}
	
	//指定读取某个元素(要求:读取第一个学生的信息)
	public static void read(Document document){
		//得到根元素
		Element root = document.getRootElement();
		//root.elements("学生")表示取出root元素下的所有学生元素List
		//root.element("学生")表示取出root元素下第一个学生元素
		//get(0)表示取出第一个学生元素
		Element stu = (Element)root.elements("学生").get(0);
		Element stu_name = stu.element("名字");
		System.out.println(stu_name.getText());
		//取出名字的属性
		System.out.println(stu_name.attributeValue("别名"));
//		System.out.println(((Element)stu.elements("年龄").get(0)).getText());
		
		//dom4j不能直接跨层取数据,需要xpath
//		Element name = (Element)root.elements("名字").get(0);
//		System.out.println(name.getText());
		//使用xpath,取出第二个学生
		Element stu2 = (Element) document.selectSingleNode("/班级/学生[2]/名字");
		System.out.println("第二个学生:"+stu2.getText());
	}  
	//遍历整个xml文件
	public static void list(Element element){
		System.out.println(element.getName()+"  "+element.getTextTrim());
		Iterator iterator = element.elementIterator();
		while(iterator.hasNext()){
			Element e = (Element)iterator.next();
			//递归
			list(e);
		}
	}

}

//创建xml文件
	 public static void createXMLbyDOM4J() {
	        Document document = DocumentHelper.createDocument(); //创建一个空白的xml文档  
	        Element rootElement = document.addElement("employees"); //添加根节点  
	        //添加employee节点并设置属性和值  
	        Element employeeElement = rootElement.addElement("employee").addAttribute("id", "123");   
	        //添加name节点并设置文本内容  
	        employeeElement.addElement("name").addText("胡辉");  
	        employeeElement.addElement("age").addText("23");  
	        employeeElement.addElement("sex").addText("男");  
	        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
	        employeeElement.addElement("birthday").addText(dateFormat.format(new Date()));  
	          
	        //保存xml文档到硬盘  
	        try {  
	           // 美化格式  
	            OutputFormat format = OutputFormat.createPrettyPrint();
	            OutputStream out=new FileOutputStream("F:/employees.xml");
	            Writer wr=new OutputStreamWriter(out,"UTF-8");
	            XMLWriter writer = new XMLWriter(wr, format);  
	            writer.write(document);  
	            writer.close();
	            wr.close();
	            out.close();
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }
	    }



2.2dom4j结合xpath

单独使用dom4j是不能跨层取数据的,需要结合xpath才能实现。
/**
 * dom4j配合xpath案例
 */
package com.hh.dom4j.xpath;

import java.util.List;

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

public class Test1 {

	/**
	 * @param args
	 * @throws DocumentException 
	 */
	public static void main(String[] args) throws DocumentException {
		// TODO Auto-generated method stub
		//1.得到SAXReader解析器
		SAXReader saxReader = new SAXReader();
		//2.指定去解析的文件路径
		Document document = saxReader.read("src/com/hh/dom4j/xpath/test.xml");
		//3.使用xpath随意读取xml
		List e = document.selectNodes("/AAA/CCC/DDD/*");//返回多个元素   Element e = document.selectSingleNode()//返回一个元素
		System.out.println(((Element)e.get(e.size()-1)).getText());
		List e = document.selectNodes("/AAA/BBB[1]/CCC[2]/KKK");
		System.out.println(((Element)e.get(0)).getText());
		System.out.println(((Attribute)e.get(1)).getText());//输出属性值
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值