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方式,是现在企 ...
 
随机推荐
- Atitti.数据操作crud js sdk dataServiceV3设计说明
			
Atitti.数据操作crud js sdk dataServiceV3设计说明 1. 增加数据1 1.1. 参数哦说明1 2. 查询数据1 2.1. 参数说明2 3. 更新数据2 3.1. 参数说明 ...
 - Atitit JAVA p2p设计与总结  JXTA 2
			
Atitit JAVA p2p设计与总结 JXTA 2 JXTA 2 是开放源代码 P2P 网络的第二个主要版本,它利用流行的.基于 Java 的参考实现作为构建基础.在设计方面进行了重要的修改,以 ...
 - thread_线程间协作:wait、notify、notifyAll和Condition
			
经典模式:生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费 ...
 - 140726暑期培训.txt
			
1. 输入多组数据的时候 while(scanf("%s",s)!=EOF) while(gets(s)!=NULL) 用gets和scanf不 ...
 - python-list.sort && lambda
			
dictionary是一个有元组组成的list,变量名有点歧义,这里是想表达 由元组组成的list哈. 之所以用dictionary是因为模拟的将字典转换成list. 将list进行排序,而根据lam ...
 - Python学习之read()方法
			
read([size [,chars [,firstline]]]) 含义: 从文本流(io.TextIOWrapper)中解码数据并返回字符串对象.
 - JS高程3:事件
			
事件是JS和HTML交互的方式. 事件流 事件流是HTML文档接收事件的顺序.分为2个流派:事件冒泡流和事件捕捉流. 事件冒泡流 由内到外 事件捕捉流 由外到内 DOM事件流 事件处理程序 跨浏览器时 ...
 - linux系统的开机引导、启动流程
			
固件(CMOS/BIOS) > POST 加电自检 ↓ 自举程序(GRUB)> 加载内核 ↓ 载入内核 > 驱动硬件 ↓ 启动进程 init ↓ 读取执行配置文件/etc/initt ...
 - 在Windows下使用nmake+Makefile+编译ZThread库(附例子)
			
----------2015/01/09/23:21更新----------------------------------- 关于保留DEBUG信息的一个简单例子,见这篇随笔 ----------2 ...
 - 您的位置:首页 » IOS » iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch
			
原文地址:http://blog.5ibc.net/p/86562.html 前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置.第二切换页面后无法使用 ...