XML文件

news2024/12/29 0:13:41

xml文件

类似于html那种标签语言
但是用途却大不一样,xml一般用于小型数据传输(存储数据)
在这里插入图片描述

xml文件作用

在这里插入图片描述

xml语法规则

在这里插入图片描述
一个简单的xml文件案例
在这里插入图片描述

xml解析

解析思想

所谓的xml解析
也就是从xml文件提取数据
解析思想:前端的文档对象模型
就对应的树形模型,每个标签,文本,属性都是一个对象,最底层标签为document(代表整个xml文档)
在这里插入图片描述
在这里插入图片描述
xml解析技术
会dom4j就可
在这里插入图片描述

dom4j解析代码实现

对应要求以及步骤
在这里插入图片描述

package com.itheima.utils;

import com.itheima.pojo.Emp;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

public class xml {
    //1.先创建一个对应xml的类-Emp类
    //2.导入jar包(SpringBoot聚合了maven,直接用对应配置文件导入即可)
    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        //3.创建解析器
        SAXReader saxReader = new SAXReader();
       //4.获取document对象
        Document read = saxReader.read(new FileInputStream("/D:/Java/Java-Code/springboot-web-req-resp/target/classes/emp.xml"));
        //5.获取根节点对象
        Element rootElement = read.getRootElement();
        //6.从根节点查找其他的节点元素
        List<Element> emp = rootElement.elements("emp");

        //搞一个存储Emp对象的集合
        ArrayList<Emp> emps = new ArrayList<>();
        //7.遍历集合得到每一个员工元素
        for (Element empElement : emp) {
            //8.获取元素
            Element name = empElement.element("name");
            Element age = empElement.element("age");
            Element image = empElement.element("image");
            Element gender = empElement.element("gender");
            Element job = empElement.element("job");
            //9.通过元素获取对应的文本(信息)
            String nameText = name.getText();
            String ageText = age.getText();
            String imageText = image.getText();
            String genderText = gender.getText();
            String jobText = job.getText();
            /*
            可以直接这样,靠,超方便好吧
             //获取 name 属性
                String name = element.element("name").getText();
                //获取 age 属性
                String age = element.element("age").getText();
                //获取 image 属性
                String image = element.element("image").getText();
                //获取 gender 属性
                String gender = element.element("gender").getText();
                //获取 job 属性
                String job = element.element("job").getText();
             */
            Emp emp1 = new Emp();
            emp1.setName(nameText);
            emp1.setAge(Integer.valueOf(ageText));
            emp1.setImage(imageText);
            emp1.setGender(genderText);
            emp1.setJob(jobText);
            emps.add(emp1);
        }
        for (Emp emp1 : emps) {
            System.out.println(emp1);
        }
    }
}

运行结果
在这里插入图片描述

XML的约束文档

可以看到我们的程序是要按照xml的格式去写的
我们需要一个约束来保证xml和解析同时开发
进行一个规范的处理
在这里插入图片描述

dtd文件

对应文件后缀名是dtd
怎么用

	* 4 DTD约束开发的入门
		* 想写一个约束文档,但是必须知道去约束一个XML文件。
		*MyEclipse编写一个XML文档。
		* 第一步:先编写一个XML的文档(被约束的内容)。
			* src根目录下创建一个XML文件,操作步骤
				* src→右击→NewXML(Basic Templates)File name:book→next→Create xML file from an XML templates→next→“${encoding}”拿到的是workspace的编码集→finish
				* Design:设计模式
				* Source:源码
					<?xml version="1.0" encoding="UTF-8">	MyEclipse已经把乱码问题解决掉了,会自动修改workspace的编码
					<!DOCTYPE 书架 SYSTEM "book.dtd">
					<书架>	根节点,只能有一个
						<>		作为根节点的一个子节点,有一些属性
							<书名>陆小凤传奇</书名>
							<作者>古龙</作者>
							<售价>34.5</售价>
							<简介>这书不错啊</简介>
						</>
					</书架>

		* 第二步:编写DTD的约束文档(约束)
		* 第三步:创建一个DTD文档
			* 在src根目录下创建DTD文档,操作步骤:
				* src→右击→others→dtd(查找:MyEclipse→XML→DTD)→next→book. dtd→next→finish

			* 3.1 定义元素	
				* 语法:<!ELEMENT 元素名称 元素类型 >	XML文档中可以出现的元素
			* 3.2 判断哪些是复杂的元素,哪些是简单的元素
			* 3.3 如果是简单元素(只包含文本内容)
				* 元素类型写法:(#PCDATA)		可解析的字符数据,就是字符串
			* 3.4 如果是复杂元素(下边包含子节点)
				* 元素类型写法:(子节点1,子节点2...)	,代表是有顺序的
			* 编写book.dtd内容
				<?xml version="1.0" encoding="UTF-8"?>
				<!ELEMENT 书架 ()>
				<!ELEMENT 书 (书名,作者,售价,简介)> 只能按照这样的顺序出现这4个,且不能重复
				<!ELEMENT 书名 (#PCDATA)>	书名之间只能出现字符串,不能出现其它内容
				<!ELEMENT 作者 (#PCDATA)>
				<!ELEMENT 售价 (#PCDATA)>
				<!ELEMENT 简介 (#PCDATA)>
		* 第四步:在XML中引入DTD的约束文件。
			* 将DTD与XML文档关联的三种方式,详见ppt。
			* 4.1 引入本地的DTD的约束文件
				* 写法:<!DOCTYPE 根节点 SYSTEM "DTD文件的地址" >
				* 约束之后,出现的顺序、个数都完全的规定好了
				* 
 	* 5 DTD与XML结合在一起
	 	* DTD与XML文档关联的三种方式
		 	* 方式一:使用内部DTD
			 	* 解释:直接写在XML文件的内部,开始部分。类似于CSS
			 	* 语法:<!DOCTYPE 根节点 [DTD的代码]>
			 	* 举例
				 	<?XML version="1.0" encoding="UTF-8"?>
					<!DOCTYPE 数据 [
						<!ELEMENT 书架 ()>
						<!ELEMENT 书 (书名,作者,售价,简介)>
						<!ELEMENT 书名 (#PCDATA)>
						<!ELEMENT 作者 (#PCDATA)>
						<!ELEMENT 售价 (#PCDATA)>
						<!ELEMENT 简介 (#PCDATA)>
					]>

					<书架>
						<>
							<书名>陆小凤传奇</书名>
							<作者>古龙</作者>
							<售价>34.5</售价>
							<简介>这书不错啊</简介>
						</>
					</书架>
			* 方式二:定义外部的DTD文件,引入外部的本地的DTD文件
				* 语法:<!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
			* 方式三:引入外部的DTD文件,引入的是网络上的DTD文件
				* 语法:<!DOCTYPE 根节点 PUBLIC "DTD文件的名称" "DTD文件的地址">
				* Structs框架的配置文件就是采用DTD方式进行约束的,并且采用方式三引入的网络DTD文件。
					百度搜索 Structs2配置文件

	 		* 说明
		 		我们自己写的话,前2种是主要的,因为网络咱们也没有。学到框架的话,有可能引入的是网络的DTD,例如Struts2,引入的就是网络的DTD的文件。

dtd约束语法

	* 6 DTD的语法
		*W3Cchool.chm》→单击导航栏XML→单击左侧DTD→...
		* 元素定义
			* 写法:<!ELEMENT 元素名称 元素类型 >
			* 元素类型:
				* (#PCDATA)				:可解析的字符数据(字符串)
				* (子节点1,子节点2,...)	:当前的元素是复杂的元素,里面包含子节点1,子节点2,...
				* EMPTY					:空(没有标签主体)
				* ANY					:任意类型
				* ()					:用来给元素分组
			* 子节点之间的关系
				* 子节点与子节点出现顺序的关系
					* ,:代表子节点按着顺序出现的
					* |:子节点只能出现一个
				* 子节点出现的数量的关系
					* +:子节点可以出现1次或多次
					* *:子节点可以出现0次或多次(任意次)
					* ?:子节点可以出现0次或1* 属性定义
			* 写法1<!ATTLIST 元素名称 属性名称 属性类型 约束 >
			* 扩展 :<!ATTLIST 元素名称
							属性名 属性类型 约束
							属性名 属性类型 约束
							......
					>
				* 举例
					<?XML version="1.0" encoding="UTF-8"?>
					<!DOCTYPE 数据 [
						<!ELEMENT 书架 ()>
						<!ELEMENT 书 (书名,作者,售价,简介)>
						<!ELEMENT 书名 (#PCDATA)>
						<!ELEMENT 作者 (#PCDATA)>
						<!ELEMENT 售价 (#PCDATA)>
						<!ELEMENT 简介 (#PCDATA)>
		
						<!ATTLIST 书 
							出版社 CDATA #REQUIRED
							出版日期(2020-02-19|2020-02-20|2020-02-21) #REQUIRED
							ISBN ID #REQUIRED
							副主编 CDATA #IMPLIED	//可选的
						>
					]>

					<书架>
						<书 ISBN="b1" 出版社="xxx出版社" 出版日期="2020-02-19">
							<书名>陆小凤传奇</书名>
							<作者>古龙</作者>
							<售价>34.5</售价>
							<简介>这书不错啊</简介>
						</>
						<书 ISBN="b2" 出版社="清华大学出版社" 出版日期="2020-02-20">
							<书名>JavaEE高级开发</书名>
							<作者>班长</作者>
							<售价>99.5</售价>
							<简介>这书非常不错</简介>
						</>
					</书架>
			* 属性类型
				* CDATA			字符数据(字符串)
				* ENUMERATED	枚举	:只能从枚举列表中任选其一
					* 写法:(1|2|3)
						* 举例:(鸡肉|牛肉|羊肉|牛肉)
					* DTD中没有此关键字
				* ID			表示属性的唯一取值
					* 不能重复
					* 不能只写数字
			* 属性约束
				* #REQUIRED		属性必须要出现的
				* #IMPLIED		属性的出现是可选的
				* #FIXED		固定值
					* 写法:#FIXED "固定值"
				* 默认值			提供默认值
		

schema文件

对应的文件后缀名为xsd
这种约束比较复杂可以自己去上网查一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/682376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++实现】RPC框架的简单实现介绍

文章目录 介绍为什么使用protobufprotobuf的service rpc 框架发布方的上层使用逻辑框架的提供方逻辑Rpc调用方框架实现客户端上层框架使用重新梳理简单聊一下RpcController 引入缓冲区队列zookeeper总结 介绍 以下博客覆盖内容&#xff1a; 集群和分布式概念原理&#xff1b; …

安科瑞智能照明系统在绿色建筑中的应用与产品选型

【摘要】&#xff1a;智能照明系统应用在智能建筑中不仅能营造出舒适的生活、工作环境以及现代化的管理方式而且要具有一定的节能效果。给出了智能照明和传统照明系统的比较并分析了智能照明系统的节能。 【关键字】&#xff1a;智能建筑&#xff1b;智能照明&#xff1b;节能…

什么样的口译是好的?交传和同传的评估标准是什么?

众所周知&#xff0c;交传和同传是口译的两种高级形式&#xff0c;难度比较大&#xff0c;一般应用于国际会议、商务洽谈、重大新闻发布会等领域。那么&#xff0c;如何做好交传和同传翻译&#xff0c;什么样的口译是好的&#xff0c;交传和同传的评估标准是什么&#xff0c;北…

密码学obe软件思路

匿名通信与暗网研究综述 匿名通信系统是一种建立在Internet之上综合利用数据转发、内容加密、流量混淆等多种技术隐藏通信实体关系和内容的覆盖网络.由于匿名通信主体难以被追踪定位,匿名通信网络中各类匿名滥用问题层出不穷,而其中隐藏服务机制更是被用于构建充斥着各种非法…

Integer移位算法

常用移位算法 给定值最高位1的权重给定值最低位1的权重给定值高位连续零的个数给定值低位连续零个数 给定值最高位1的权重 也就是给定值左侧。返回给定值左侧最大的2的次幂 //获取i最高位1代表的2次幂&#xff0c;最高位1代表的权值public static int highestOneBit(int i) …

轻量化技术 | 大面积模型秒加载、TB级数据处理能力、多平台便捷展示应用...

实景三维技术的发展日新月异&#xff0c;但在应用上却一直无法深入&#xff0c;尤其是在大场景三维模型展示与应用过程中&#xff0c;不可避免地会遇到占内存、渲染慢、加载卡顿、模型塌陷等情况&#xff0c;这是由于数据格式类型多、内存占比大、模型体量大。 对此&#xff0…

C++ STL关联式容器和无序容器(哈希容器)

文章目录 5.2 C STL关联式容器5.2.1 C STL map容器5.2.2 C STL multimap容器5.2.3 C STL set容器5.2.2 C STL multiset容器 5.3 C STL无序容器&#xff08;哈希容器&#xff09; 参考 5.2 C STL关联式容器 关联式容器在存储元素值的同时&#xff0c;会为各元素额外再配备一个值…

让你不再疑惑PDF转Excel怎么操作

你是否曾经遇到过需要编辑PDF表格的情况&#xff0c;但却不知道如何进行转换&#xff1f;不用担心&#xff0c;现在有一些简单的方法可以将PDF表格转换为Excel&#xff0c;让你轻松地编辑和修改表格。如果你还不知道PDF表格转Excel怎么转的话&#xff0c;那么接下来三种实用的小…

摆脱传统模式,快速构建系统只需要7步~

摆脱传统模式&#xff0c;快速构建系统只需要7步~ 首先我们来说说用“低代码开发平台”来进行开发是一种怎样的感受&#xff1f;它可以帮助您更快、更可靠地提供价值。通过在可视化设计器中&#xff0c;以拖拽的方式快速构建应用程序&#xff0c;您可以跳过基础架构以及可能会让…

聚观早报 | TikTok首席运营官离职;AMDR7 7840HS轻薄本开始上市

今日要闻&#xff1a;TikTok首席运营官离职&#xff1b;AMDR7 7840HS轻薄本开始上市&#xff1b;美国5月AI招聘岗位增加约20%&#xff1b;荷兰传最收紧ASML对华出口限制&#xff1b;力斯SERES5完成欧洲首批交付 TikTok首席运营官离职 当地时间 6 月 22 日&#xff0c;TikTok 首…

LangChain 基于 Prompts 提示管理 构建特定领域模型

一、langChain Prompts 上篇文章对 langChain 进行了简单的介绍与使用&#xff0c;可以知道LangChain 是一个由语言模型LLMs驱动的应用程序框架&#xff0c;使用 LangChain 可以极大的降低开发成本&#xff0c;本篇文章主要基于 LangChain 中的 Prompts 提示管理实现特定领域的…

【软件设计师暴击考点】知识产权高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

Linux conda 环境迁移 服务器之间在线迁移

网上很多方法语焉不详&#xff0c;本文章主要介绍conda list方式进行Linux系统在线环境迁移&#xff0c;迁移完毕后需要手动安装缺失的python库&#xff0c;负责环境不推荐此种方式迁移。 在Linux系统之间进行单一环境迁移&#xff1a;从服务器A迁移到服务器B 服务器A&#xf…

磷酸铁锂电池应用前景广阔,英集芯响应市场推出IP2366电源管理芯片

正极材料是锂电池的核心材料之一&#xff0c;其性能直接影响锂电池的能量密度、安全性、寿命和应用等&#xff0c;占电池总材料成本中的比例超过30%。目前行业内常见的锂离子电池正极材料主要可分为磷酸铁锂&#xff08;LFP&#xff09;、三元材料&#xff08;NCM、NCA&#xf…

使用全志方案遇到glibc库版本低以及编译报错的解决方法

Glibc 包含了linux一些主要的C库&#xff0c;用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等&#xff0c;在遇到glibc库版本低编译还报错的情况时&#xff0c;遵循以下步骤解决 参考文章&#xff1a;如何编译glibc库 make工具 注意由于AW…

Flask基础及常见问题整理

一、Flask框架介绍 使用python开发后端&#xff0c;目前主流的框架就是Flask和Django。其中&#xff0c;Flask是一款轻量级的Python web框架,有以下主要特点: 1. 简单易用 Flask很简单易用&#xff0c;可以快速上手开发web应用。它只依赖Werkzeug和Jinja2两个库&#xff0c;…

Uniformer 训练心得

这是我配环境进行训练的第一个程序&#xff0c;遇到了很多问题&#xff0c;在这里总结一下 首先是配环境 按照官方代码进行配&#xff0c;我跑的是uniformer中的object detection 官方github 在这里我遇到的问题 配mmdetection时总是代码有标红错误&#xff0c;注意&#xf…

卡萨帝:领跑者的代价和陪跑者的聪明

一台设备可以卖1.2亿欧元&#xff0c;而世界上只有一家公司可以生产&#xff1b;占据市场80%份额&#xff0c;在高端光刻机领域处于垄断地位&#xff1b;看不见任何竞争对手。 看完这几个信息&#xff0c;相信有些人已经猜到是何方神圣了&#xff0c;这正是荷兰的光刻巨人ASML…

为什么单击并按住标题栏,程序运行得更快?

有时候&#xff0c;人们会发现这样一个怪异现象&#xff1a;如果在执行一项长时间运行的任务的时候&#xff0c;在标题栏按下鼠标&#xff0c;这个时候&#xff0c;会发现程序运行的更快了一些。 这件奇怪的事情通常是发生在这样一种场景&#xff1a;当程序花费太多时间更新其…

手机录屏录音不用愁,这些方法无需ROOT就能内录声音!

现在不少人喜欢用视频分享生活&#xff0c;除了外拍视频&#xff0c;或多或少也有需要内录视频的时候&#xff0c;比如录个操作步骤啊、游戏视频啊&#xff0c;或者录个网课、录首歌啥的… 之前也有不少粉丝留言问过我这个问题&#xff0c;所以今天就打算来和大家简单分享一下…