转载:Java使用dom4j解析XML

转载:Java使用dom4j解析XML原文地址:http://blog.csdn.net/yyywyr/article/details/38359049解析XML的方式有很多,本文介绍使用dom4j解析xml。1、环境准备(1)下载dom4j-1.6.1.jar(2)下载junit-4.10.jar2、温馨提示解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Documen

大家好,又见面了,我是你们的朋友全栈君。

原文地址:http://blog.csdn.net/yyywyr/article/details/38359049
解析XML的方式有很多,本文介绍使用dom4j解析xml。
1、环境准备
(1)下载dom4j-1.6.1.jar
(2)下载junit-4.10.jar
2、温馨提示
解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
(1)自己创建Document对象

Document document = DocumentHelper.createDocument();
Element root = document.addElement("students");

其中students是根节点,可以继续添加其他节点等操作。
(2)读取XML文件获取Document对象

//创建SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("XXXX.xml"));

(3)读取XML文本内容获取Document对象

String xmlStr = "<students>......</students>";
        Document document = DocumentHelper.parseText(xmlStr);

3、示例
(1)xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student1 id="001">
        <微信公众号>@残缺的孤独</微信公众号>
        <学号>20140101</学号>
        <地址>北京海淀区</地址>
        <座右铭>要么强大,要么听话</座右铭>
    </student1>
    <student2 id="002">
        <新浪微博>@残缺的孤独</新浪微博>
        <学号>20140102</学号>
        <地址>北京朝阳区</地址>
        <座右铭>在哭泣中学会坚强</座右铭>
    </student2>
</students>

(2)解析过程

package cn.com.yy.dom4j;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Dom4JforXML {

    @Test
    public void test() throws Exception{
        //创建SAXReader对象
        SAXReader reader = new SAXReader();
        //读取文件 转换成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //获取根节点元素对象
        Element root = document.getRootElement();
        //遍历
        listNodes(root);
    }

    //遍历当前节点下的所有节点
    public void listNodes(Element node){
        System.out.println("当前节点的名称:" + node.getName());
        //首先获取当前节点的所有属性节点
        List<Attribute> list = node.attributes();
        //遍历属性节点
        for(Attribute attribute : list){
            System.out.println("属性"+attribute.getName() +":" + attribute.getValue());
        }
        //如果当前节点内容不为空,则输出
        if(!(node.getTextTrim().equals(""))){
             System.out.println( node.getName() + ":" + node.getText()); 
        }
        //同时迭代当前节点下面的所有子节点
        //使用递归
        Iterator<Element> iterator = node.elementIterator();
        while(iterator.hasNext()){
            Element e = iterator.next();
            listNodes(e);
        }
    }
}

(3)解析结果

当前节点的名称:students
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独 当前节点的名称:学号 学号:20140101 当前节点的名称:地址 地址:北京海淀区 当前节点的名称:座右铭 座右铭:要么强大,要么听话 当前节点的名称:student2 属性id:002 当前节点的名称:新浪微博 新浪微博:@残缺的孤独 当前节点的名称:学号 学号:20140102 当前节点的名称:地址 地址:北京朝阳区 当前节点的名称:座右铭 座右铭:在哭泣中学会坚强 

4、dom4j操作节点属性
使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。
(1)代码示例

@Test
    public void test2()throws Exception{
        //创建SAXReader对象
        SAXReader reader = new SAXReader();
        //读取文件 转换成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //获取根节点元素对象
        Element root = document.getRootElement();

        System.out.println("-------添加属性前------");
        //获取节点student1
        Element student1Element = root.element("student1");
        //遍历
        listNodes(student1Element);
        //获取其属性
        Attribute idAttribute = student1Element.attribute("id");
        //删除其属性
        student1Element.remove(idAttribute);
        //为其添加新属性
        student1Element.addAttribute("name", "这是student1节点的新属性");
        System.out.println("-------添加属性后------");
        listNodes(student1Element);
    }

(2)结果

-------添加属性前------
当前节点的名称:student1
<span style="background-color: rgb(255, 0, 0);">属性id:001</span>
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加属性后------
当前节点的名称:student1
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性
</span></span>当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话

5、dom4j新增节点
使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。
(1)代码

//添加节点
    @Test
    public void test3()throws Exception{
        //创建SAXReader对象
        SAXReader reader = new SAXReader();
        //读取文件 转换成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //获取根节点元素对象
        Element root = document.getRootElement();
        System.out.println("-------添加节点前------");
        //获取节点student1
        Element student1Element = root.element("student1");
        //遍历
        listNodes(student1Element);
        //添加phone节点
        Element phoneElement = student1Element.addElement("phone");
        //为phone节点设置值
        phoneElement.setText("137xxxxxxxx");
        System.out.println("-------添加节点后------");
        listNodes(student1Element);
    }

(2)结果

-------添加节点前------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加节点后------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:phone
<span style="color:#ff0000;">phone:137xxxxxxxx</span>

6、把Document对象写入新的文件
有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。
(1)代码

//添加节点后,写入新的文件
    @Test
    public void test4()throws Exception{
        //创建SAXReader对象
        SAXReader reader = new SAXReader();
        //读取文件 转换成Document
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
        //获取根节点元素对象
        Element root = document.getRootElement();
        System.out.println("-------添加节点前------");
        //获取节点student1
        Element student1Element = root.element("student1");
        //遍历
        listNodes(student1Element);
        //添加phone节点
        Element phoneElement = student1Element.addElement("phone");
        //为phone节点设置值
        phoneElement.setText("137xxxxxxxx");
        System.out.println("-------添加节点后------");
        listNodes(student1Element);
        //把student1Element写入新文件
        writerDocumentToNewFile(document);
        System.out.println("---写入完毕----");
    }

    //document写入新的文件
    public void writerDocumentToNewFile(Document document)throws Exception{
        //输出格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //设置编码
        format.setEncoding("UTF-8");
        //XMLWriter 指定输出文件以及格式
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);

        //写入新文件
        writer.write(document);
        writer.flush();
        writer.close();
    }

(2)查看s1.xml文件

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

<students> 
  <student1 id="001"> 
    <微信公众号>@残缺的孤独</微信公众号>  
    <学号>20140101</学号>  
    <地址>北京海淀区</地址>  
    <座右铭>要么强大,要么听话</座右铭>  
    <phone>137xxxxxxxx</phone>
  </student1>  
  <student2 id="002"> 
    <新浪微博>@残缺的孤独</新浪微博>  
    <学号>20140102</学号>  
    <地址>北京朝阳区</地址>  
    <座右铭>在哭泣中学会坚强</座右铭> 
  </student2> 
</students>

因为涉及到中文,所以在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。
还有输出格式的问题,在此处使用的是OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:

<?xml version="1.0" encoding="UTF-8"?>
<students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152060.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nativecat15 激活码破解方法

    nativecat15 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    120
  • bt3硬盘安装_SD卡比U盘音质好

    bt3硬盘安装_SD卡比U盘音质好在U盘/SD卡上安装BT3教程(激活成功教程无线路由信号密码必备)其实网上关于BT3的教程很多,如果大家根据下面的教程安装不成功的话,可以再去百度一下其它的教程。前几天写过一个帖子是关于如何用BT3激活成功教程路由信号的(点我查看),为了引起关注,放在了Win区。在那个帖子里我是将

    2022年10月1日
    0
  • C#使用#ziplib压缩和解压缩文件

    C#使用#ziplib压缩和解压缩文件要下载整个目录,一般方法是一个个文件下载或ftp工具现在用SharpZipLib就能实现实时zip压缩下载整个目录SharpZipLib提供了多种压缩算法的支持,纯csharp代码,参见http://www.icsharpcode.net/OpenSource/SharpZipLib/default.asp原理是通过递归方法将每个文件压缩到ZipOutputStream,然

    2022年7月26日
    5
  • golang2021激活码【永久激活】[通俗易懂]

    (golang2021激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    764
  • 用友java开发待遇_【北京用友软件工资】java开发工程师待遇-看准网[通俗易懂]

    用友java开发待遇_【北京用友软件工资】java开发工程师待遇-看准网[通俗易懂]电话面试30分钟,主要刚开始问java的一些基础知识,然后开始问数据库,最后问框架。主要具体题目如下:用友技术面试题1.你能说下你使用的java集合有哪些吗?2.你能说下你在做项目中出现了哪些运行时期异常吗?3.ArrayList集合中怎样去除重复元素?4.要比较ArrayList集合中元素的大小,怎样比较?5.==和equals的区别?定义了student类,有age属性,然后a=ne…

    2022年9月24日
    0
  • 深入浅出TCP四次挥手 (多图详解)

    深入浅出TCP四次挥手 (多图详解)多图详解,深入浅出TCP四次挥手

    2022年6月2日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号