2020年新年第一天,不写一篇博客纪念一下都感觉对不起这个跨年

为什么会写一篇关于xml的博客呢?xml在编程中用的又不多,再多也用不着自己写约束文件,只要能看懂就行了不是吗?嗯,没别的原因,就是想研究一下xml方便以后自己看~

说一下思路,在Java语言中,web开发会涉及到配置文件,配置文件基本上都是通过xml来写的,为什么要写配置文件,我的理解是:通过使用配置文件来注册(加载)一下某个东西,这样在具体使用的时候就不需要注册(加载)了。这里呢,给我的感觉是有点依赖注入的意思,说明一下,我没接触过具体的依赖注入,只是了解一点大体的思想。有点依赖注入的意思了之后就让我想起了一个词IOC,控制反转。这个是一种框架设计的理念。然后呢,紧接一步就是DDD(领域驱动模型),之后就会涉及到框架的设计了。现在你还觉得学习xml是一种鸡肋吗? 在Java中为什么会使用大部分的xml写配置文件?有待研究~

好了,步入正题:

1.Xml:

xml叫做可扩展性标记语言,可扩展是只它的所有标签都是自定义的,xml出现的本意是替代Html,但是因为它的标签定义太灵活了,写法太严格了,所以用途就变成了传输数据和保存数据。前面说到了框架的设计会使用它,但是框架是死的,只能根据特定的名字(标签)来获取数据呀,所以,我们就引出了xml的约束。

xml的约束有两种:DTD和Schema

2.DTD约束

DTD是xml的一种约束技术,它的后缀名是.dtd,它的作用是验证Xml文档是不是一个有效的Xml文档。它有自己独立的语法规范,描述元素,属性和其他杂项在xml文档中的使用规则说明。

2.1DTD的分类

内部DTD:DTD和xml文档在一个文件中:

<?xml version="1.0" encoding="UTF-8"?>
// 定义跟标签students
<!DOCTYPE students[
// 跟标签中可以包含一个或多个stu标签
<!ELEMENT students (stu+)>
// stu标签中有三个标签(属性),id,name,age
<!ELEMENT stu (id,name,age)>
// 设置id的约束,可以包含任何字符数据,但是不能在其中包含任何子元素
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<students>
<stu>
<id>1</id>
<name>tom</name>
<age>20</age>
</stu>
</students>

  这里的+跟正则中的匹配符的用法类似,想了解的朋友可以看我之前的博客。有讲过正则的基本使用。

外部DTD:DTD和xml文档不在同一个文件中.

<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>

使用:

<?xml version="1.0" encoding="UTF-8" ?>
//<!DOCTYPE 跟标签名 SYSTEM "dtd文件位置url"
<!DOCTYPE students SYSTEM "student.dtd"> <students>
<student number="0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="0002">
<name>李四</name>
<age>15</age>
<sex>男</sex>
</student>
</students>
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA)>
<!--ATTLIST定义属性-->
<!--CDATA属性值可以是任何字符(可包括数字和中文)-->
<!--ID:属性值必须唯一,属性值必须满足xml命名规则-->
<!--enumerated:(枚举值1|枚举值2|枚举值3....),属性值必须在枚举值中-->
<!ATTLIST stu
id CDATA #REQUIRED
name CDATA #REQUIRED
>
ATTLIST定义属性
CDATA属性值可以是任何字符(可包括数字和中文)
ID:属性值必须唯一,属性值必须满足xml命名规则
enumerated:(枚举值1|枚举值2|枚举值3....),属性值必须在枚举值中
#REQUIRED:元素的所有实例都必须有该属性
#IMPLIED:属性可以不出现
default-value:属性可以不出现,并且当它不出现的时候是有默认值的
#FIXED:属性可以不出现,但是如果出现的话就一定是指定的属性值;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "test01.dtd">
<students>
<stu id="1" name="tom"></stu>
</students>

其实DTD的写法还是挺简单的,简单就意味着功能不完全,它的缺点给也很明显:

它只能规定标签的格式,并不能规定标签中数据的格式。下面我们讲本篇博客的重点:Schema约束

3.Schema约束

Schema约束是一种复杂约束技术,它复杂,但是它功能强大

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
<!--定义一个元素(element),他的名称叫students,类型是studentsType-->
<xsd:element name="students" type="studentsType"/>
<!--声明studentsType类型(complexType)-->
<xsd:complexType name="studentsType">
<!--sequence元素要求组中的元素以指定的顺序出现在包含元素中。每个子元素可出现 0 次到任意次数-->
<xsd:sequence>
<!--定义一个student元素,类型是studentType,它可以出现0-无数个-->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!--声明了类型:studentType-->
<xsd:complexType name="studentType">
<xsd:sequence>
<!--定义三个元素,和类型-->
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<!--声明三个类型-->
<xsd:simpleType name="sexType">
<!--定义数据限制内容restriction,他的限制内容是string-->
<xsd:restriction base="xsd:string">
<!--定义一个xml枚举值-->
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<!--定义数值的下限和上限-->
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<!--定义可接受的字符的精确序列。-->
<xsd:pattern value="heima_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>

很神奇吧,Schema约束竟然也是一个XML文件!!!

讲解一下元素的含义:

<xsd:schema xmlns="http://www.itcast.cn/xml"  #默认命名空间的声明,
xmlns:xsd="http://www.w3.org/2001/XMLSchema" #显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema",而且规定来自该命名空间的元素和数据类型应使用前缀xsd
targetNamespace="http://www.itcast.cn/xml"  #显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间http://www.itcast.cn/xml
     elementFormDefault="qualified"> #指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定
<!--定义一个元素(element),他的名称叫students,类型是studentsType-->
<xsd:element name="students" type="studentsType"/>
<!--声明studentsType类型(complexType)-->
<xsd:complexType name="studentsType">
<!--sequence元素要求组中的元素以指定的顺序出现在包含元素中。每个子元素可出现 0 次到任意次数-->
<xsd:sequence>
<!--定义一个student元素,类型是studentType,它可以出现0-无数个-->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>

使用Schema
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引用的xml命名空间
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
引入的xml版本号,前缀名
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
为每一个xsd约束声明一个前缀,作为标识,不写标识默认是这个
xmlns="http://www.itcast.cn/xml
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
<student number="heima_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student> </students>

ok,今天的分享到此结束!

参考连接:

https://www.cnblogs.com/yfstudy/p/9183264.html

https://www.runoob.com/schema/schema-schema.html

https://blog.csdn.net/CristianoJason/article/details/51282739

https://blog.csdn.net/qq_41517071/article/details/82873237

编程基础--XML约束的更多相关文章

  1. C#编程基础->XML系列导航

    缘由 最近开发的小程序过程中需要涉及到XML相关操作,突然发现自己对于这知识点了解的太少,急需学习加强.刚好项目的时间也不是很紧急,自己就总结XML相关知识点.一个方面自己学习,一个方面也希望可以帮到 ...

  2. LINQ to XML 编程基础

    1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: 隐藏行号 复制代码 ?创建 XML public static void CreateDocumen ...

  3. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  4. [.net 面向对象编程基础] (20) LINQ使用

    [.net 面向对象编程基础] (20)  LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...

  5. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  6. SQL查询和编程基础

    本文转自http://www.cnblogs.com/Jolinson/p/3552786.html 这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基 ...

  7. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

  8. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

  9. 二、XML约束

    XML约束有dtd约束和Schema约束两种 dtd约束:可以在xml内部写dtd约束也可以在xml中引用外部dtd文件 book.dtd<!ELEMENT 书架 (书+)>    < ...

随机推荐

  1. 关于electron中入口文件main.js一些重要参数(持续更新maybe)

    const {app, BrowserWindow} = require('electron') const path = require('path') let mainWindow functio ...

  2. ZR7.17

    7.17 F 认真读题吧 A 算法一: \(c = ab,x = a + b + c\) 所以 \(x = a + b + ab\) \(=(b + 1)a + b\) 所以我们枚举\(b\) \(O ...

  3. samba 部署与实验

    一.本地用户登录 1.本地用户验证(Samba服务器默认的安全级别,用户在访问共享资源之前必须提供用户名和密码进行验证) 拓展:tdbsam:该方式是使用一个数据库文件来验证.数据库文件叫passdb ...

  4. dotnet 如何调试某个文件是哪个代码创建

    我发现了自己的软件,会在桌面创建一个 1.txt 文件,但是我不知道是哪个代码创建的,那么如何进行快速的调试找到是哪个代码创建的 最简单的方法是使用 VisualStudio 全局搜 1.txt 看是 ...

  5. 转 java面试题及答案(基础题122道,代码题19道)

    JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...

  6. UVA - 11475 Extend to Palindrome (后缀数组)

    Your task is, given an integer N, to make a palidrome (word that reads the same when you reverse it) ...

  7. codeforces 1185G1 状压dp

    codeforces 1185G1. Playlist for Polycarp (easy version)(动态规划) 传送门:https://codeforces.com/contest/118 ...

  8. 阿里云基于OSS的云上统一数据保护方案2.0正式发布

    近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源.阿里云基于O ...

  9. C. 【UNR #3】配对树

    题解: 首先可以贪心 于是问题可以等价成一条边被算当且仅当子树中个数为奇数个 题解的做法比较简单 考虑每条边,加入其子树内的点 然后为了保证区间长度为偶数 分成f0,0 f0,1 f1,0 f1,1即 ...

  10. TCP/IP Basic

    1.概述 TCP/IP起源于60年代美国政府遮住的一个分组交换网络项目,在当今被定义为互联网通信接口,TCP/IP主要分为4层,每一层负责不同的通信功能,这促成了一个协议族的诞生,而TCP/IP是一组 ...