XML文件

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(查找:MyEclipseXMLDTD)→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的约束文件。
			*DTDXML文档关联的三种方式,详见ppt。
			* 4.1 引入本地的DTD的约束文件
				* 写法:<DOCTYPE 根节点 SYSTEM "DTD文件的地址" >
				* 约束之后,出现的顺序、个数都完全的规定好了
				* 
 	* 5 DTDXML结合在一起
	 	* DTDXML文档关联的三种方式
		 	* 方式一:使用内部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
这种约束比较复杂可以自己去上网查一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值