常用框架(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();
}