使用dom4j读写XML文件

一.先说说XML。
XML:可扩展标记语言。
HTML相信很多学习编程的人都听说过,HTML就是XML的一个分支。
XML应用于web开发的许多方面,也常常用于做程序的配置文件。

语法:
1.需要在XML的最顶端写XML的处理指令。即指挥引擎如何解析XML

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

2.三个名词:document(文档),Element(元素),Attribute(属性)

3.XML只能有一个根元素。标签可扩展(即便签名可以随意起)

4.document是树状结构,Element可以包含Attribute,子元素或文本。

5.实体引用和CDATA

代码实例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- XML只能有一个根元素(例如books这个元素就是跟元素) -->
<books>
    <book id="b1" lang="中文">
        <name>
        鬼吹灯
        </name>
        <author>天下霸唱</author>
    </book>
    <book id="b2" lang="中文">
        <name>那些年追过的女孩</name>
        <author>天下霸唱</author>
    </book>
    <book id="b3" lang="中文">
        <name>乡关何处</name>
        <author>土家野夫</author>
    </book>

    <book>
        <name>围城</name>
        <author/>     <!-- 和<author></author>这个空元素作用相同 -->
    </book>

    <book>
        <!-- 对于<>&等特使符号。不能直接写到XML的文本中 ,需要替换为 !实体!
                实体
                >    &gt;
                <    &lt;
                &    &amp

                CDATA段为了书写大量的特殊符号,可以在CDATA中使用特殊符号,不需要替换为实体
        -->
        <name>小于号&lt;大于号&gt;的用法</name>
        <abstract>
            <![CDATA[
                <这里不管写什么都是文本>
                <hello>
            ]]>
        </abstract>
    </book>
</books>

二.使用dom4j对XML的读写

常用的解析XML文件的有XPath和dom4j。Xpath是通过路径表达式寻找每次 的结果,完成对整个XML的读写会比较复杂,在实际的开发中并不是特别常用,我们在这里主要介绍dom4j对XML文件读写。

先说明一下,建议大家使用maven来做这些需要导包的项目,因为包之间的依赖关系会特别复杂,使用maven会方便很多。我这里使用了阿里云的maven 服务器(因为本来的maven服务器在外网,不能用)。
这里写图片描述

建好maven项目后在maven项目下找到pom.xml的文件。

<version>0.0.1-SNAPSHOT</version>

这个元素下插入

<dependencies>
     <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
</dependencies>

一定要记着保存。当你一保存后,maven会自动到你配置的服务器上把你这里写的包以及有依赖关系的包抓取下来。

完成后,在dependencies里确认一下。
这里写图片描述

说到正题。
先来说说对XML文件的读取

/**
 * XML解析
 * 读取的内容在内存中,如果XML过大,就不建议使用dom4j
 * document:文件,文档
 * 
 * element:元素
 */
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Demo01 {
    public static void main(String[] args) throws DocumentException, IOException {
        SAXReader reader=new SAXReader();
        FileInputStream in=new FileInputStream("Demo.xml");
        //读取XML文件到doc对象
        Document doc=reader.read(in);
        //doc是全部的XML文件的内容
        //dox 应用的是内存中的对象

        System.out.println(doc.asXML());
        System.out.println("-------------");


        //获取XML的跟元素,访问XML中数据的唯一入口
        Element root=doc.getRootElement();
        System.out.println(root.asXML());
        System.out.println("-------------");

        //用名字查找返回第一个满足条件子元素
        Element e=root.element("book");
        System.out.println(e.asXML());
        System.out.println("-------------");

        //返回当前元素包含的所有子元素(List集合)
        List<Element> list=root.elements();
        for(Element E:list){
            //System.out.println(E.asXML());
            //获取标签名称
            System.out.println(E.getName());
        }
        System.out.println("-------------");

        Element n=e.element("name");
        //显示文本
        System.out.println(n.getText());
        System.out.println(n.getTextTrim());
        System.out.println("-------------");

        //获取当前元素的指定名字的属性
        Attribute attr=e.attribute("id");
        //重载方法,参数为索引
        Attribute attr1=e.attribute(1);
        System.out.println(attr.asXML());
        //读取属性名称
        System.out.println(attr1.getName());
        //读取属性值
        System.out.println(attr.getValue());

        //如果修改了doc,就能实现修改XML并写文件

        //addElement可以给当前元素增加一个子元素,返回值为增加的子元素
        Element newOne=root.addElement("book");
        newOne.addElement("name")
                .addText("18岁给我一个姑娘");
        newOne=newOne.addElement("author");
        //setText和addText的区别
        newOne.addText("冯唐");
        newOne.setText("冯唐");

        //在book标签上添加元素
        newOne.addAttribute("id", "b5");
        newOne.addAttribute("lang", "中文");

        //删除books的第二个子元素
        Element two=list.get(1);
        //!!!!注意:一定.的对象是删除元素的父元素
        root.remove(two);




        //写XML Document对象到文件中

        FileOutputStream out=new FileOutputStream("ok.xml");

        /*
         * dom4j提供了格式工具,可以输出时候对doc进行化妆,
         * 格式漂亮(pretty)一点
         */
        OutputFormat fmt=OutputFormat.createPrettyPrint();

        //XMLWriter 是dom4j提供的高级流
        //需要依赖低级流的字节流,第二个参数是格式(OutputFormat)
        XMLWriter writer =new XMLWriter(out,fmt);

        //将doc 对象(xml)写到流中

        writer.write(doc);
        System.out.print("XML写入成功");
        writer.close();

    }
}

对XML文件的写入

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
 * 创建新的XML
 * @author Analyze
 *
 */
public class Demo02 {

    public static void main(String[] args) throws IOException {
        // 创建新的XML Document对象
        Document doc=DocumentHelper.createDocument();
        System.out.println(doc.asXML());

        //为doc添加跟元素
        Element root=doc.addElement("students");
        System.out.println(doc.asXML());

        //为根元素添加子元素
        Element new1=root.addElement("student");
        new1.addElement("name").setText("Tom");;
        new1.addAttribute("id", "new1");

        root.addElement("student").addElement("name").setText("Jeep");;
        System.out.println(doc.asXML());

        //将doc写到文件
        FileOutputStream fos=new FileOutputStream("Student.xml");
        OutputFormat fmt=OutputFormat.createPrettyPrint();
        XMLWriter write=new XMLWriter(fos,fmt);

        write.write(doc);
        write.close();
    }

}

如果不懂maven项目配置的朋友可以向博主私聊,博主这里有详细的教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值