之前有篇文章是谈学习感悟的一篇文章,在这篇文章中,我将学习划分了五个层次。单纯的扯概念,确实是太空洞,最近学校刚开一门课《xml》。这篇文章就用之前的方法论,来学习此门课程。
- 这一层是什么,不再赘述,感兴趣的可以看之前的文章。
- xml 概念层:假设刚知道这个名词,我要快速理解它是做什么的,不是去看它的定义,而是找一个它的应用场景,就能从具体的角度对其有一个感性的认识。
- 应用场景:
分析:如果让来我们设计这个传输格式,怎么设计?如果交给我的话,我会用 ‘-’ 符号将所要表达的意思区分开。如,用户1发送:“user1-20190421-吃了吗?-user2”,表达的意思就是用户1在2019年4月21日发送了一句话“吃了吗?”给用户2。不管是服务器端还是用户2想要读取,直接以对应字符编码接收,split("-")劈开,分别读取就可以。
这样做能完成吗?可以,但是存在很多问题,首先,如果这套程序是你一个写的,没问题,消息第一个代表什么,第二个代表什么,自己知道。但是上百号人去做这个事情,就很难办了。其次,我要是扩展加个ip地址进去,也得通知其他人一声,效率非常低。
所以xml的就出现了,你不是不知道哪一截是哪个意思吗?好,我给你加上一对标签告诉你。不是扩展性不好吗?我把标签做成可扩展的:
因此,一种主要用于数据传输的eXtensible Markup Language:可扩展标记型语言就出现了。<msg> <user>user1</user> <date>20190421</date> <content>吃了吗</content> <receiver>user2</receiver> <ip>8.8.8.8</ip> </msg
- 知道了简单的概念,过渡到框架层很容易,很好的方式就是找一本书,如果是经典书籍最好,然后看他的目录,把这个目录提取成框架。
有了框架之后,先不要着急去学,先对框架有个大体的认识。否则,你这一步就白做了。不对每个点有个大体的认识,每次上来只盯着某一局部学,学完了也不知道学的啥。
简单的认识:
概念:无非就是发展历史,定义,作用,应用等等,读了这么久的书,这一套流程我们是很熟悉了。
XML语法:既然是一门语言,肯定有其对应的语法,知道了语法才知道怎么去用,去写代码,因此XML也一样,知道了xml的语法,才会写xml文档。
DTD: 限定已经说得很明白了,文档类型的定义。其实你翻开那一章的引言读一读就大体明白了,你可以自定义标签,但是你不能胡来吧,你定义的发送日期的标签<date>,另一个人定义的是<time>,这样程序肯定读不出来,所以有必要对文档规范一下。
XSD:同样的,翻开引言,第一句就是:“XML模式同DTD一样是负责定义和描述XML文档结构和内容模式的”。再看发现它列举了好多DTD的缺点,所以这个东西大概就是用来优化取代DTD的。
CSS和XSL:学过HTML的都知道,CSS是用来给标签加样式的。在引言中也可以知道:“如果希望添加一些额外的显示信息,这项功能就由样式表来完成”。所以说这个东西是用来将标签在浏览器中进行显示的。
框架认识完了,我们可以用简单的逻辑将它们串联起来。首先要知道xml是什么东西,在哪使用(定义);要用到它的话,该怎样去写这个文件;如果你对xml文件有更高的约束,用DTD或者XSD来规范文档。最后如果你想把XML当HTML使唤,它也是支持的。
- 有了知识的框架,就该填充其中的细节,这才真正进入了知识点的学习;
- 概念层
-
根据引言细化框架
-
XML概念
①简介:eXtensible Markup Language,可扩展标记型语言。可扩展指的是标签可以自己来定义,可以写成中文的标签 <dog></dog>、<猫></猫>。不像html里面的标签是固定,每个标签都有特定的含义 <h1> <br/> <hr/>标记型语言:用一堆标签来工作的。
②产生背景:此处省略,没多大用处。
③应用:概念层所提及的就是其中之一。用来表示生活中有关系的数据,如下图。另外也经常用在文件配置,比如你在QQ上换个皮肤,设置个人属性,它都会通过xml配置文件来进行记录。再如:修改数据库的信息,不需要修改源代码,只要修改相应的配置文件就可以了。
④优势:已经体会到了,此处不再赘述
-
XML语法
因为无论什么知识,谈及概念,就那么一个套路,简介、背景、优势、应用。而语法这里,我们没那个套路,所以要边学边细化。因为其标签是可以自定义的,所以文档的语法就是对怎么声明这个文件、这个标签写法上有什么要求、一些实体该怎么样转义、标签的属性怎么样定义、注释怎么写,大概就这些。思维导图是学完之后总结出来的,方便复习,而具体的点中写出案例。
- 文档声明
- 创建一个后缀是 .xml的文件
如果写xml,第一步 必须要有 一个文档声明(写了文档声明之后,表示写xml文件的内容)
而且这个声明必须是第一行第一列,谁都不可以撼动。<?xml version="1.0" encoding="gbk"?>
- 属性:
- version:xml的版本 1.0(使用) 1.1
- encoding:xml编码 gbk utf-8 iso8859-1(不包含中文)
- standalone:是否需要依赖其他文件 yes/no,一般不使用
注意: 同时设置了encoding和standalone属性,standalone属性要位于encoding属性后。
- XML文件元素的定义
-
标签定义有开始必须要有结束:<person></person>
-
标签没有内容,可以在标签内结束 ; <person/>,所有的空标识必须被关闭
-
标签可以嵌套,必须要合理嵌套
-
一个xml中,只能有一个根标签,其他标签都是这个标签下面的标签
-
在xml中把空格和换行都当成内容来解析,所以下面这两段代码含义是不一样的,通过jaxp可以读取元素输出,其会把空格当成文本元素来输出:
<person>1111111</person> <person> 11111111111 </person>
-
xml标签可以是中文
-
xml中标签的名称规则
(1)xml代码区分大小写
<person> <Person>:这两个标签是不一样的
(2)xml的标签不能以数字、标点符号和下划线(_)开头
<2a> <_aa>: 这样是不正确的
(3)xml的标签不能以xml、XML、Xml等开头
<xmla> <XmlB> <XMLC>: 这些都是不正确的
(4)xml的标签不能包含空格和冒号(命名空间中要使用)
<a b> <b:c> : 这些是不正确的
(5) XML文档中除了XML之外,无保留字,任何名字都可以使用,尽量使名字具有可读性,使用下划线是个不错的选择
(6)尽量避免使用“-”和“.”
几个不合适的例子:xml_name 、 !name 、 51net、 first-name 、 first.name 、the_title_of_book
- xml中属性的定义
-
html是标记型文档,可以有属性
-
xml也是标记型文档,可以有属性
<person id1="aaa" id2="bbb"></person>
-
属性定义的要求
(1)一个标签上可以有多个属性<person id1="aaa" id2="bbb"></person>
(2)属性名称不能相同
<person id1="aaa" id1="bbb"></person>
这个是不正确,不能有两个id1
(3)属性名称和属性值之间使用“=” ,属性值使用引号包起来 (可以是单引号,也可以是双引号 )
(4)xml属性的名称规范和元素的名称规范一致
(5)多个属性值,用空格隔开
- xml中的注释
写法 <!-- xml的注释 -->,注意不能嵌套 - xml中的特殊字符
如果想要在xml中现在 a<b ,不能正常显示,因为把<当做标签
如果就想要显示,需要对特殊字符 < 进行转义 - CDATA区域
可以解决多个字符都需要转义的操作 if(a<b && b<c && d>f) {}
把这些内容放到CDATA区里面,不需要转义了
写法
<![CDATA[ 内容 ]]>
- 代码<![CDATA[ <b>if(a<b && b<c && d>f) {}</b> ]]>
<?xml version="1.0" encoding="utf-8"?> <person> <name>张三</name> <age>23</age> <![CDATA[<NAME>>>><<<]]> </person>
把特殊字符,当做文本内容,而不是标签
-
PI指令
可以在xml中设置样式<?xml-stylesheet type="text/css" href="css的路径"?>
设置样式,只能对英文标签名称起作用,对于中文的标签名称不起作用的。
<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/css" href="1.css"?> <person> <name>zhangsan</name> <age>5000</age> </person>
-
xml的语法的总结:
-
所有 XML 元素都须有关闭标签
-
XML 标签对大小写敏感
-
XML 必须正确地嵌套顺序
-
XML 文档必须有根元素(只有一个)
-
XML 的属性值须加引号
-
特殊字符必须转义 — CDATA
-
XML 中的空格、回车换行会解析时被保留
-
DTD(Document Type Definition)
- dtd的快速入门
- 创建一个文件 后缀名 .dtd
步骤:
(1)看xml中有多少个元素 ,有几个元素,在dtd文件中写几个 <!ELEMENT><?xml version="1.0" encoding="UTF-8"?> <person> <name>zhangsan</name> <age>23</age> </person>
(2)判断元素是简单元素还是复杂元素
- 复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
- 简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
(3)需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径”>
- 打开xml文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "2.dtd">
<person>
<name>zhangsan</name>
<age>23</age>
<age2>24</age2>
</person>
-
如果想要校验xml的约束,需要使用工具(myeclipse工具)
-
打开myeclipse开发工具
创建一个项目
创建一个xml文件和一个dtd文件
当xml中引入dtd文件之后,比如只能出现name age,多写了一个a,会提示出错
-
dtd的三种引入方式
(1)引入外部的dtd文件<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
(2)使用内部的dtd文件
<!DOCTYPE 根元素名称 [ <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>
(3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
后面学到框架 struts2 使用配置文件 使用 外部的dtd文件
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
-
使用dtd定义元素
-
语法: <!ELEMENT 元素名 约束>
-
简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
简单元素的约束 | 含义 |
---|---|
(#PCDATA) | 约束name是字符串类型,必须要加括号 |
EMPTY | 元素为空(没有内容) 单标签就没有内容 |
ANY | 任意,可以是上述两种任意一个 |
例子:
- 复杂元素:
<!ELEMENT person (name,age,sex,school)>
①子元素出现一次
②子元素出现一次或者多次
③子元素出现零次或者一次
④出现0次或者多次
⑤按照顺序出现
- 使用dtd定义属性
- 语法:
<!ATTLIST 元素名称 属性名称 属性类型 属性的约束 >
- 属性类型
属性类型 | 含义 |
---|---|
CDATA | 字符串 |
枚举 | 表示只能在一定的范围内出现值,但是只能每次出现其中的一个 |
ID | 值只能是字母或者下划线开头 |
NMTOKEN/NMTOKENS | 该属性只能由字母、数字、下划线、.、:、-组成 |
案例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 家庭 [
<!ELEMENT 家庭 (人+,家电*)>
<!ELEMENT 人 EMPTY>
<!ELEMENT 家电 EMPTY>
<!ATTLIST 人
名字 CDATA #REQUIRED
年龄 CDATA #REQUIRED
爱好 CDATA #IMPLIED
>
<!ATTLIST 家电
名称 CDATA #REQUIRED
数量 CDATA #REQUIRED
说明 CDATA #IMPLIED
>
]>
<家庭>
<人 名字="张三" 年龄="25"/>
<人 名字="李四" 年龄="38" 爱好="售货员"/>
<家电 数量="3" 名称="彩电"/>
</家庭>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poems [
<!ELEMENT poems (title,content)>
<!ELEMENT title (#PCDATA)>
<!ATTLIST title
author NMTOKEN #REQUIRED
>
<!ELEMENT content (#PCDATA)>
]>
<poems>
<title author = "dufu">八阵图</title>
<content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴。
</content>
</poems>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 公司 ANY>
<!ELEMENT 公司职员 (#PCDATA)>
<!ATTLIST 公司职员
编号 ID #REQUIRED
姓名 CDATA #REQUIRED
>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 公司 SYSTEM "3_5 ATT_ID.dtd">
<公司>
<公司职员 编号 = "Z001" 姓名 = "张三"/>
<公司职员 编号 = "Z002" 姓名 = "李四"/>
</公司>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 家庭 [
<!ELEMENT 家庭 (人+)>
<!ELEMENT 人 EMPTY>
<!ATTLIST 人
relID ID #REQUIRED
parentID IDREFS #IMPLIED
name CDATA #REQUIRED
>
]>
<家庭>
<人 relID="P_1" name="爸爸"/>
<人 relID="P_2" name="妈妈"/>
<人 relID="P_3" parentID="P_1 P_2" name="儿子"/>
</家庭>
- 属性约束
属性的约束 | 属性必须存在 |
---|---|
#REQUIRED | 属性必须存在 |
#IMPLIED | 属性可有可无在 |
#FIXED | 表示一个固定值,属性值必须是你设置的这个值,写其他都是不对的 |
默认值 | 不写属性,使用直接值。写了属性,使用设置那个值 |
- 实体的定义
- 语法:
<!ENTITY 实体名称 "实体的值">
-
注意
定义实体需要写在内部dtd里面,
如果写在外部的dtd里面,有某些浏览器下,内容得不到
-
XSD
- DTD和的scheme的比较
- dtd语法: <!ELEMENT 元素名称 约束>,从它的写法上看,它是不符合xml语法的。
- schema符合xml的语法,xml语句
- 一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)。而一个xml文件中只能有一个DTD约束
- dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型,比如 年龄 只能是整数,在schema可以直接定义一个整数类型
- schema语法更加复杂,schema目前不能替代dtd
- 快速入门
-
创建一个schema文件 后缀名是 .xsd
-
在schema文件里面
① 属性 xmlns=“http://www.w3.org/2001/XMLSchema”, 声明当前xml文件是一个约束文件
② targetNamespace=“http://www.rjxy.cn/20190423”, 使用schema约束文件,直接通过这个地址引入约束文件
③ elementFormDefault=“qualified”,表示质量良好的 -
步骤
(1)看xml中有多少个元素
(2)看简单元素和复杂元素 -
如果复杂元素
<element name="person"> <complex> <sequence> </sequence> </complex> </element>
(3)简单元素,写在复杂元素的
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.rjxy.com/20190423" elementFormDefault="qualified"> <element name="person"> <complexType> <sequence> <element name="name" type="string"></element> <element name="age" type="int"></element> </sequence> </complexType> </element> </schema>
(4)在被约束文件里面引入约束文件
-
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
– 表示xml是一个被约束文件的实例 -
xmlns=“http://www.rjxy.cn/20190423”
– 是约束文档里面 targetNamespace -
xsi:schemaLocation=“http://www.rjxy.cn/20190423 1.xsd”>
– targetNamespace 空格 约束文档的地址路径
- 复杂元素的约束
- all:只能出现一次
- sequence:顺序出现,且只能出现一次
- choice:只能出现其中一个
- maxOccurs=“unbounded”: 表示元素的出现的次数
- <any></any>:表示任意元素
- 定义属性
- 案例
- schema数据类型体系: