常用框架(Dom4j)

原创
2016/07/27 11:47
阅读数 196

常用框架(Dom4j)

1、XML

基本的定义

xml是一种标记语言
//标准的html,html是xml的一个子集
<html>
  <head><title>标题</title></head>
  <body>
  </body>
</html>

//标准的xml,xml可以任意定义元素
<books>
  <book>
    <id></id>
    <title></title>
    <author></author>
  </book>
</books>

//不合法的xml,xml不能出现循环嵌套
<id>
  <head>
</id>
  </head>

//也是不合法的,xml必须有结束
<id><head></id>

//合法的,节点可以自结束
<id>
  <head/>
</id>

<book id="1">  //id表示的是book的属性(Attribute)--book是一个节点(Node|Element)
  <title>java编程思想</title>  //title也是一个Node,java编程思想 也是一个Node(文本节点)
</book>

使用XML可以有效的实现对象到字符串的转换

public class Book {
	private int id;
	private String title;
	private String author;
	private double price;


Book b = new Book();
b.setId(Integer.parseInt(ele.attributeValue("id")));
b.setTitle(ele.elementText("title"));
b.setAuthor(ele.elementText("author"));
b.setPrice(Double.parseDouble(ele.elementText("price")));


<book id="1">
   <title>Java编程思想</title>
   <author>Bruce Eckel</author>
   <price>69.00</price>
</book>

基于Java处理XML

dom4j-->不是j2se所自带的,需要通过网络下载这个文件包才能使用。

dom4j的安装

1、下载dom4j

对于所有的基于java的第三方工具,下载的地点只有一个选择:官方网站。

下载的选择:版本选择

xxx-1.6.0-SNAPSHOT.jar(快照版本,内部都没有经过测试的版本)

xxx-alpha.jar(表示的alpha版本,这种版本表示内部测试版)

xxx-beta.jar(内部测试已经完成,外部测试版本)

以上版本可以在学习的时候使用,但是绝对不能用于正式的项目。

xxx-release.jar(已经发布的版本)

xxx-GA.jar(完全稳定版本)

release和GA的版本是可以直接使用的版本。

2、将jar包添加到环境变量

常用的方式

1、在项目中创建一个Folder(建议的名称就是lib)

2、将dom4j中的lib中的文件和dom4j.jar拷贝到这个lib中

3、将这些文件添加到buildpath中

如果出现以下就表示添加成功

3、写一个类测试dom4j

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

public class Test01 {
	public static void main(String[] args) {
		try {
			SAXReader reader = new SAXReader();
			Document d = reader.read(new File("d:/test/test.xml"));
			System.out.println(d);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

这一步不是必须的,但是建议引入

1、按住ctrl点击某个类

2、点击Attach Source

基于Dom4j的操作

获取类路径下的文件

		File f = new File("books.xml");
		//因为在不同的包中,所以无法找到
		System.out.println(f.exists());
		/*
		 * 要获取类路径下的文件可以通过类.class.getResource("文件名")
		 */
		URL url = Test02.class.getResource("books.xml");
		//根据url获取完整的路径
		System.out.println(url.getPath());
		f = new File(url.getPath());
		System.out.println(f.exists());

对于XML文档的基本访问

		try {
			SAXReader reader = new SAXReader();
			//获取xml包中的books.xml
			Document d = reader.read(TestXML03.class
					.getResourceAsStream("xml/books.xml"));
			//获取根元素
			Element re = d.getRootElement();
			System.out.println("root:"+re.getName());
			//并不是null,而是一组空字符串
			System.out.println(re.elementText("book"));
			//获取root的所有子节点
			List<Element> eles = re.elements();
			for(Element ele:eles) {
				//System.out.println(ele.getName());
				//获取属性为id的值
				System.out.println(ele.attributeValue("id"));
				//获取某个特定子节点中的元素的文本值
				System.out.println(ele.elementText("title")+":"+ele.elementText("price"));
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}

基于XPath的访问

			SAXReader reader = new SAXReader();
			Document d = reader.read(TestXPath.class.getResource("xml/books.xml"));
			Element root = d.getRootElement();
			/**
			 * 相对路径查找,从当前节点查找子节点book
			 */
			List<Element> eles = root.selectNodes("book");
			System.out.println(eles);
			/**
			 * 使用绝对路径来查找,从根books节点查找book节点(此时不会去查找book下的子节点)
			 */
			eles = root.selectNodes("/books/book");
			System.out.println(eles.size()+":"+eles);
			/**
			 * 根节点不是book,所以无法查找
			 */
			eles = root.selectNodes("/book");
			System.out.println(eles.size()+":"+eles);
			/**
			 * 表示从文档中遍历所有满足要求的节点(从根节点开始)
			 * 不太建议使用,因为效率不高
			 */
			eles = root.selectNodes("//title");
			System.out.println(eles.size()+":"+eles);
			/**
			 * 查找了所有作者为Bruce Eckel的书
			 */
			//author:节点下的元素节点
			eles = root.selectNodes("/books/book[author='Bruce Eckel']");
			for(Element e:eles) {
				System.out.println(e.elementText("title"));
			}
			System.out.println("--------------------------------------------");
			/**
			 * 查找了属性中id大于等于2的书
			 */
			//使用@可以遍历属性节点的值
			eles = root.selectNodes("/books/book[@id>=2]");
			for(Element e:eles) {
				System.out.println(e.elementText("title"));
			}
			/**
			 * 查找名称中包含有java的price节点
			 */
			// /price得到的是price节点而不是book节点
			//contains(title,'java'):xpath的函数,第一个参数不加引号
			//因为是xml中的节点名称,第二个加引号表示是一个比较的字符串
			eles = root.selectNodes("/books/book[contains(title,'java')]/price");
			for(Element e:eles) {
				System.out.println(e.getTextTrim());
			}
			System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
			/**
			 * 查找名称中包含有java并且价格小于50的书
			 */
			eles = root.selectNodes("/books/book[contains(title,'java') and price<50]");
			for(Element e:eles) {
				System.out.println(e.elementText("title")+":"+e.elementText("price"));
			}

向xml中写数据

1、创建Document

			//写数据首先要创建一个document对象
			Document d = DocumentHelper.createDocument();

2、添加元素

			//为d添加节点,并且返回该节点
			Element root = d.addElement("users");
			//为根节点添加节点,并且返回添加的节点
			Element eu = root.addElement("user");
			//添加属性
			eu.addAttribute("id", "1");
			//添加username和password两个节点
			eu.addElement("username").addText("张三");
			eu.addElement("password").addText("123456");
			eu = root.addElement("user");
			eu.addAttribute("id", "2");
			eu.addElement("username").addText("李四");
			eu.addElement("password").addText("2222222");

3、创建XMLWriter

			//获取xml文件所在的路径
			String path = TestWrite2XML.class.getResource("xml/users.xml").getPath();
			//在学习时可以使用这种方法
			//会默认修改bin下的文件,将路径从bin替换成src
			path = path.replace("bin", "src");
			//创建XMLWriter来写数据
			out = new XMLWriter(new FileWriter(path),OutputFormat.createPrettyPrint());

4、通过XMLWriter写数据

			//将节点写到xml文档中
			out.write(d);

完整代码

		XMLWriter out = null;
		try {
			//写数据首先要创建一个document对象
			Document d = DocumentHelper.createDocument();
			//为d添加节点,并且返回该节点
			Element root = d.addElement("users");
			//为根节点添加节点,并且返回添加的节点
			Element eu = root.addElement("user");
			//添加属性
			eu.addAttribute("id", "1");
			//添加username和password两个节点
			eu.addElement("username").addText("张三");
			eu.addElement("password").addText("123456");
			eu = root.addElement("user");
			eu.addAttribute("id", "2");
			eu.addElement("username").addText("李四");
			eu.addElement("password").addText("2222222");
			//获取xml文件所在的路径
			String path = TestWrite2XML.class.getResource("xml/users.xml").getPath();
			//在学习时可以使用这种方法
			//会默认修改bin下的文件,将路径从bin替换成src
			path = path.replace("bin", "src");
			//创建XMLWriter来写数据
			out = new XMLWriter(new FileWriter(path),OutputFormat.createPrettyPrint());
			//将节点写到xml文档中
			out.write(d);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//需要关闭XMLWriter
			try {
				if(out!=null) out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部