dom4j解析XML文档




<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>

<书架> 
  <书> 
    <书名>java就业培训教程</书名>  
    <作者>郝斌</作者>  
    <售价>36.2元</售价> 
  </书>  
  <书> 
    <书名 name="xxx">javascript就业培训教程</书名>  
    <作者>哈哈哈</作者>  
    <售价>36.2元</售价> 
  </书> 
</书架>
</span>



<span style="font-size:14px;">package com.rj.dom4j;

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

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.junit.Test;

public class Demo1 {

	//读取xml文档第二本书   <书名>javascript就业培训教程</书名> 中的内容
	@Test
	public void read() throws DocumentException{
		
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/book.xml"));
		
		Element root = document.getRootElement();//获取根节点
		List elements = root.elements("书");//获取所有的书
		Element book = (Element) elements.get(1);//获取第二本书
		//Element book =  (Element)root.elements("书").get(1)
		Element bookname = book.element("书名");//获取第二本书的书名这个元素
		String content = bookname.getText();//获取书名的内容
		//String content = book.element("书名").getText();
		System.out.println(content); 
	}
	
	//得到xml文档第二本书     <书名 name="xxx">javascript就业培训教程</书名> 中的属性name="xxx"
	@Test
	public void readAttr() throws DocumentException{
		
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/book.xml"));
		
		Element root = document.getRootElement();//获取根节点
		List elements = root.elements("书");//获取所有的书
		Element book = (Element) elements.get(1);//获取第二本书
		//Element book =  (Element)root.elements("书").get(1)
		Element bookname = book.element("书名");//获取第二本书的书名这个元素
		String value = bookname.attributeValue("name");//获取书名的属性
		
		/*
		 	 * 或者 String value = bookname.attribute("name").getValue();
		 	 * 
		 	 * */
		System.out.println(value); 
		
	}
	
	//在第一本上添加一个新的价格  <售价>123元</售价>
	@Test
	public void add() throws DocumentException, IOException{
			SAXReader reader = new SAXReader();
			Document document = reader.read(new File("src/book.xml"));
			
			Element root = document.getRootElement();
			Element book = (Element) root.elements().get(0);
			book.addElement("售价").setText("123元");
	
			
			//格式化输出器
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("gb2312");
			
			
			//字符处理
			XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),"gb2312"),format);
			
			//XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"));
			//XMLWriter构造函数交给FileWriter构造函数处理,这个io流默认是GB2312编码,与book.xml的编码不一致,导致乱码
			//需要找一个流,能指定编码的流
			writer.write(document);//document是utf-8你按照gb2312写出去会乱码,在不用格式化输出器的前提,你用了格式化输出器可以指定document的编码
			writer.close();
	}
	
	//在第一本上添加一个新的价格  <售价>123元</售价>
	@Test
	public void add1() throws DocumentException, IOException{
			SAXReader reader = new SAXReader();
			Document document = reader.read(new File("src/book.xml"));
			
			Element root = document.getRootElement();
			Element book = (Element) root.elements().get(0);
			book.addElement("售价").setText("123元");
	
			
			//格式化输出器
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			
			
			//字节处理
			XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
			
			//XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"));
			//XMLWriter构造函数交给FileWriter构造函数处理,这个io流默认是GB2312编码,与book.xml的编码不一致,导致乱码
			//需要找一个流,能指定编码的流
			writer.write(document);//document是utf-8你按照gb2312写出去会乱码,在不用格式化输出器的前提,你用了格式化输出器可以指定document的编码
			writer.close();
			
			//查格式化输出器的格式
	}
	
	//在指定位置插入:第二本书售价的前面  <售价>123元</售价>
		@Test
		public void add2() throws DocumentException, IOException{
			
			SAXReader reader = new SAXReader();
			Document document = reader.read(new File("src/book.xml"));
		
			//获取第二本书
			List books = document.getRootElement().elements("书");//获取根节点下面的所有的书
			Element book = (Element) books.get(1);//获取第二本书
			List list = book.elements();//获取第二本书的所有孩子
		
			Element price = DocumentHelper.createElement("售价");//创建一个节点
			price.setText("309元");
			list.add(2, price);//在第二本书的售价前面添加一个售价


			//格式化处理器
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			
			//跟新到内存 
			XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
			writer.write(document); 
			writer.close();
		}
		
		
		//在指定位置删除:第二本删除  <售价>123元</售价>
	/*	 <书> 
		    <书名 name="xxx">javascript就业培训教程</书名>  
		    <作者>张孝祥</作者>
		      <售价>78.2元</售价>
		    <售价>36.2元</售价> 
		  </书> 
		  */
		@Test
		public void delete() throws DocumentException, IOException{
			
			SAXReader reader = new SAXReader();
			Document document = reader.read(new File("src/book.xml"));
			
			Element book = (Element) document.getRootElement().elements("书").get(1);
			 List list = book.elements("售价");
			Element price = (Element) list.get(0);
			price.getParent().remove(price);
			
			//格式化处理器
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			
			//跟新到内存 
			XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
			writer.write(document); 
			writer.close();
		}
		
		
		
		
		/*
		 *    第二本书的作者的
		 * <书> 
		 *  <书名 name="xxx">javascript就业培训教程</书名>  
		    <作者>哈哈哈</作者>  
		    <售价>36.2元</售价> 
		  </书> 
		 */
		   
		@Test
		public void update() throws DocumentException, IOException{
			SAXReader reader = new SAXReader();
			Document document = reader.read(new File("src/book.xml"));
			
			Element book = (Element) document.getRootElement().elements("书").get(1);//获取第二本书
			book.element("作者").setText("哈哈哈");//获取作者,进行更新
			
			//格式化处理器
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			
			//跟新到内存 
			XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
			writer.write(document); 
			writer.close();
			
		}
	
}
</span>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值