用SAX方式解析XML(使用Dom4J工具)第二天

1、使用Dom4j开发,需下载dom4j相应的jar文件

       解压后,打开docs/guide.html>点击Quick start(快速入门),可以查看主要功能使用方法,快速了解Dom4J的使用

2、这里使用JUnit测试,需要导入Junit的Jar包,这个包在MyEclipse中自带有


<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>  
    <书 ISBN="abc">  
        <书名>Java就业培训教程</书名>  
        <作者>张孝详</作者>  
        <批发价>8元</批发价>  
        <售价>28.0元</售价>        
    </书>  
    <书 大小="猪肉">  
        <书名>JavaScript从入门到精通</书名>  
        <作者>戴振良</作者>  
        <售价>88.00元</售价>  
    </书>  
</书架>


package com.itheima.dom4j;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Assert;
import org.junit.Test;

public class Dom4JCRUD {
//	 1、得到某个具体的节点内容
//	 得到 第一本书的主体内容
	@Test
	public void test1() throws Exception {
		SAXReader reader = new SAXReader();// 得到SAX解析器
		Document document = reader.read("src/book.xml");// 得到DOM树
		Element root = document.getRootElement();// 得到根元素
		Element firstBook = root.element("书");// 得到第一个书元素
		Assert.assertEquals("王昭珽", firstBook.elementText("作者"));
	}

//	 2、遍历所有元素节点
	@Test
	public void test2() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
		treeWalk(root);
	}

	public void treeWalk(Element e) {
		System.out.println(e.getName());
		for (int i = 0, size = e.nodeCount(); i < size; i++) {
			Node n = e.node(i);
			if (n instanceof Element) {
				treeWalk((Element) n);// 递归
			}
		}
	}

//	 3、修改某个元素节点的主体内容
//	 修改第二本书的售价为55元
	@Test
	public void test3() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
//		得到第2本书并修改主体内容
		List<Element> list = root.elements();
		Element secondBook = list.get(1);
		Element price = secondBook.element("售价");
		price.setText("55.00元");
//		把DOM树写回XML文件
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();//创建美观的输出格式
		XMLWriter writer = new XMLWriter(out, format);
		writer.write(document);	//以format的格式将DOM树写到out中
	}
//	 4、向指定元素节点中增加子元素节点
//		向第一本书增加<批发价>10.00元</批发价>
	@Test
	public void test4() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
//		1、得到第一本书
		Element firstBook = root.element("书");
//		2、增加<批发价>10.00元</批发价>
		firstBook.addElement("批发价").setText("10.00元");
//		3、写回DOM树
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(document);
	}
//		5、向指定元素节点上增加同级元素节点
//		在第1本书的售价前插入<内部价>20.00元</内部价>
		@Test
	public void test5() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
//		1、获取第一本书的子元素的List
		Element firstBook = root.element("书");
		List<Element> list = firstBook.elements();
//		2、创建一个元素<内部价>20.00元</内部价>
		Element innerPrice = DocumentHelper.createElement("内部价").addText("10.00元");
//		3、在List的索引1处插入一个<内部价>20.00元</内部价>元素
		list.add(2, innerPrice);
//		4、将DOM树写回XML文件
//		为什么List不用增加到DOM树中去呢,因为List保存的只是一个引用,这些引用
//		指向的是DOM树里的元素对象
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(document);
	}
//		6、删除指定元素节点
//		删除第1本书的批发价
	@Test
	public void test06() throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
//		1、获取第一本书的售价元素  
		Element price = root.element("书").element("批发价");
//		2、用它的父元素把它移除
		price.getParent().remove(price);
//		3、将DOM树写回XML文件
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(document);
	}
//	 	7、操作XML文件属性
//		获取第一本书的ISBN属性值
	@Test
	public void test07() throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
//		1、获取第一本书
		Element book = root.element("书");
//		2、获取它的ISBN属性值
		String ISBN = book.attributeValue("ISBN");
		Assert.assertEquals("abc", ISBN);
	}
//	 8、增加XML文件属性
//	为第一本书的增加出版社属性:出版社="小马出版社"
	@Test
	public void test08() throws Exception{
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/book.xml");
		Element root = document.getRootElement();
//		1、获取第一本书
		Element book = root.element("书");
//		2、增加出版社属性
		book.addAttribute("出版社", "小马出版社");
//		3、将DOM树写回XML文档
		OutputStream out = new FileOutputStream("src/book.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(document);
	}
}

XPath
在使用XPath时,除了需要导入Dom4J包里的dom4j-1.6.1.jar包还需要改Dom4Jlib目录下的jaxen-1.1-beta-6.jar

Lib目录中的包是按需导入的。

查看XPath的帮助文档,有中文的,非常容易理解的。

想要对某个元素进行操作都必须得先得到该元素,上面例子中得到某个元素需要根据DOM树结构一层一层的去获取,很麻烦,通过XPath就能快速的得到想要的元素,DOM4J中支持XPath的方法有3个,如下:

      

 List list = document.selectNodes( "//foo/bar" );//获取多个节点

        Node node = document.selectSingleNode( "//foo/bar/author" );//获取单个节点

        String name = node.valueOf( "@name" );//获取属性值
如上面例子中第text1可改为:

//  1、得到某个具体的节点内容

//  得到 第一本书的主体内容

@Test

public void test11() throws Exception {

SAXReader reader = new SAXReader();// 得到SAX解析器

Document document = reader.read("src/book.xml");// 得到DOM树

String xpath = "//书[1]/作者";

Node author = document.selectSingleNode(xpath);

Assert.assertEquals("王昭珽", author.getText());

}


如上面例子中第text7可改为:

//   7、操作XML文件属性

// 获取第一本书的ISBN属性值

@Test

public void test071() throws Exception{

SAXReader reader = new SAXReader();

Document document = reader.read("src/book.xml");

Element root = document.getRootElement();

String xpath = "//书[1]";

Node firstBook = document.selectSingleNode(xpath);

xpath = "@ISBN";

String ISBNValue = firstBook.valueOf(xpath);

Assert.assertEquals("abc", ISBNValue);

}


选择所有属性为:ISBN="abc" 出版社="小马出版社" 的<书>元素

@Test

public void test9() throws Exception{

SAXReader reader = new SAXReader();

Document document = reader.read("src/book.xml");

Element root = document.getRootElement();

String xpath = "//书[@ISBN='abc' and @出版社='小马出版社']";

Node book = document.selectSingleNode(xpath);

Assert.assertEquals("书", book.getName());

}



原文地址:https://www.cnblogs.com/runwind/p/4454722.html