使用DOM4J解析XML文档

需要首先下载DOM4J工具包。这是个第三方工具包

在使用DOM4J解析的时候需要导入 DOM4J的JAR包

下载DOM4J工具包-》在MyEclipse中新建lib文件夹-》在DOM4J中导入JAR包。可以全部导入,也可以导入指定的JAR包,这里我只导入dom4j jar,.--》 右键点击dom4jjar -》 Build Path -> add to Build Path -> 看见变成奶瓶后就导入成功了

 

 

进行增删改查



文档为:


 

<?xml version="1.0" encoding="UTF-8"?>

<书架> 
  <书> 
    <书名 name="xxxxx">第一本书</书名>  
    <作者>六道01</作者>  
    <售价>100</售价> 
  </书>  
  <书> 
    <书名>第二本书</书名>  
    <作者>六道02</作者>  
    <售价>200</售价> 
  </书> 
</书架>


 


程序为:


 

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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;

//使用dom4j解析XML文档
public class Demo1
{
	// 读取XML第二本书的: <书名>第二本书</书名>
	// 读取!!
	@Test
	public void read() throws Exception
	{
		// 获得document
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/MyBook.xml"));

		// 获得根节点
		Element root = document.getRootElement();
		// 通过elements获得 素有包含书的标签的 文档,并再获得第二个标签的书 get(1);
		// 需要强转 因为通过elements获得的是list集合 里面是object 类型
		Element book = (Element) root.elements("书").get(1);
		// 获得书里面的内容
		String value = book.element("书名").getText();
		System.out.println(value);

		// 获得里面的属性的值
		// 第一本书才有属性 所以get(0)
		Element book2 = (Element) root.elements("书").get(0);
		// 获得书里面的内容
		String value2 = book2.element("书名").attribute("name").getValue();
		System.out.println(value2);

	}

	// 写入
	// 在第一本书上添加一个新的售价 :<售价> 250元 </售价>
	// 写入的时候注意编码的问题 默认使用GB2312
	@Test
	public void add() throws DocumentException, IOException,
			FileNotFoundException
	{
		// 获得document
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/MyBook.xml"));

		Element book = document.getRootElement().element("书");
		book.addElement("售价").setText("250元");

		// 格式化输入器。 createPrettyPrint创建漂亮的格式化输入器
		OutputFormat format = OutputFormat.createPrettyPrint();
		// 文档是什么类型格式化输入器就是什么类型
		format.setEncoding("UTF-8");

		// 更新XML文档 ,将内存中数据写入XML文档当中去
		// 这里用的是字节流,用字符流的话不会查码表,如果写入和输出的编码不一样则会乱码
		// 用字节流会查自己提供的码表。
		XMLWriter writer = new XMLWriter(
				new FileOutputStream("src/MyBook.xml"), format);
		// 开始写入
		writer.write(document);
		writer.close();

	}

	// 在一本书的指定的位置添加售价:<售价> 350元 </售价>  只要更改保存了所有孩子的list集合的顺序
	@Test
	public void add2() throws DocumentException, IOException,
			FileNotFoundException
	{
		// 获得document
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/MyBook.xml"));

		// 得到书的标签
		Element book = document.getRootElement().element("书");
		// 将获得的书的标签存入 list集合
		// list集合中的集合的样子是:[书名,作者,售价] 现在在售价前面添加售价
		List list = book.elements();

		// 获得售价
		Element price = DocumentHelper.createElement("售价");
		// 设置售价内容
		price.setText("350元");

		// 第二个[书名,作者,售价,售价]
		list.add(2, price);

		// 将内存中document写入xml文档
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");

		XMLWriter writer = new XMLWriter(
				new FileOutputStream("src/MyBook.xml"), format);
		// 开始写入
		writer.write(document);
		writer.close();

	}
	
	
	//删除 上面add2添加的售价节点
	@Test
	public void delete() throws DocumentException, Exception
	{
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/MyBook.xml"));
		
		//获得售价标签
		Element price = document.getRootElement().element("书").element("售价");
		//删除售价
		price.getParent().remove(price);
		
		//更新XML文档
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");

		XMLWriter writer = new XMLWriter(
				new FileOutputStream("src/MyBook.xml"), format);
		// 开始写入
		writer.write(document);
		writer.close();
	}
	
	//更新数据 改变第二本书的作者
	@Test
	public void updata() throws Exception
	{
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/MyBook.xml"));
		
		Element book = (Element) document.getRootElement().elements("书").get(1);
		book.element("作者").setText("六道03");
		
		
		//更新数据
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");

		XMLWriter writer = new XMLWriter(
				new FileOutputStream("src/MyBook.xml"), format);
		// 开始写入
		writer.write(document);
		writer.close();
	}
	
	

}


 



****************************************************************************邪恶的分割***********************************************************************************************



下面使用XPath提取XML文档 

需求:在XML文档中有用户名密码,现在编程定义用户名密码 ,测试用户名密码是否匹配,如果存在并匹配,那么打印登陆成功,如果不匹配,那么打印登陆失败。


xml文档:


 

<?xml version="1.0" encoding="UTF-8"?>
<users>
	<user id = "1" username = "aaa" password = "123" email="123@sina.com"/>
	<user id = "2" username = "bbb" password = "456" email="456@sina.com"/>
</users>


 


程序:

 

import java.io.File;

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

public class FindUsers
{
	/**
	 * 查找users.xml文档是否有和用户匹配的用户名和密码
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception
	{
		String username = "aaa";
		String password = "123";

		// 检测xml文档中是否有匹配的
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("src/users.xml"));

		// 使用XPath解析XML文档, 查找用户名和密码是否相匹配
		//注意在这里 等于用户名和密码时 用到单引号
		Node node = document.selectSingleNode("//user[@username = '" + username
				+ "' and @password = '" + password + "' ]");
		if(node==null)
		{
			System.out.println("用户名或密码错误");
		}
		else
		{
			System.out.println("恭喜登陆成功");
		}

	}

}