使用dom4j操作xml文件

第一种,使用dom4j生成一个xml文件
package dom4j;

import java.io.*;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.jdom.output.XMLOutputter;

/**
 * 使用dom4j生成xml文档
 * 如果已经存在了,那新生成的将完全替换它
 * @author Administrator
 */
public class NewXml {
	// 1,使用dom4j生成一个xml文档:
	private static int createXMLFile(String fileName) {
		/** 返回操作结果, 0表失败, 1表成功 */
		int intReturn = 0;
		/*
		 * 建立document对象,
		 * 一个xml文件可以看成一个文档,
		 * 所以必须先创建一个文档
		 */
		Document document = DocumentHelper.createDocument();
		/*
		 * 建立XML 文档的根books,
		 * 对于一个xml文件有唯一的一个根元素,
		 * 在dom4j中使用Element表示
		 */
		Element booksElement = document.addElement("books");
		/*
		 * 根元素有了,
		 * 我们在根元素下面添加一行注释 
		 * 这一句不用怎么管
		 */
		booksElement.addComment("This is dom4j test.");
		/*
		 * 加入根节点books中的第一个子节点book,
		 * 即根元素的第一个子节点或者是子元素.
		 * 在这里返回添加的子节点的原因是因为子节点还有一个属性需要添加
		 */
		Element bookElement = booksElement.addElement("book");
		/*
		 * 加入show属性内容,属性使用attribute来表示
		 * 疑问,可以添加多个属性吗?就是多次调用attribute()方法
		 * 疑问解开了,能够支持多个属性下面就是例子
		 */
		bookElement.addAttribute("show", "yes");
		bookElement.addAttribute("a", "a");
		/*
		 * 加入title 节点,为第一个子节点的子节点
		 */
		Element titleElement = bookElement.addElement("title");
		/*
		 * 等一下就是这种结果
		 * <title>threw</title>
		 * 要给节点赋值时使用setText()方法
		 */
		titleElement.setText("threw");

		/* 类似的完成后两个节点 */
		/* 类似的完成后两个book */
		bookElement = booksElement.addElement("book");
		bookElement.addAttribute("show", "yes");
		bookElement.addAttribute("a", "b");
		titleElement = bookElement.addElement("title");
		titleElement.setText("Lucene Studing");
		bookElement = booksElement.addElement("book");
		bookElement.addAttribute("show", "no");
		bookElement.addAttribute("a", "c");
		titleElement = bookElement.addElement("title");
		titleElement.setText("Lucene in Action");

		/* 加入owner节点 */
		Element ownerElement = booksElement.addElement("owner");
		ownerElement.setText("O'Reilly");

		/* 将创建的document内容写入到文件中 */

		try {
			/*
			 * 美化格式,
			 * 在xml文件中生成富有层次感的节点
			 */
			OutputFormat format = OutputFormat.createPrettyPrint();
			// 缩减格式
			// format = OutputFormat.createCompactFormat();
			
			/*
			 * 生成xml写入流对象writer
			 * FileWriter:写入字符流
			 * File:文件和目录路径名的抽象表示形式
			 * format:xml文件节点格式
			 * 
			 * XMLOutputter这个类应该像Jdom中的使用一样,还没有试过
			 */
			
			XMLWriter writer = new XMLWriter(
					new FileWriter(new File(fileName)), format);
			
			/*
			 * 写入操作
			 */
			writer.write(document);
			
			/*
			 * 关闭写入流
			 */
			writer.close();

			intReturn = 1;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return intReturn;
	}
	
	public static void main(String[] age){
		NewXml.createXMLFile("C:/ming.xml");//指定路径名
	}

}


使用dom4j解析一个xml文件
package dom4j;
import java.io.File;
import java.util.Iterator;

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

/**
 * 读取XML文件的属性以及节点的值
 * @author Administrator
 *特别声明,获取子节点可以用element("节点名")
 */
public class Dom4jReader {

	/**
	 * @param args
	 * 读取XML文件
	 */
	public static void main(String[] args) {
		try{
			//创建阅读器
			SAXReader  saxReader = new SAXReader();
	        //创建document 对象
			Document  document = saxReader.read(new File("D:/ming.xml"));
			//取得根元素
			Element  books = document.getRootElement();
		
			/*
			 * 获取根节点下的第一个节点
			 * 并将它传给遍历器
			 */
			Iterator<Element> it = books.elementIterator("book");
			//开始遍历它
			while(it.hasNext()){
				//将获取到的节点传给Element对象 
				Element book = it.next();
				
				/*
				 * attribute("show")//获取属性的对象
				 * attribute("show").asXML()获取属性的文本
				 * book.attribute("show").getStringValue()可以获取到属性名为"show"这个键下的值
				 * 也可以使用 book.attributeValue("show");都是一样的
				 */
				String show = book.attribute("show").getStringValue();
				String show1 = book.attributeValue("show");
				System.out.println("获取的属性:"+show1);
				/*
				 * 使用Element的lementText("title")
				 * 可以获取在这个title标签下的文本
				 */
				String title = book.elementText("title");
				System.out.println("title为:"+title);
			}
		}catch(Exception e){
			e.printStackTrace();
		}

	}

}


使用dom4j来增加xml文件的节点

package dom4j;

import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 使用Dom4j为xml文件增加数据,也可以理解为增加节点
 * 原理跟Reader差不多
 * @author Administrator
 */
public class Dom4jAdd {

	/**
	 * @param args
	 * @throws DocumentException 
	 */
	public static void main(String[] args) throws Exception {
		
		XMLWriter writer = null;// 声明写XML的对象

		SAXReader reader = new SAXReader();// 读的对象

		OutputFormat format = OutputFormat.createPrettyPrint();// 获取输出的格式

		format.setEncoding("GBK");// 设置XML文件的编码格式

		String filePath = "d:\\ming.xml";// 路径

		File file = new File(filePath);// 文件路径的抽象表现形式
		
		/*
		 * exists():测试此抽象路径名表示的文件或目录是否存在
		 */
		if(file.exists()){
        	Document document = reader.read(file);// 读取XML文件,获取dom对象
        	
        	Element booksElement = document.getRootElement();//获取根节点 
        	
        	/*
        	 * 为根节点添加一个名为book的子节点
        	 */
        	Element bookElement = booksElement.addElement("book");
        	//下面是添加两个属性
        	bookElement.addAttribute("show","yes");
        	bookElement.addAttribute("a", "d");
        	
        	Element titleElement = bookElement.addElement("title");
        	titleElement.setText("mingxi");
        	
        	 writer = new XMLWriter(new FileWriter(filePath), format);
             writer.write(document);
             writer.close();
        	
		}

	}

}



使用dom4jl来删除xml文件的节点
package dom4j;

import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
 * 使用Dom4j删除节点
 * @author Administrator
 */
public class Dom4jDel {

	public static void main(String[] args) throws Exception {
		XMLWriter writer = null;// 声明写XML的对象

		SAXReader reader = new SAXReader();// 读的对象

		OutputFormat format = OutputFormat.createPrettyPrint();// 获取输出的格式

		format.setEncoding("GBK");// 设置XML文件的编码格式

		String filePath = "d:\\ming.xml";// 路径

		File file = new File(filePath);// 文件路径的抽象表现形式

		// exists():测试此抽象路径名表示的文件或目录是否存在
		if (file.exists()) {
			Document document = reader.read(file);// 读取XML文件,获取dom对象
        	
        	Element booksElement = document.getRootElement();//获取根节点
        	
        	Iterator<Element> i =  booksElement.elementIterator("book");
        	
        	while(i.hasNext()){
        		Element book = i.next();
        		String show =  book.attributeValue("show");
        		
        		if(show.equals("yes")){//如果是在这个节点上属性为show的值为“yes”
        			/*
        			 * 就将这个节点删掉
        			 * booksElement :父节点的对象
        			 * book:子节点的对象
        			 */
        			booksElement.remove(book);
        		}
        	}
			writer = new XMLWriter(new FileWriter(filePath), format);
            writer.write(document);
            writer.close();
		}
	}

}



使用dom4j来更改节点的内容
package dom4j;
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
 * 使用Dom4j修改节点中的内容
 * @author Administrator
 */
public class Dom4jUpdate {
	
	public static void main(String[] args) throws Exception {
		
		XMLWriter writer = null;//声明写XML的对象
		
		SAXReader reader = new SAXReader();//读的对象
		
        OutputFormat format = OutputFormat.createPrettyPrint();//获取输出的格式
        
        format.setEncoding("GBK");// 设置XML文件的编码格式

        String filePath = "d:\\ming.xml";//路径
        
        File file = new File(filePath);//文件路径的抽象表现形式
        
        //exists():测试此抽象路径名表示的文件或目录是否存在
        if(file.exists()){
        	
        	Document document = reader.read(file);// 读取XML文件,获取dom对象
        	
        	Element booksElement = document.getRootElement();//获取根节点
        	/*
        	 * 获取根节点下的子节点名为book
        	 * 然后遍历它
        	 */
        	Iterator<Element> i =  booksElement.elementIterator("book");
        	/*
        	 * 开始遍历
        	 */
        	while(i.hasNext()){
        		
        		//获取节点book节点的对象
        		Element book = i.next();
        		
        		/*
        		 * 获取属性为show的值
        		 */
        		String show =  book.attributeValue("show");
        		
        		/*
        		 * 判断此次循环到的这个book节点中的show属性值是否为yes
        		 * 
        		 * 聊天系统的建议,可以来个time属性和name属性、toName属性,
        		 * 然后在接下来的节点中可以使用标签来显示聊天信息
        		 * 总之有待讨论
        		 */
        		if(show.equals("yes")){
        			
        			/*
        			 * 通过再次遍历获取title节点
        			 * 然后重新给它赋值
        			 */
//        			Iterator<Element> i1 = book.elementIterator("title");
//        			if(i1.hasNext()){
//        				Element title = i1.next();
//        				title.setText("aaaaa");
//        			}
        			/*
        			 * 比注释掉的代码更好的
        			 */
        			Element title1 = book.element("title");
        			title1.setText("aasdasdas");
        			
        			/*
        			 * 修改节点为title中的值
        			 * 下面中的selectSingleNode方法为什么不可以用
        			 */
        			//book.selectSingleNode("title").setText("aaaaaa");
        		
        			
        		}
        	}
        	/**
			 * 重新写回去
			 */
			writer = new XMLWriter(new FileWriter(filePath), format);
            writer.write(document);
            writer.close();
        }
		
	}
	

}



以上分别是dom4j的增删查改的操作,当然啦,我相信有更好的操作方式,也希望高手们能够在看完后留下你更好的操作方式!谢谢!或E-mail 我 [email protected] 谢谢

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