java dom4j 处理 xml

以前java 解析 xml 文件的时候,使用最古老sax的方法,异常的麻烦!后来接触到了dom4j 这个家伙,无聊之时尝试的去用了一下,感觉真的很好用,如果说使用sax解析xml 是相当于纯js写代码,那么dom4j 就相当于 jQuery框架这么好用。

package chenluozhi;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Attribute;
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;
import org.dom4j.tree.DefaultElement;

/**
 * dom4j 解析文档测试
 * @author 陈罗志
 * @date 2011-10-24 需要引入包:jaxen-1.1.jar、dom4j-1.6.1.jar
 * 
 */
public class SAXReaderTest {
	private static Log logger = LogFactory.getLog(SAXReaderTest.class);
	public SAXReaderTest() {
	}

	/**
	 * 读取xml文件属性以及内容(请确保xml文件为UTF-8格式)
	 * 
	 * @param file
	 */
	@SuppressWarnings("unchecked")
	public static void readXML(File file) {
		SAXReader reader = new SAXReader();

		Document document;
		try {
			//xml 文件含有中文,一定要设置编码,否则报错
			reader.setEncoding("GBK");
			document = reader.read(file);

			// 使用xpath表达式匹配节点		
			String title = document.selectSingleNode("/root/title").getText();
			String visual = document.selectSingleNode("/root/title/@visual").getText();
			
			String nodeName = document.selectSingleNode("/root/title").getName();
			System.out.println("元素名称为:"+nodeName+" 内容:"+title+" 里边的visual 属性:"+visual);
					
			// 获取 view/form节点下的所有(注意"//") dataItem 节点列表
			List<DefaultElement> dataItems = document.selectNodes("/root/form//dataItem");
			
			
			
			List<Attribute> attr_dataItems = document.selectNodes("/root/form//dataItem/@name");
			System.out.println("现在开始遍历form元素下的所有name属性");
			for(Attribute attr:attr_dataItems){		
				System.out.println("属性值为:"+attr.getValue());
			}
			
			// 循环dataItem节点组,把每一个节点的属性以及内容打印出来

//			for (int i = 0; i < dataItems.size(); i++) {
//				
//				String name = dataItems.get(i).selectSingleNode("./@name")
//						.getText();
//				
//				String label = dataItems.get(i).selectSingleNode("./@label")
//						.getText();
//				String content = dataItems.get(i).getText();
//				
//	
//				System.out.println(name);
//				System.out.println(label);
//				System.out.println(content);
//			}
			//学会习惯这种写法,除非你要准确知道目前遍历到哪个元素
			for (DefaultElement d:dataItems) {
				
				String name = d.selectSingleNode("./@name")
						.getText();
				
				String label = d.selectSingleNode("./@label")
						.getText();
				String content = d.getText();
				System.out.println(name);
				System.out.println(label);
				System.out.println(content);

			}
	
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 创建xml文件
	 * @param fileName
	 * @fileName 需建立的文件名
	 * @return 返回操作结果, false表失败, true表成功
	 */
	
	public static boolean createXML(File fileName) {
		boolean result = false;// 返回操作结果	
		Document document = DocumentHelper.createDocument();// 建立document对象
		
		Element dom4jElement = document.addElement("root"); // 建立XML文档的根books
		dom4jElement.addComment("dom4j创建xml文件测试!"); // 加入一行注释
		
		Element titleElement = dom4jElement.addElement("title"); // 加入title节点
		titleElement.setText("dom4j创建xml测试标题!");
		titleElement.addAttribute("visual","true");
		
			
		Element formElement = dom4jElement.addElement("form"); // 加入第一个form节点
		formElement.addAttribute("visual","true");//设置属性
		
		Element dataElement = formElement.addElement("dataItem");	
		dataElement.addAttribute("name", "第一个name属性名称"); // 加入name属性内容
		dataElement.addAttribute("label", "第一个label属性名称"); // 加入label属性内容
		dataElement.setText("标签一内容");
		
		Element dataElement1 = formElement.addElement("dataItem");	
		dataElement1.addAttribute("name", "第二个name属性名称"); // 加入name属性内容
		dataElement1.addAttribute("label", "第二个label属性名称"); // 加入label属性内容	
		dataElement.setText("标签二内容");	
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("UTF-8"); 
			XMLWriter writer = new XMLWriter(
					new FileWriter(fileName), format);
			writer.write(document);
			writer.close();
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 修改XML 文件
	 * @param oleFileName 输入源文件名称
	 * @param newFileName 输出文件名称
	 */
	
	public static boolean modifyXML(File oleFileName,File newFileName){
		
		boolean result = false;// 返回操作结果
		
		SAXReader reader = new SAXReader();
		reader.setEncoding("GBK");
		
		try {
			//把文件读入内存
			Document document = reader.read(oleFileName);		
			DefaultElement element = (DefaultElement) document.selectSingleNode("/root/title");
	
			element.setName("title_modifiy");
			element.addAttribute("visual", "modify");
			element.setText("content be modify!");
					
			//选择一组元素
			List<DefaultElement> elementList = document.selectNodes("/root/form//dataItem");
			
			for(DefaultElement d:elementList){
				//把这一组元素内容都修改了
				d.setText("modify content!!!");
				
			}		
			//根据属性选择特定一个元素
			DefaultElement special =  (DefaultElement)document.selectSingleNode("/root/form//dataItem[@name='第二个name属性名称']");
			special.setText("special modify!!!");
			//太诡异了,要这样删除属性的
			special.remove(special.attribute("label"));
			//删除节点,应该先处于在父节点的位置然后删除子节点!
			special.getParent().remove(special);
			
            OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter writer = new XMLWriter(
					new FileWriter(newFileName), format);
			writer.write(document);
			writer.close();
                result = true;
		
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	

	public static void main(String args[]) {
		//"."代表当前目录;"/"代表根目录;这里文件路径为:s=\D:\Workspaces\MyTest\bin
		String s= SAXReaderTest.class.getResource("/").getPath();
		File file = new File(s+"config.xml");
		File file1 = new File(s+"_config.xml");
		createXML(file);	
		readXML(file);
		modifyXML(file,file1);
	}

}


/**
 * 相关知识点
 * Node<接口> Element<接口> Attribute<接口> 后两个接口继承前边那个接口
 * dom4j api:http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/
 */

 


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值