【高级编程】XML DOM4J解析XML文件(含案例)

文章目录

XML(EXtensible Markup Language),可扩展标记语言。一种用于存储和传输数据的标记语言。XML 与操作系统、编程语言的开发平台无关。实现不同系统之间的数据交换。

作用:数据交互;配置应用程序和网站;Ajax基石

xml 复制代码
<!-- 声明 -->
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <!-- 文档元素描述信息(文档结构) -->
    <!-- 图书信息 -->
    <book id="bk101">
        <author>王珊</author>
        <title>.NET高级编程</title>
        <description>包含C#框架和网络编程等</description>
    </book>
    <book id="bk102">
        <author>李明明</author>
        <title>XML基础编程</title>
        <description>包含XML基础概念和基本作用</description>
    </book>
</books>

XML 文档内容由一系列标签元素组成

<元素名 属性名 = "属性值">元素内容</元素名>

  • 属性值用双引号包裹

  • 一个元素可以有多个属性

  • 属性值中不能直接包含:< " &

  • 不建议使用的字符:' >

xml 复制代码
<!-- 空元素 -->
<name> </name>
<name></name>
<name/>

XML 编写注意事项

  • 所有XML 元素都必须有结束标签

  • XML 标签对大小写敏感

  • XML 必须正确的嵌套

  • 同级标签以缩进对齐

  • 元素名称可以包含字母、数字或其他的字符

  • 元素名称不能以数字或者标点符号开始

  • 元素名称中不能含空格

属性命名空间

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<batchCompany xmlns="http://www.Aptech_edu.ac"
              xmlns:tea="http://www.tea.org">
    <batch-list>
        <batch type="thirdbatch">第三批次</batch>
        <batch tea:type="thirdbatch">第三批次</batch>
        <batch>午班批次</batch>
    </batch-list>
</batchCompany>

除非带有前缀,否则属性属于所属的元素的命名空间

DOM

文档对象模型 ( Document Object Model ) 。DOM 把 XML 文档映射成一个倒挂的树。

DOM解析包:org.w3c.dom

常用接口 常用方法 说明
Document:表示整个 XML 文档 NodeList getElementsByTagName(String Tag) 按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName) 创建指定标记名称的元素
Node:该文档树中的单个节点 NodeList getChildNodes() 获取该元素的所有子节点,返回节点集合
Element:XML 文档中的一个元素 String getTagName() 获取元素名称

DOM4J

DOM4J(Document Object Model for XML in Java)是一个简单、轻量级的Java库,用于处理XML文档。它提供了一种方式来读取、修改和写入XML文件。

在 DOM4J 中,这些类是构成XML文档的基本组成部分,它们共同构成了DOM4J的核心模型:

  • Document :代表整个XML文档 。每个 XML 文档的根元素就是 Document 对象的子对象
  • Element :代表XML文档中的元素 节点。每个 Element 都有名称,可以有子元素、文本内容及属性
  • Text 类:表示XML文档中的文本 节点。Text 节点可以包含在 Element
  • Attribute 类:代表元素上的属性 。在 <element attr="value"> 中,attr 是属性名,"value"` 是该属性的值

DOM4J 解析 XML

方法 描述 举例
SAXReader() 读取 xml 文件 // 将 xml 文件加载到内存中 XML 解析器 SAXReader saxReader = new SAXReader(); // document 加载执行 xml 文档获取 Document 对象 Document document = saxReader.read(XML路径);
getRootElement() 获取 XML 根节点 Element rootElement = document.getRootElement();
elements() 获取当前节点下所有子节点 // 获取根节点下所有子节点 List<Element> Elist = rootElement.elements();
elements("节点名") 根据指定子元素名,获取元素下所有子节点 // 获取节点名称为books下所有子节点 List<Element> Elist = rootElement.elements("books");
element("节点名") 根据指定子元素名,获取子元素对象,如果重复,则获取第一个 //获取节点名称为books下单个子节点 Element element= rootElement.element("books");
setText() 设置元素文本内容 newelement.setText("内容");
getText() 获取当前节点文本内容 element.getText()
elementText("节点名") 根据指定子元素名,获取元素中的文本 e.elementText("book")
attributeValue("属性名") 获取当前节点属性 e.attributeValue("name")
addElement("节点名") 创建节点Element对象 Element newelement = rootElement.addElement("span");
addAttribute("节点属性名","属性值") 节点添加,修改属性Element对象 newelement.addAttribute("type","属性值");
creatDocument() 新XML添加Documen对象 // 创建一个Document对象 Document read = DocumentHelper.createDocument();
createPrettyPrint() 设置XML编码 // 创建OutputFormat对象,并设置编码集 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("UTF-8");
write() 写入XML文件 //写入XML文件的位置 以及指定的格式 XMLWriter xmlWriter=new XMLWriter(new FileWriter("cs.xml"),outputFormat); //开始写入XML文件 写入Document对象 xmlWriter.write(document); xmlWriter.close();

我们有两个 XML 文件

xml 复制代码
【students.xml】
<?xml version="1.0" encoding="UTF-8"?>
<stus>
    <stu id="1001">
        <name>张三</name>
        <age>21</age>
        <score value="80"/>
    </stu>
    <stu id="1002">
        <name>李四</name>
        <age>19</age>
        <score value="92"/>
    </stu>
</stus>
xml 复制代码
【books.xml】
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <!--图书信息 -->
    <book id="bk101">
        <author>王珊</author>
        <title>.NET高级编程</title>
        <description>包含C#框架和网络编程等</description>
    </book>
    <book id="bk102">
        <author>李明明</author>
        <title>XML基础编程</title>
        <description>包含XML基础概念和基本作用</description>
    </book>
</books>

首先定义类,在 UtilsXml 类中编写公用方法

java 复制代码
public class UtilsXml {
    static Document document = null;
    // 读取文档(用于 读取 修改 删除方法)
    public static void info(String path){
        try {
            //构建解析器
            SAXReader saxReader = new SAXReader();
            //通过read方法获得doc对象
            document = saxReader.read(path);
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    } 
    // 写入文件(用于 修改 添加 删除方法)
    public static void OutputXml(String path){
        try {
            //document 写入
            XMLWriter xmlWriter = new XMLWriter(new FileWriter(path));
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

接下来分别定义读取、修改、添加、删除 XML 的静态方法

读取

java 复制代码
public static void showXml(){
    try {
        info("ch10/students.xml");
        //获得根节点
        Element root =  document.getRootElement();
        //打印根节点名称
        System.out.println("根节点:"+root.getName());
        //获得所有子节点
        List<Element> elements = root.elements();
        for(Element element : elements){
            System.out.println("---------stu--------");
            //获得每个子节点上的id属性值
            String id = element.attributeValue("id");
            System.out.println("id:"+id);
            //获得stu下name元素节点
            Element name = element.element("name");
            System.out.println("name:"+name.getText());
            Element age = element.element("age");
            System.out.println("age:"+age.getText());
            Element score = element.element("score");
            System.out.println("score:"+score.attributeValue("value"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

修改

java 复制代码
public static void editXml(){
    try {
        info("ch10/students.xml");
        //获得根节点
        Element root =  document.getRootElement();
        List<Element> elementList = root.elements();
        for(Element element:elementList){
            if("1002".equals(element.attributeValue("id"))){
                element.element("name").setText("王五");
            }
        }
        //新增节点
        Element stu = root.addElement("stu");
        stu.addAttribute("id","1003");
        stu.addElement("name").setText("马六");
        stu.addElement("age").setText("20");
        stu.addElement("score").addAttribute("value","77");

        //document 写入students.xml
        OutputXml("ch10/students.xml");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

添加

java 复制代码
public static void saveXml(){
    try {
        document = DocumentHelper.createDocument();
        // 添加 root 节点  根节点
        Element books = document.addElement("books");
        Element book1 = books.addElement("book");
        book1.addAttribute("id","bk101");
        book1.addElement("author").setText("王珊");
        book1.addElement("title").setText(".NET高级编程");

        Element book2 = books.addElement("book");
        book2.addAttribute("id","bk102");
        book2.addElement("author").setText("王明明");
        book2.addElement("title").setText("XML基础编程");

        OutputXml("ch10/books.xml");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

删除

JAVA 复制代码
public static void deleteXml(){
    try {
        info("ch10/books.xml");
        Element root =  document.getRootElement(); // 获得根节点
        List<Element> elementList = root.elements();
        for(Element element:elementList){
            Element  author = element.element("author");
            if(author.getText().equals("王明明")){
                element.getParent().remove(element);
            }
        }
        OutputXml("ch10/books.xml");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

main() 方法中依次调用上述方法

java 复制代码
public class UtilsXml {
    public static void main(String[] args) {
        //showXml(); //读取
        //editXml(); //修改
        //saveXml(); //添加
        deleteXml(); //删除
    }
}
相关推荐
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity2 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天3 小时前
java的threadlocal为何内存泄漏
java
caridle3 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^3 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花3 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端3 小时前
第六章 7.0 LinkList
java·开发语言·网络
Wx-bishekaifayuan3 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源