DOM4j对XML文件的操作

Dom4j也可以很方便完成XML文档的创建、元素的修改、文档的查询遍历等

dom4j的包以及其它依赖包下载地址

    解压之后DOM4j对XML文件的操作_第1张图片

,将里面的dom4j-1.6.1.jar这个文件直接放在项目里面,建一个lib文件夹,邮件,直接添加Add to Build Path即可构建到项目中去了.

   1.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<all>
	<user id="10">
		
			<name> 张三 </name>
			<age>18</age>
			
	</user>
	<user id="11">
			<name>Tom</name>
			<age>10</age>
	</user>
</all>

     2.利用dom4j技术开始对xml文档进行增删改查

2-1 增加文档中的user对象

<span style="font-size:18px;">	@Test
	public void add(){
		SAXReader read=new SAXReader();
		try {
			Document dom=read.read("./src/xml/1.xml");
			Element root=dom.getRootElement();
			Element userE=root.addElement("user");
			userE.addAttribute("id", "110");//设置属性
			
			Element nameE=userE.addElement("name");//在节点下添加一个name节点
			nameE.setText("jimi");//为name标签里面添加值
			/*Element nameE=userE.addElement("name");//添加一个name标签
			  nameE.setText("jimi");//为name标签里面添加值
			两句可以修改为  userE.addElement("name").setText("jimi");//是一样的
			 * 
			 */
			Element ageE=userE.addElement("age");//添加一个age标签
			ageE.setText("17");//为age添加值
			
			//以上只是添加,并没有存储到文件里面去,将dom写到文件中去
			XMLWriter wr=new XMLWriter(new FileOutputStream("./src/xml/1.xml"));
			wr.write(dom);
			wr.close();
			
		} catch (DocumentException e) {
			throw new RuntimeException("xml文件读取失败"+e.getMessage());
		} catch (IOException e) {
			throw new RuntimeException("文件存储失败"+e.getMessage());
		} </span>

2-2 对文件中元素进行删除

	<span style="font-size:18px;">@Test
	public void Del() throws Exception{
		/*
		 * 删除name=tom的user标签,我们必须找到root下面的user节点,然后根据user节点去查找name节点里面的值
		 */
		//获取文件内容
		SAXReader read=new SAXReader();
		Document dom=read.read("./src/xml/1.xml");
		Element root=dom.getRootElement();//获得根节点
		//从xml文件中,有三个user元素,需要遍历所有的,然后根据条件去删除
		Iterator it=root.elementIterator("user");//遍历root节点里面的所有name标签元素
		while(it.hasNext()){
			Element ele=(Element) it.next();
			Iterator itn=ele.elementIterator("name");
			while(itn.hasNext()){
				Element e=(Element) itn.next();
			if("Tom".equals(e.getText())){
				e.getParent().getParent().remove(e.getParent());//name的父节点为user user的父节点才能移除user节点
			}
		}}</span>
<span style="font-size:18px;">		XMLWriter wr =new XMLWriter(new FileOutputStream("./src/xml/1.xml"));//文件修改好了之后存储到相应问的位置
		wr.write(dom);
		wr.close();
	}</span>

2-3对文件中的元素进行修改

<span style="font-size:18px;">	@Test 
	public void upadte() throws Exception{
		/*和删除差不多,只需要找到之后name.setText("张四");就可以了
		 * 之前删除采用的iterator,这里采用root.elements("user")获得list来进行遍历
		 * 把name=张三的修改为张四
		 */
		SAXReader read =new SAXReader();
		Document dom=read.read("./src/xml/1.xml");
		Element root=dom.getRootElement();
		List list=root.elements("user");
		int length=list.size();
		for(int i=0;i<length;i++){
			Element userE=(Element) list.get(i);
			List nameL=userE.elements("name");
			for(int j=0;j<nameL.size();j++){
				Element name=(Element) nameL.get(j);
				//System.out.println(name.getText());
				if("张三".equals(name.getText().trim())){
					name.setText("张四");
					System.out.println(name.getText());
				}
			}
		}
		XMLWriter wr=new XMLWriter(new FileOutputStream("./src/xml/1.xml"));
		wr.write(dom);
		wr.close();
	}对于采用dom4j方式来xml格式进行增删改查,必须要得到要操作的节点元素,要是很多,就采用获得list的方式
<span style="white-space:pre">	</span> * 如:List<Element> list2=userssE.elements("user"),然后根据需要第几个操作,比如,第一个(元素)    list2.get(0)是Element
<span style="white-space:pre">		</span>要是下面还有很多,照样转换成list数组,一次类推,一定可以找到相应的元素节点</span>

2-4 对文件中的元素进行遍历

<span style="font-size:18px;">@Test
	public void getAll() throws Exception{
		SAXReader read =new SAXReader();
		Document dom=read.read("./src/xml/1.xml");
		Element root=dom.getRootElement();
		Iterator it=root.elementIterator();
		while(it.hasNext()){
			Element ele=(Element) it.next();
			System.out.println(ele.getName());
			System.out.println(ele.getText());
			//dosomething
		}
	}</span>

3.创建一个全新的XML文件

<span style="font-size:18px;">@Test
	public void createXML() throws Exception, FileNotFoundException{
		Document dom=DocumentHelper.createDocument();//自己创建一个document对象
		Element root=dom.addElement("citys");//创建的第一个节点就是root节点
		Element cityE=root.addElement("city");
		cityE.addAttribute("id", "0737");
		cityE.addElement("city1").setText("湖南");
		cityE.addElement("city2").setText("益阳");
		Element cityEE=root.addElement("city");
		cityEE.addAttribute("id", "0777");
		cityEE.addElement("city1").setText("广州");
		cityEE.addElement("city2").setText("深圳");
		
		XMLWriter wr=new XMLWriter(new FileOutputStream("./src/xml/11.xml"));
		wr.write(dom);
		wr.close();</span><span style="font-size:14px;">
	}</span>
创建的xml文件
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<citys>
	<city id="0737">
		<city1>湖南</city1><city2>益阳</city2>
	</city>
	<city id="0777">
			<city1>广州</city1><city2>深圳</city2>
	</city>
</citys>



4.存储文件的不同方式

方式一:

<span style="font-size:18px;">//存储文件  《方式一》
		XMLWriter write=new XMLWriter(new FileOutputStream("./src/xml/2.xml"));
		write.write(dom);
		write.close();*/</span>

方式

/<span style="font-size:18px;">/存储方式二,可以指定格式,字符编码</span>
<span style="font-size:18px;"><span style="white-space:pre">		</span>紧凑的格式 
		OutputFormat format=OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");//指定编码格式</span>
<span style="font-size:18px;">//		XMLWriter wr=new XMLWriter(new FileOutputStream("./src/xml/2.xml"), format);
//		XMLWriter wr=new XMLWriter(System.out, format);//输出的方式不对,直接输出到控制台
		XMLWriter wr=new XMLWriter(System.out);//输出的方式不对,直接输出到控制台,但是可以就没有解释
		wr.write(dom);
		wr.close();</span>
</pre><pre name="code" class="html"><span style="font-size:18px;">/*
<span style="white-space:pre">		</span> * 对于两种储存方式,各有好处,但是写到文件一般有的比较多,OutputFormat format=OutputFormat.createPrettyPrint();
<span style="white-space:pre">		</span> * 获得格式后,可以按指定的格式设置,当然也可以改变要写到什么位置才可以。
<span style="white-space:pre">		</span> */
</span>

5.对xml的读写,做了一个工具类

当项目中需要对xml文件操作时,可以采用这个工具。因为要实现共享,所以用到静态块。
package cn.hncu.contact.factory;

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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DomFactory {
  private static Document dom;//为了让document共享,必须要设置静态的,并且让其放在静态块里面
  private static final String  FILE_NAME = "./bin/cn/hncu/contact/xml/contact.xml";
  static{
	 try {
		SAXReader reader = new SAXReader();
		 dom = reader.read(FILE_NAME);
	} catch (DocumentException e) {
		throw new RuntimeException(e.getMessage(), e);
	}
  }
  //获取的文件
  public static Document getDocument(){
	  return dom;
  }
  //保存文件
  public static void save(){
	 XMLWriter writer = null;
	 try {
		writer = new XMLWriter( new FileOutputStream(FILE_NAME) );
		 writer.write( dom );
	} catch (IOException e) {
		throw new RuntimeException(e.getMessage(), e);
	}finally{
		if(writer!=null){
			try {
				writer.close();
			} catch (IOException e) {
				throw new RuntimeException("关流失败", e);
			}
}}
}}

你可能感兴趣的:(xml,dom4j)