Dom4j解析xml

DOM4J(Document Object Model for Java)

简单易用,采用Java集合框架,并完全支持DOM、SAX和JAXP。

应用非常广泛,目前许多开源项目中大量采用DOM4J,如无特殊要求,建议考虑使用dom4j

优点:
1、大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。
2、支持XPath。
3、有很好的性能。

缺点:

1、大量使用了接口,API较为复杂。

一 创建一个工程

1.首先需要倒入相关jar  dom4j-2.0.0-RC1.jar

实现对xml进行读取

创建readXml类

package com.dom4j;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

public class ReadXml {

	/**
	 * 读取xml文件
	 * @throws Exception
	 */
	@Test  
    public void readXMLDemo() throws Exception {

        // 创建saxReader对象
        SAXReader reader = new SAXReader();
        // 通过read方法读取一个文件 转换成Document对象
        Document document = reader.read(new File("book.xml"));
        //获取根节点元素对象
        Element node = document.getRootElement();
        //遍历所有的元素节点
        listNodes(node);
        //elementMethod(node);
    }
	
	/**
	 * 遍历当前节点元素下面的所有(元素的)子节点 
    * @param node 
    */  
   public void listNodes(Element node) {  
       System.out.println("当前节点的名称::" + node.getName());
       // 获取当前节点的所有属性节点 
       List<Attribute> list = node.attributes();
       // 遍历属性节点 
       for (Attribute attr : list) {  
           System.out.println(attr.getText() + "-----" + attr.getName()  
                   + "---" + attr.getValue());  
       }

       if (!(node.getTextTrim().equals(""))) {  
           System.out.println("文本内容::::" + node.getText());  
       }

       // 当前节点下面子节点迭代器  
       Iterator<Element> it = node.elementIterator();
       // 遍历  
       while (it.hasNext()) {  
           // 获取某个子节点对象  
           Element e = it.next();  
           // 对子节点进行遍历  
           listNodes(e);  
       }  
   }  

   /** 
    * 介绍Element中的element方法和elements方法的使用 
    * @param node 
    */  
   public void elementMethod(Element node) {  
       // 获取node节点中,子节点的元素名称为bookStore的元素节点。  
       Element e = node.element("book");  
       // 获取bookStore元素节点中,子节点为book的元素节点(可以看到只能获取第一个carname元素节点)  
//       Element carname = e.element("title");
       // 获取book这个元素节点 中,所有子节点名称为title元素的节点 。  
//       List<Element> carnames = e.elements("title");
//       for (Element cname : carnames) {
//           System.out.println(cname.getText());
//       }

       // 获取book这个元素节点 所有元素的子节点。
       List<Element> elements = e.elements();

       for (Element el : elements) { 
       	System.out.println(el.getName());
           System.out.println(el.getText());  
           System.out.println("===============");
       }
   }
	
}

2.把xml数据写入到xml文件中

package com.dom4j;

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.OutputStreamWriter;  
import java.util.Iterator;  
import java.util.List;  
import org.dom4j.Attribute;  
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;  
import org.junit.Test;

public class writerXml {

	/**
	 * 数据写入到xml文件
	 * @throws Exception
	 */
    @Test
    public void createXMLDemo() throws Exception {
    	//获取Document对象
        Document document = DocumentHelper.createDocument();
        //获取xml文件的根路径
        Element root = document.addElement("bookStore");
        //通过根路径添加子元素
        Element element= root.addElement("book");
        //向book元素中添加属性与属性值
        /**
         * addAttribute 指的是当前节点的属性与方法
         * addElement  book节点下子节点的名称
         * addText  book节点下子节点的值
         */
        element.addAttribute("id","1");
        element.addElement("title").addAttribute("lang", "en").addText("《Java编程思想》");
        element.addElement("author").addAttribute("lang", "en").addText("编程语言的骄子");
        element.addElement("price").addAttribute("lang", "en").addText("200");
        
        Element element1= root.addElement("book");
        //向book元素中添加属性与属性值
        /**
         * addAttribute 指的是当前节点的属性与方法
         * addElement  book节点下子节点的名称
         * addText  book节点下子节点的值
         */
        element1.addAttribute("id","2");
        element1.addElement("title").addAttribute("lang", "en").addText("《Java编程思想》");
        element1.addElement("author").addAttribute("lang", "en").addText("编程语言的骄子");
        element1.addElement("price").addAttribute("lang", "en").addText("200");
        // 写入到一个新的文件中 
        writer(document);
    }

    /** 
     * 把document对象写入新的文件
     * @param document 
     * @throws Exception 
     */
    public void writer(Document document) throws Exception {  
	    // 紧凑的格式  
//	     OutputFormat format = OutputFormat.createCompactFormat();
	    // 排版缩进的格式  
	    OutputFormat format = OutputFormat.createPrettyPrint();
	    // 设置编码
	    format.setEncoding("UTF-8");
	    // 创建XMLWriter对象,指定了写出文件及编码格式  
	    // XMLWriter writer = new XMLWriter(new FileWriter(new  
	    // File("a.xml")),format);  
	    XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
	            new FileOutputStream(new File("book.xml")),"UTF-8"), format);
	    writer.setEscapeText(false);
	    // 写入  
	    writer.write(document);
	    // 立即写入
	    writer.flush();
	    // 关闭操作
	    writer.close();
    }

对xml文件进行修改相关节点与节点的属性

package com.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.List;

import org.dom4j.Attribute;
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;
import org.junit.Test;

public class UpdateXml {

	/**
	 * 修改属性
	 */
	@Test
	public void update() {
		try {
			// 创建saxReader对象
			SAXReader reader = new SAXReader();
			// 通过read方法读取一个文件 转换成Document对象
			Document document = reader.read(new File("book.xml"));
			// 获取根节点元素对象
			Element node = document.getRootElement();
			Attribute attributes = node.element("book").element("title").attribute("lang");
			attributes.setText("1");

			Attribute id = node.element("book").attribute("id");
			id.setText("10");
			
			//xml文件内容的样式
			OutputFormat format = OutputFormat.createPrettyPrint();
			// 创建XMLWriter对象,指定了写出文件及编码格式
			XMLWriter writer = new XMLWriter(
					new OutputStreamWriter(new FileOutputStream(new File("book.xml")), "UTF-8"), format);
			writer.write(document);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
	/**
	 * 向指定位置添加属性
	 */
	@Test
	public void addElement() {
		try {
			SAXReader reader = new SAXReader();
			Document document = reader.read("book.xml"); // 加载xml

			Element desc = DocumentHelper.createElement("desc"); // 创建新的节点
			desc.setText("新增加的属性"); // 设置节点值

			List<Element> root = document.getRootElement().elements();
			System.out.println(root.size());
			for (int i = 0; i < root.size(); i++) {
				if (i == 1) {
					List<Element> elements = root.get(1).elements();
					elements.add(0, desc);
//					elements.remove(0);
					
				}
			}
			
//			Element root = document.getRootElement();
//			List<Element> list = root.element("book").elements();
//			list.add(1, desc);
			
			// 排版缩进的格式  
		    OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
		            new FileOutputStream(new File("book.xml")),"UTF-8"), format);
		    // 写入
		    writer.write(document);
		    // 立即写入
		    writer.flush();
		    // 关闭操作
		    writer.close();
			System.out.println("添加完成");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值