XML 解析之 dom4j 解析器
- dom4j 的使用需要导入 jar 包, 包括: dom4j-1.6.1 和 jaxen-1.1-beta- 步骤: 在项目目录下,"Folder" 创建一个 lib 文件夹
- 复制 jar 包到 lib 下面
- 右键 "build path" , 然后 "add to buildpath"
 
// 示例:
// xml 文档
<?xml version="1.0" encoding="gbk"?>
<person>
    <p1 id="102">
        <name>zhangsan</name>
        <age>20</age>
    </p1>
    <p1>
        <name>wangcai</name>
        <age>25</age>
    </p1>
</person>
// 需求一: 查询 xml 中所有 name 元素里面的值
    /*
     * 思路:
     *    1. 创建解析器
     *    2. 得到 document 对象
     *    3. 得到根节点, getRootElement
     *    4. 得到所有的 p1 标签
     *         element(qname);   // 返回标签 qname 下面的第一个符合查找的子标签
     *         elements(qname);  // 返回标签下面的属于 qname 的所有第一层子标签, 结果是 list 集合
     *         elements();  // 返回标签下面的所有一层子标签
     *
     *    5. 得到 name 元素
     *    6. 获取 name 元素里面的值, getText()
     */
     public static void main(String[] args){
        // 1. 创建解析器, 需要导入 org.dom4j.io.SAXReader 包
        SAXReader saxReader = new SAXReader();
        // 2. 获取 document 对象, 需要导入 org.dom4j.Document 包
        Document document = saxReader.read("src/person.xml");
        // 3. 获取根节点
        Element root = document.geteRootElement();
        // 4. 获取所有的 p1
        List<Element> list = root.elements("p1");
        // 5. 遍历 list 集合
        for(Element p : list){
            // element 就是每一个 p1 元素
            // 获取 p1 下面的第一个 name 元素
            Element name1 = p.element("name");
            // 得到 name 元素里面的值
            String s = name1.getText();
        }
    }
// 需求二: 在第一个 p1 标签中的末尾处添加 <sex>male</sex>
    /*
     * 思路:
     *    1. 创建解析器
     *    2. 得到 document 对象
     *    3. 得到根节点, getRootElement
     *    4. 得到第一个 p1 标签
     *    5. 在 p1 下面直接添加 p1.addElement("标签名");  返回 Element 对象
     *    6. 在 sex 标签中添加文本, sex.setText("文本内容");
     *
     *    7. 回写 xml,    org.dom4j.io 包
     *  XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("文件地址"), OutputFormat format);
     *    关于第二个参数 OutputFormat format
     *       第一种方式: OutputFormat.createPrettyPrint();  带有缩进效果的输出
     *       第二种方式: OutputFormat.createCompactFormat();  不带格式的输出
     *       第三种方式:
     *     OutputFormat format = new OutputFormat(String indent, boolean newlines);
     *                             第一个参数: 缩进方式, "\t" 或者 空格;  第二个参数: 是否换行.
     *               format.setTrimText(true);   // 清空文档原有的换行和缩进
     */
     public static void main(String[] args){
        // 1. 创建解析器,
        SAXReader saxReader = new SAXReader();
        // 2. 获取 document 对象
        Document document = saxReader.read("src/person.xml");
        // 3. 获取根节点
        Element root = document.getRootElement();
        // 4. 获取第一个 p1 标签
        Element p = root.element("p1");
        // 5. 添加 sex 标签
        Element sex2 = p.addElement("sex");
        // 6. 添加文本
        sex2.setText("male");
        // 7. 回写 xml
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/person.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();   // 关闭资源
    }
    // 需求三: 在特定的位置添加元素, 例如在第一个 p1 下面的 age 标签之前添加 <school>University</school>
        /*
         * 思路:
         *   1. 获取解析器
         *   2. 得到 document 对象
         *   3. 得到第一个 p1 标签
         *   4. 获取 p1 标签下面的所有元素: elements(); 返回值类型: List 集合
         *       使用 List 集合中的方法, add(int index, E element); 在指定位置添加元素
         *   5. 添加元素之前,需要先创建元素
         *        Element school = DocumentHelper.creatElement("school");
         *   6. 在元素中添加文本: school.setText("University");
         *   7. 回写 xml
         */
// 升级版, 将获取 document 对象 和 回写 xml 的代码封装成方法
    class Dom4jUtils{
        // 获取 document 对象
        public static Document getDocument(String path){
            try{
                SAXReader saxReader = new SAXReader();
                Document document = saxReader.read(path);
                return document;
            } catch (Exception e){
                    e.printStackTrace();
            }
            return null;
        }
        // 回写 xml 操作
        public static void myXmlWriter(Document document, String path){
            try{
                OutputFormat format = OutputFormat.createPrettyPrint();
                XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path); format);
                xmlWriter.write(document);
                xmlWriter.close();
            } catch (Exception e){
                    e.printStackTrace();
            }
        }
    }
    // 需求四: 修改 (需要回写 xml)
            // 将 p1 标签下面的 age 标签中的内容修改为 30
            /*
             * 思路: 使用 setText("30"); 方法
             */
    // 需求五: 删除 (需要回写 xml)
            // 将第一个 p1 标签下面的 school 标签删除
            /*
             * 思路:
             *    1. 获取第一个 p1 标签
             *              root.element("p1");
             *    2. 获取 p1 标签下面的 school 标签
             *              Element school2 = p1.element("school");
             *    3. 使用父节点, 删除 school 标签
             *              p1.remove(school2);
             */
    // 需求六: 获取属性值
            // 获取第一个 p1 里面的属性 id 的值
            /*
             * 思路:
             *    p1.attributeValue("属性名"); // 返回值: 属性对应的值
             */
dom4j 解析器使用 XPath 语言操作 xml 文档
- 导入支持 xpath 的 jar 包, jaxen-1.1-beta-6.jar
- dom4j 里面提供了两个方法, 用来支持 XPath
- selectNodes("XPath 表达式"); 表示获取多个节点
- SelectSingleNode("Xpath 表达式"); 表示获取单个节点
 
// 示例:
// xml 文档
<?xml version="1.0" encodint="gbk"?>
<bookstore>
    <book>
        <title lang="eng">Harry Potter</title>
        <price>30</price>
    </book>
    <book>
        <title lang="cn">Learning XML</title>
        <price>26</price>
    </book>
</bookstore>
    // 需求一: 查询
            // 查询 xml 文档中所有 title 元素的值
            /*
             * 思路:
             *    1. 获取 document 对象
             *    2. 直接使用 document.selectNodes("//title"); 返回 List<Node> 集合
             */
             public static void main(String[] args){
                Document document = Dom4jUtils.getDocument("src/bookstore.xml");
                // 此处 Node 对象, 需要导入 org.dom4j.Node 包
                List<Node> list = document.selectNodes("//title");
                // 遍历 list 集合
                for(Node node : list){
                    // 获取 title 元素里面的值
                    String s = node.getText();
                    System.out.println(s);
                }
            }
**参考资料:**
- [JavaWeb 视频教程](https://www.bilibili.com/video/av12750191/#page=6)
- [dom4j API 文档](http://tool.oschina.net/apidocs/apidoc?api=dom4j1.6.1%2Fapidocs)
- [dom4j jar包下载](https://dom4j.github.io/)
- [XPath jar包下载](http://mvnrepository.com/artifact/jaxen/jaxen/1.1-beta-6)
- [W3School XPath 教程](http://www.w3school.com.cn/xpath/xpath_syntax.asp)
XML 解析之 dom4j 解析器的更多相关文章
- XML技术之DOM4J解析器
		由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ... 
- XML文件解析之DOM4J解析
		1.DOM4J介绍 dom4j的官网是http://www.dom4j.org/dom4j-1.6.1/,最新的版本是1.6.1,根据官网介绍可知.dom4j是一个易用的.开源的库,应用于Java平台 ... 
- DOM综合案例、SAX解析、StAX解析、DOM4J解析
		今日大纲 1.DOM技术对xml的增删操作 2.使用DOM技术完成联系人管理 3.SAX和StAX解析 4.DOM4J解析 5.XPATH介绍 1.DOM的增删操作 1.1.DOM的增加操作 /* * ... 
- Java---XML的解析(2)-DOM4J解析/Xpath
		Dom4j: Dom SUN dom在加载时,将所有元素全部加载内存 DOM4j - 第三方. Dom4j是一个开源.灵活的XML API. 目前很多开源框架如struts,hibernate都使用d ... 
- XML文件解析之DOM解析
		XML文件是一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.基本的解析方式包括DOM解析和SAX解析,具体来说包括DOM解析,SAX解析,DOM4J解 ... 
- dom4j解析器sax解析xml文件
		1.使用dom4j解析器解析xml ***解析器dom4j是由dom4j组织提供的,针对xml进行解析.dom4j不是Javase的一部分,使用时需要导入dom4j的jar包(官网下载) 在eclip ... 
- xml之dom4j解析
		* 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ... 
- 使用dom4j解析XML文档
		dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ... 
- javaweb学习总结十三(dom4j方式对XML文档进行解析以及Xpath的使用)
		一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企 ... 
随机推荐
- 报错"the microsoft.jet.oledb.4.0 provider is not registered on the local machine"解决方案
			报错提示:"the microsoft.jet.oledb.4.0 provider is not registered on the local machine" 错误起因:wi ... 
- NFC Basics(基本NFC)——翻译自developer.android.com
			NFC Basics 关于收发NDEF格式的消息,以及相关的api. 非NDEFdata以及其它更深入技术请參见Advanced NFC. 在android端使用NDEF有两种情况: - 从标签读取N ... 
- FPGA的图像处理技术
			最近一段时间一直在研究基于FPGA的图像处理,乘着EEPW这个机会和大家交流一下,自己也顺便总结一下.主要是为了大家对用FPGA做图像处理有个感性的认识,如果真要研究的话就得更加深入学习了.本人水平有 ... 
- redis命令_INCR
			INCR key 将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. 如果值包含错误的类型,或字符串类型的值不能表示为数字,那 ... 
- datatables 相关文章
			http://blog.csdn.net/zhu_xiao_yuan/article/details/51252300 datatables参数配置详解 http://blog.csdn.net/j ... 
- 关于MBR、GPT以及BIOS引导模式区分
			关于MBR.GPT.ESP.MSR.EFI.UEFI和WIN8中SECURE BOOT的基础知识: 1.MBR分区表:Master Boot Record,即硬盘主引导记录分区表,只支持容量在 2.1 ... 
- nginx+keepalived构建高可用服务
			1.整体环境规划 虚拟IP:10.0.4.248 主Nginx:10.0.4.249 备用Nginx:10.0.4.250 2.keepalived安装 #cd /usr/local/src #wge ... 
- Unity3D避免代码被反编译
			1.Unity编译后最终会将代码编译在dll里面,无论是ios还是Android解开包以后都可以拿到dll,路径在Data/Managed/Assembly-CSharp.dll 2.IOS其实不用做 ... 
- Enable Authentication on MongoDB
			1.Connect to the server using the mongo shell mongo mongodb://localhost:27017 2.Create the user admi ... 
- 【vijos】1892 树上的最大匹配(树形dp+计数)
			https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ... 
