DOM4J解析XML文档

一、XML概述

  1. XML可扩展标记语言,类似HTML
  2. XML的设计宗旨是传输数据而非显示数据
  3. XML被设计具有自我描述性
  4. XML没有被预定义,需要自己定义标签
  5. XML不是HTML的替代,它们两个是为不同的目的设计的·
  6. XML被设计为存储和传输数据,宗旨在于传输数据
  7. HTML被设计用来显示数据,宗旨在于显示信息
  8. XML与操作系统、编程语言的开发平台无关,实现不同系统之间的数据交换
  9. 作用;(1)数据交互(2)配置应用程序和网站(3)Ajax基石

二、XML解析的四种方式

1、DOM解析

         DOM 解析 Document Object Model 文件对象模型

         DOM 接口提供了一种 通过对象模型来访问XML文件信息的方式

         优点:形成了树结构 ,有助于更好的理解 掌握 且代码容易编写解析过程中 树结构保存 在内存中,方便修改。

        缺点:由于文件一次性的读取,对内存的消耗比较大。如果XML文件比较大,容易影响解析的性能而会造成内存溢出

2、SAX解析

Simple APIS for XML 提供了一种访问模式 是一种顺序模式,是一种快速读写XML数据方式。

 当SAX分析器对XML文档进行分析时,会触发一些列事件,并激活相应的事件函数对XML文档进行访问,SAX接口也被称为事件驱动接口。

优点:采用事件驱动模式,对内存消耗比较小,适用于只处理XML文件中的数据时

缺点:编码比较麻烦,很难同时访问XML文件中多处不同的数据。

3、JDOM解析

是一个开源项目,它基于树形结构 使用纯JAVA 实现对文档的解析 生成 序列化

4、DOM4J解析

是一种智能分支,合并了许多超出基本XML文档表示的功能,使用接口和周芳基本类方法

优点:性能优异 , 灵活性好,功能强大,极端易用,是一个开放源码的文件

三、XML的语法

  1. XML文档必须有根节点
  2. 所有XML节点都必须有一个关闭标签
  3. XML标签对大小写敏感,必须正确嵌套
  4. XML属性值必须加引号
  5. 在XML中,空格会被保留
  6. XML中的注释 <!-- 内容 -->
  7. XML5个预定义的实体引用

符号

<

>

&

'

"

含义

<

>

&

‘ 

四、获取Document对象

1、读取XML文件,获得document对象

SAXReader reader = new SAXReader();
Document document = reader.read(new File(文件路径));

2、主动创建document对象

Document document = DocumentHelper.createDocument();

五、节点操作的方法

1、获取根节点

Element rootElement = document.getRootElement();

2、获取节点的子节点

Element accountName = element1.element("子节点名称");

3、获取节点的内容

element1.getText();

4、获取节点下的所有子节点

List<Element> program = element1.elements();

5、获取节点名称

element1.getName();

6、在节点下添加子节点

Element element = element1.addElement("子节点名称");

7、设置节点内容

element1.addText("内容");

8、删除节点

//通过调用element()获取子节点

//通过父节点.remove(子节点);删除节点

Element name = element1.element("name");

if (name.getText().equals("有报天天读(28/09/09) ")) {
         element.remove(element1);

}

六、节点对象的属性方法操作

1、获取节点的属性

Attribute attribute = element1.attribute("属性名");

2、获取属性的内容

String text = attribute.getText();

3、删除属性

element1.remove(attribute);

4、设置属性的内容

attribute.setText("内容");

七、将文档写入XML文件

若文档中含有中文,设置编码格式

OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");

文档写入

XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();

八、示例

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

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

public class Test3 {
    public static void main(String[] args) {
        Test3 test3 = new Test3();
        try {
            File file = new File("D:\\java\\FullChannels.xml");
            if (file.exists()){
                SAXReader reader = new SAXReader();
                Document document = reader.read(file);
                Element rootElement = document.getRootElement();
                List<Element> list = rootElement.elements();
                for (Element element:list){
                    List<Element> channel = element.elements();
                    for (Element element1:channel) {
                        if (element1.getText().equals("TypeA")){
                            System.out.println("******北京电视台******");
                            test3.typeA();
                        }else{
                            System.out.println("******凤凰卫视******");
                            test3.typeB();
                        }
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    public void typeB(){
        File file = new File("D:\\java\\凤凰卫视.xml");
        if (file.exists()){
            SAXReader reader = new SAXReader();
            try {
                Document document = reader.read(file);
                Element rootElement = document.getRootElement();
                List<Element> list1 = rootElement.elements();
                for (Element element:list1) {
                    System.out.println(element.getName());
                    List<Element> programList = element.elements();
                    for (Element element1:programList) {
                        List<Element> program = element1.elements();
                        for (Element element2:program) {
                            element2.getText();
                            element2.getName();
                            switch (element2.getName()){
                                case "playTime":
                                    System.out.println(element2.getName()+"播出时间"+element2.getText());
                                    break;
                                case "name":
                                    System.out.println(element2.getName()+"节目名称"+element2.getText());
                                    break;
                                case "path":
                                    System.out.println(element2.getName()+"节目视频的本地路径"+element2.getText());
                                    break;
                            }
                        }
                    }
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    }


    public void typeA(){
        File file = new File("D:\\java\\北京电视台.xml");
        if (file.exists()){
            SAXReader reader = new SAXReader();
            Document document = null;
            try {
                document = reader.read(file);
                Element rootElement = document.getRootElement();
                List<Element> list = rootElement.elements();
                for (Element element:list) {
                    if (element.getName().equals("channelName")){
                        System.out.println(element.getName()+"电视台名称"+element.getText());
                    }else{
                        List<Element> tvProgramTable = element.elements();
                        for (Element element1:tvProgramTable) {
                            System.out.println(element1.getName());
                            List<Element> tvProgram = element1.elements();
                            for (Element element2:tvProgram) {
                                switch (element2.getName()){
                                    case "playTime":
                                        System.out.println(element2.getName()+"节目播出时间"+element2.getText());
                                        break;
                                    case "meridien":
                                        System.out.println(element2.getName()+"时段"+element2.getText());
                                    case "programName":
                                        System.out.println(element2.getName()+"节目名称"+element2.getText());
                                        break;
                                    case "path":
                                        System.out.println(element2.getName()+"视频路径"+element2.getText());
                                }
                            }
                        }
                    }
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    }
}
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.*;
import java.util.List;

public class Test2 {
    public static void main(String[] args) {
        File file = new File("D:\\java\\凤凰卫视.xml");
        if (file.exists()) {
            SAXReader reader = new SAXReader();
            Document document = null;
            try {
                document = reader.read(file);
                Element rootElement = document.getRootElement();
                Element ProgramList = rootElement.addElement("ProgramList");
                Element Program = ProgramList.addElement("Program");
                Program.addElement("playTime").setText("2021-7-28 17:00");
                Program.addElement("name").setText("有报天天读");
                Program.addElement("path").setText("***");
                List<Element> list = rootElement.elements();
                for (Element element : list) {
                    List<Element> programList = element.elements();
                    for (Element element1 : programList) {
                        Element name = element1.element("name");
                        Element path = element1.element("path");
                        if (name.getText().equals("有报天天读(28/09/09) ")) {
                            element.remove(element1);
                        }
                        if (name.getText().equals("音乐中国风(442)  ")){
                            path.setText("C:\\音乐\\音乐中国风");
                        }
                    }
                }
                XMLWriter writer = new XMLWriter(new FileOutputStream(file));
                writer.write(document);
                writer.close();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值