第十章:XML

本文详细介绍了XML的基本概念,包括其作用、文档结构、标签、属性和编写注意事项。接着,讨论了XML解析器,重点讲解了DOM4j解析XML的增、删、改、查操作,并给出了具体代码示例。DOM4j是一个高性能、易用的Java XML API,常用于XML文档的CRUD操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第十章:XML

一,XML简介

​ XML : XML(EXtensible Markup Language)可扩展标记语言

xml的主要作用有:

1、用来保存数据,而且这些数据具有自我描述性
2、它还可以作为项目或者模块的配置文件(javaweb的web.xml)
3、还可以用来做网络传输数据的格式(现在用不多了,都是JSON为主)

特点:

  • XML与操作系统、编程语言的开发平台无关

  • 实现不同系统之间的数据交换

作用:

  • 数据交互
    • 配置应用程序和网站
    • Ajax基石
XML文档结构

在这里插入图片描述

​ 注意: XML声明是可选的,因此你的xml没有它就可以很好地形成。但建议使用它,以便解析器不会做出错误的假设,特别是关于所使用的编码。

XML标签

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

语法:

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

示例:

NoKris 或者

注意:

  • 属性值用双引号包裹
  • 一个元素可以有多个属性
  • 属性值中不能直接包含<、“、&
  • 不建议使用的字符:‘、>

要使用特殊字符时可以用转义字符:&amp(&),&lt(<),&gt(>) 等;

XML属性

​ xml属性和html一样,都要有属性名=“属性值”,并且都要在标签内部。这就不再过多的讲解。

XML编写注意事项
  • XML 文档必须有切仅有一个根元素。
  • 所有XML元素都必须有结束标签
  • XML标签对大小写敏感
  • XML必须正确的嵌套
  • 同级标签以缩进对齐
  • 元素名称可以包含字母、数字或其他的字符
  • 元素名称不能以数字或者标点符号开始
  • 元素名称中不能含空格

!!!错误示例:<title><name>XML编程</title></name>

!!!错误原因:XML标签嵌套错误。

二,XML解析器

​ 上面我们提到了,xml是可以跨平台,无视操作系统交换数据的,那么我们java在拿到其他平台的xml文件,该如何解析呢?

解析器类型:

  • 非验证解析器

    检查文档格式是否良好

  • 验证解析器

    使用DTD检查文档的有效性

    DTD(Document Type Definition),文档类型定义,用来约束XML文档。例如要求xml文档的根元素必须是什么,在元素下可以包含多少个元素,每个元素必须有一个什么属性,而且还可以定义有多少个子元素,分别为...,子元素的内容必须为文本内容等

解析XML技术
  • DOM
    基于XML文档树结构的解析
    适用于多次访问的XML文档
    特点:比较消耗资源
  • SAX
    基于事件的解析
    适用于大数据量的XML文档
    特点:占用资源少,内存消耗小
  • DOM4J
    非常优秀的Java XML API
    性能优异、功能强大
    开放源代码

我们今天重点讲的是DOM4j。

三,DOM4j

​ 我们用DOM4j解析XML代码不过是对XML的CRUD(增删改查),想用DOM4j,我们需要导入dom4j的jar包,jar包可以自己搜着下载,我们只用maven导入,简单快捷。

maven:

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

增:

​ 直接上代码,再分析怎么使用。

public static void main(String[] args) throws IOException {
        Document document = DocumentHelper.createDocument();
        Element e1 = document.addElement("aaa");
        Element a = e1.addAttribute("a", "123");
        a.setText("1234112");
        OutputFormat outputFormat= OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("UTF-8");
        XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);
        xmlWriter.write(document);
        xmlWriter.close();
    }

第一步:

  • 使用DocumentHelper.createDocument()方法创建一个Document对象

这个document不是文件,而是一个Document类的java对象,理解成他可以存储XML结构的文本就可以。

第二步:

  • 使用addElement()方法添加元素,要注意只有一个根元素。方法的返回值是添加的这个Element元素对象。

第三步:

  • 使用Element对象名.addAttribute(name,value)方法添加该对象的属性和属性值,返回的是该对象,这个方法一般不用返回值。

第四步:

  • 使用Element对象名.setText(String)设置标签的内容,也就是两个标签之间的文本。(<aaa a="123">1234112</aaa>中的1234112就是setText操作区域)

第五步:

  • 套公式写入文件中:
OutputFormat outputFormat= OutputFormat.createPrettyPrint();//通过OutputFormat静态方法得到输出格式对象
outputFormat.setEncoding("UTF-8");//设置文件编号为UTF-8
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);//得到XML字符流并设置格式
xmlWriter.write(document);//把document写入文件。
xmlWriter.close();//关闭流,释放资源

​ 上面的是固定套用,记住即可,也可以自己封装成工具类使用。

删:

​ 先说一下流程,删的过程和增加差不多,只是我们不用新创建一个document,而是从XML文件中读取出来一个document,然后进行完删除操作后,还是套用上面的写文件公式,写入文件,等于我们修改读取出来的document,修改后再写入覆盖掉原本的文件内容。

第一步:

  • 读取XML文件的到Document对象
SAXReader saxReader = new SAXReader();//创建SAX读取器
Document document = saxReader.read("./src/main/resources/Books.xml");//读取该路径下的XML文件,返回一个Document对象,这里要抛异常。

第二步:

  • 进行修改: 和增加一样,我们要得到想要删除的节点。
 Element rootElement = document.getRootElement();//获得根元素
 List<Element> bookse = rootElement.elements();//获得根元素的子元素
    for (Element e : bookse) {
			if(e.getName().equals("想要找的标签名")){
                e.getParent().remove(e);
            }
            System.out.print(e.getName()+"  ");
    }

​ 获得根元素的方法就是getRootElement()返回根元素。

当我们通过以上方式找到想要删除的节点时,我们进行第三步。

第三步:

  • 删除操作:
e.getParent().remove(e);//通过getParent()方法得到父元素,然后调用remove()方法删除子元素。

注意:我们找到的元素e没办法自己删除自己,所以要通过父元素删除元素e。

第四步:

  • 写入XML文件,和增加一样,套用公式即可。
OutputFormat outputFormat= OutputFormat.createPrettyPrint();//通过OutputFormat静态方法得到输出格式对象
outputFormat.setEncoding("UTF-8");//设置文件编号为UTF-8
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);//得到XML字符流并设置格式
xmlWriter.write(document);//把document写入文件。
xmlWriter.close();//关闭流,释放资源
改:

​ 改和删几乎一致。

第一步:

  • 读取XML文件的到Document对象
SAXReader saxReader = new SAXReader();//创建SAX读取器
Document document = saxReader.read("./src/main/resources/Books.xml");//读取该路径下的XML文件,返回一个Document对象,这里要抛异常。

第二步:

  • 进行修改: 可以进行添加或者删除操作
 Element rootElement = document.getRootElement();//获得根元素
 List<Element> bookse = rootElement.elements();//获得根元素的子元素
    for (Element e : bookse) {
			if(e.getName().equals("想要找的标签名")){
                e.addElement("要添加的标签名");
               // e.getParent().remove(e);
            }
            System.out.print(e.getName()+"  ");
    }

修改相关方法:

  • addAttribute() : 添加属性
  • setText() :设置文本内容
  • addElement() : 添加元素(标签)
  • remove() ; 删除元素

第三步:

  • 写入XML文件,和增加一样,套用公式即可。
OutputFormat outputFormat= OutputFormat.createPrettyPrint();//通过OutputFormat静态方法得到输出格式对象
outputFormat.setEncoding("UTF-8");//设置文件编号为UTF-8
XMLWriter xmlWriter = new XMLWriter(new FileWriter("aaa.xml"),outputFormat);//得到XML字符流并设置格式
xmlWriter.write(document);//把document写入文件。
xmlWriter.close();//关闭流,释放资源
查:

​ 查询的想必就不用赘述了,我们在进行增删改的时候都是在遍历XML文档,我们只需要把想要的信息用if判断筛选出来,再用 System.out.print();输出就可以了。

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值