本文共 7611 字,大约阅读时间需要 25 分钟。
实现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); //对应多个属性: Listattributes = 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 前加:燕理 @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下的所有的子节点: Listlist = 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 gendersEles = userEle.elements("gender");//获得了user下的所有的gender对象: //6:父节点执行删除操作: for(int i=0; i
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"; Listlist = document.selectNodes(xpath); //student for(int i=0; i list = document.selectNodes(xpath); //student for(int i=0; i
转载地址:http://bwqen.baihongyu.com/