一脚踩进java之xml05——解析之DOM4j

一般功能:dom4j-1.6.1.jar

扩展功能:jaxen-1.1-beta-6.jar

books.xml

<?xml version="1.0" encoding="UTF-8"?>

<书架> 
  <> 
    <书名>世界未解之谜</书名>  
    <作者>项羽</作者>  
    <售价>99.8元</售价>  
    <简介>这书真好看</简介> 
  </>  
  <> 
    <书名>葵花宝典</书名>  
    <>大黄</>  
    <作者>无语</作者>  
    <售价>998两</售价>  
    <简介>欲练此功...</简介>  
    <团购价>1999两</团购价> 
  </> 
</书架>

MyDom4jUtil.java

package cn.itcast.utils;

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;

/**
 * 使用DOM4J操作XML
 * @author Administrator
 *
 */
public class MyDom4jUtil {
    
    /**
     * 通过路径获取document对象
     * @param path
     * @return
     * @throws DocumentException
     */
    public static Document getDocument(String path) throws DocumentException{
        // 获取解析器
        SAXReader reader = new SAXReader();
        return reader.read(path);
    }
    
    /**
     * 回写
     * @param document
     * @param path
     * @throws IOException 
     * @throws UnsupportedEncodingException 
     */
    public static void writeXML(Document document,String path) throws IOException{
        // 设置格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        // 创建回写的类
        XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);
        //
        writer.write(document);
        // 关闭流
        writer.close();
    }

}

Dom4jTest.java

package cn.itcast.dom4j;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
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 cn.itcast.utils.MyDom4jUtil;

/**
 * DOM4J的练习
 * @author Administrator
 *
 */
public class Dom4jTest {
    
    public static void main(String[] args) {
        try {
            run5();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 对XPATH测试
     * @throws Exception
     */
    public static void run5() throws Exception{
        String path = "src/book2.xml";
        // 解析
        Document document = MyDom4jUtil.getDocument(path);
        // 原来获取根节点
        // 如果使用XPATH不用获取根节点
        // * List selectNodes(String xpathExpression)  
        // * Node selectSingleNode(String xpathExpression) 
        
        // List<Node> authors = document.selectNodes("/书架/书/作者");
        // 无论层级关系
        /*List<Node> authors = document.selectNodes("//作者");
        for (Node author : authors) {
            System.out.println(author.getText());
        }*/
        
        // /AAA/BBB[1]
        Node author = document.selectSingleNode("/书架/书[last()]/作者");
        //author.setText("无语");
        //MyDom4jUtil.writeXML(document, path);
        //System.out.println(author.getText());
        
    }
    
    /**
     * 在指定位置添加子节点
     * 在第二本书下的作者的节点之前添加狗的节点
     * @throws Exception
     */
    public static void run4() throws Exception{
        String path = "src/book2.xml";
        // 解析
        Document document = MyDom4jUtil.getDocument(path);
        // 获取根节点
        Element root = document.getRootElement();
        // 先获取第二本书
        Element book2 = (Element) root.elements("书").get(1);
        // 获取第二本书下的所有子节点
        List<Element> list = book2.elements();
        // 创建元素
        Element dog = DocumentHelper.createElement("狗");
        // 设置狗节点的文本内容
        dog.setText("大黄");
        // 操作list集合
        list.add(1, dog);
        // 回写
        MyDom4jUtil.writeXML(document, path);
    }
    
    
    /**
     * 修改文本内容
     * @throws Exception
     */
    public static void run3() throws Exception{
        String path = "src/book2.xml";
        // 解析
        Document document = MyDom4jUtil.getDocument(path);
        // 先获取根节点
        Element root = document.getRootElement();
        // 获取第二本书
        Element book2 = (Element) root.elements("书").get(1);
        // 获取团购价
        book2.element("团购价").setText("1999两");
        // 回写
        MyDom4jUtil.writeXML(document, path);
    }
    
    /**
     * 添加子节点
     * 在第二本书添加子节点
     * @throws Exception
     */
    public static void run2() throws Exception{
        // 获取解析器对象
        SAXReader reader = new SAXReader();
        // 解析XML文档,返回Document对象
        Document document = reader.read("src/book2.xml");
        // 获取根节点(书架的节点)
        Element root = document.getRootElement();
        // 获取第二本书
        Element book2 = (Element) root.elements("书").get(1);
        // 添加子节点    addElement()
        Element tgj = book2.addElement("团购价");
        // 设置文本的内容
        tgj.setText("9两");
        
        // 设置好看的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        // 设置紧凑的格式
        // OutputFormat format = OutputFormat.createCompactFormat();
        // 设置XML文件的编码
        format.setEncoding("UTF-8");
        // 回写(XMLWriter类) 设置格式    设置编码
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
        // 把document写到ml文件中
        writer.write(document);
        // 关闭流
        writer.close();
    }
    
    /**
     * 获取作者标签的文本内容
     * @throws Exception 
     */
    public static void run1() throws Exception{
        // 获取解析器对象SAXReader(DOM4J的SAX的解析器)
        SAXReader reader = new SAXReader();
        // 解析XML的文档
        Document document = reader.read("src/book2.xml");
        // 记住1:如果想完成解析,必须先获取根节点
        Element root = document.getRootElement();
        // 记住2:DOM4J的解析必须是一层一层的解析
        // 获取书架下面的书的节点
        List<Element> books = root.elements("书");
        // 循环遍历 
        for (Element book : books) {
            // 循环一次,获取作者的标签
            Element author = book.element("作者");
            // 获取文本内容
            System.out.println(author.getText());
        }
    }

}
原文地址:https://www.cnblogs.com/smilehq/p/12611855.html