实现crud步骤:
(1)获得解析器:
SAXReader reader = new SAXReader();
(2获得文档:
reader.read(“URL”);获得一个Document对象:
(3)获得根节点:
getRootElement(); Element:
(4)子节点:
elementIterator(“name”)
elementIterator(); //返回的类型: Iterator迭代器:
elements();List
elements(“name”); list
element(“name”); Element
(5)xml文件的回写:
XMLWriter xml = new XMLWriter("OutputStream out","OutputFormat format");
source: DOMSource 实现类:
format: 格式< 漂亮格式: < 压缩格式:
案例:
操作标签当中的属性:
属性的查询:
属性的添加:
属性的删除:
顺序的修改:
封装的 dom4j工具类:
package com.yidongxueyuan.util;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
*
* @author Mrzhang
* @version 1.0
* @see org.dom4j.Document
* @since 1.0
*
*/
public class Dom4JUtil {
private Dom4JUtil(){
}
/**
* 提供了一个方法, 获得document文档对象:
* @return document: 文档对象:
*/
public static Document getDocument(String filename){
try {
//解析器:
SAXReader reader = new SAXReader();
//获得文档:
Document document = reader.read(filename);
return document;
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
/**
*
* @param document 文档对象
* @param filename 文件路径
*/
public static void write2File(Document document, String filename){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer= new XMLWriter(new FileOutputStream(filename),format);
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后下面是用util包
封装到document而不是到根节点,是为了保证耦合度低。
package com.yidongxueyuan.dom4j;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.junit.Test;
import com.yidongxueyuan.util.Dom4JUtil;
public class AttributeOperator {
//属性节点的添加操作:
@Test
public void testAttUpdate() throws Exception {
Document document = Dom4JUtil.getDocument("src/students.xml");
//获得根:
Element root = document.getRootElement();
//标签节点:
Element studentEle =(Element) root.elements("student").get(1);
//studentEle.addAttribute("name", "张王杰");
studentEle.setAttributeValue("name", "张玉洁");
Dom4JUtil.write2File(document, "src/students.xml");
}
//属性节点的添加操作:
@Test
public void testAttAdd() throws Exception {
//获得文档:
Document document = Dom4JUtil.getDocument("src/students.xml");
//获得根:
Element root = document.getRootElement();
//标签节点:
Element studentEle =(Element) root.elements("student").get(1);
studentEle.addAttribute("name", "张玉洁");
Dom4JUtil.write2File(document, "src/students.xml");
}
//属性的查询操作: 查询所有name对应的值:
@Test
public void testAttDelete() throws Exception {
//属性的删除:
//获得文档:
Document document = Dom4JUtil.getDocument("src/students.xml");
//获得根:
Element root = document.getRootElement();
//标签节点:
Element studentEle =(Element) root.elements("student").get(1);
//属性节点:
Attribute attribute = studentEle.attribute("name");
//标签节点删除属性节点:
studentEle.remove(attribute);
//回写:
Dom4JUtil.write2File(document, "src/students.xml");
}
//属性的查询操作: 查询所有name对应的值:
@Test
public void testattFindAll() throws Exception {
//获得文档:
Document document = Dom4JUtil.getDocument("src/students.xml");
//获得根:
Element root = document.getRootElement();
Element studentEle =(Element) root.elements("student").get(1);
//对应多个属性:
List<Attribute> attributes = studentEle.attributes();
for(int i=0; i<=attributes.size()-1;i++){
Attribute attribute = attributes.get(i);
//获得属性的值:
String value = attribute.getValue();
System.out.println(value);
}
}
//属性的查询操作: 查询某个name对应的值:
@Test
public void testattFind() throws Exception {
//获得文档:
Document document = Dom4JUtil.getDocument("src/students.xml");
//获得根:
Element root = document.getRootElement();
//获得第二个学生对象: student:
Element studentEle =(Element) root.elements("student").get(1);
//调用方法,进行属性的查询操作: attribute(name);
Attribute attribute = studentEle.attribute("name");
String value = attribute.getValue();
System.out.println(value);
}
}
package com.yidongxueyuan.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.junit.Test;
import com.yidongxueyuan.util.Dom4JUtil;
public class Dom4JOperator {
//节点元素的修改操作:
@Test
public void testUpdate() throws Exception {
/*
* 1:获得根:
* 2: 获得user节点:
* 3: 获得school节点:
* 4: 修改值:
* 5:回写:
*
*/
//使用工具类获得文档:
Document document = Dom4JUtil.getDocument("src/users.xml");
//根节点:
Element root = document.getRootElement();
//获得根下的user: 第一个:
Element userEle = root.element("user");
//获得school节点“:
Element schooleEle = userEle.element("school");
//调用方法:
schooleEle.setText("北京易动优优科技有限公司");
//
Dom4JUtil.write2File(document, "src/users.xml");
}
//实现元素指定位置的添加操作: 在wangao 的 age 前加: <school>燕理</school>
@Test
public void testinsertBefore() throws Exception {
/*
* 1: 获得文档:
* 2: 获得根节点:
* 3: 获得根节点下的王ao的节点: user
* 4: 获得user下的所有的子节点: elements(); List();
* 5: 创建一个新的节点: user.addElement(); 末尾情况在末尾: 使用此方式:
* 使用工具类: DocumentHelper 能够创建一个游离的节点:
* 6: 将游离的节点放在集合指定位置当中:
* 7: 回写:
*/
//使用工具类获得文档:
Document document = Dom4JUtil.getDocument("src/users.xml");
//根节点:
Element root = document.getRootElement();
//获得根下的user: 第一个:
Element userEle = root.element("user");
//获得userEle下的所有的子节点:
List<Element> list = userEle.elements();
//创建一个新的元素: 使用工具类: DocumentHelper:
Element schoolEle = DocumentHelper.createElement("school");
schoolEle.addText("燕理");
//将创建的节点 放在集合指定的位置当中:
list.add(1,schoolEle);
//回写:
Dom4JUtil.write2File(document, "src/users.xml");
}
//实现元素节点的删除操作:
@Test
public void testDelete() throws Exception {
//使用工具类获得document文档对象:
Document document = Dom4JUtil.getDocument("src/users.xml");
//获得根节点:
Element root = document.getRootElement();// users
//4:获得根节点下要删除的节点:
Element userEle = root.element("user");//获得xml当中的第一个user对象:
List<Element> gendersEles = userEle.elements("gender");//获得了user下的所有的gender对象:
//6:父节点执行删除操作:
for(int i=0; i<gendersEles.size(); i++ ){
Element element = gendersEles.get(i);
//父节点执行删除操作:
userEle.remove(element);
}
//7:回写:
Dom4JUtil.write2File(document, "src/users.xml");
}
}
二: XPath: 表达式:
xpath的描述: 不是dom4J 提供的。 第三方组织提供:
但是dom4J 支持Xpath表达式:
1: 作用: 能够快速的定位标签
因为有时候标签的层级比较深 不好找。
2: 使用:
导入jar包:
3: xpath 表达式的编写: 表达式本质上就是一个字符串类型:
example1: /AAA/DDD/BBB 绝对路径:
example2: //DDD/BBB 后的DDD 下的所有的bbb
example3: /AAA/CCC/DDD/* *代表所有
example4: /AAA/BBB[1] [num] [last()]
example5: //BBB[@name]
example6:
String xpath =" //AAA//DDD//BBB";
4: dom4J如何支持xpath的呢?
selectNodes( "//foo/bar" ); 所有多个元素:
selectSingleNode(); //获得单个元素:
这两个方法返回值是Node
如果需要获得element,则强转即可。
如图:
//练习: 查询students 当中所有的name属性对应的值:
package com.yidongxueyuan.xpath;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.junit.Test;
import com.yidongxueyuan.util.Dom4JUtil;
public class XpathDemo {
//获得指定的name : 对应的值:
@Test
public void testname3() throws Exception {
//获得文档:
Document document = Dom4JUtil.getDocument("src/users.xml");
String xpath ="/users/user[last()]/name";
// String xpath="//name[@id='1001']";
Node node = document.selectSingleNode(xpath);
String text = node.getText();
System.out.println(text);
}
//查询user.xml当中name标签对应的值:
@Test
public void testname2() throws Exception {
//获得文档:
Document document = Dom4JUtil.getDocument("src/users.xml");
//定义一个xpath表达式:
String xpath ="//name";
List<Element> list = document.selectNodes(xpath); //student
for(int i=0; i<list.size();i++){
Element element = list.get(i);
String value = element.getText();
System.out.println(value);
}
}
//student.xml查询name标签对应的值:
@Test
public void testname() throws Exception {
//获得文档:
Document document = Dom4JUtil.getDocument("src/students.xml");
//定义一个xpath表达式:
String xpath ="//student";
List<Element> list = document.selectNodes(xpath); //student
for(int i=0; i<list.size();i++){
Element element = list.get(i);
String value = element.attributeValue("name");
System.out.println(value);
}
}
}