用方法论学习xml

之前有篇文章是谈学习感悟的一篇文章,在这篇文章中,我将学习划分了五个层次。单纯的扯概念,确实是太空洞,最近学校刚开一门课《xml》。这篇文章就用之前的方法论,来学习此门课程。

1.概念层
  • 这一层是什么,不再赘述,感兴趣的可以看之前的文章。
  • xml 概念层:假设刚知道这个名词,我要快速理解它是做什么的,不是去看它的定义,而是找一个它的应用场景,就能从具体的角度对其有一个感性的认识。
  • 应用场景
    在这里插入图片描述
    分析:如果让来我们设计这个传输格式,怎么设计?如果交给我的话,我会用 ‘-’ 符号将所要表达的意思区分开。如,用户1发送:“user1-20190421-吃了吗?-user2”,表达的意思就是用户1在2019年4月21日发送了一句话“吃了吗?”给用户2。不管是服务器端还是用户2想要读取,直接以对应字符编码接收,split("-")劈开,分别读取就可以。

    这样做能完成吗?可以,但是存在很多问题,首先,如果这套程序是你一个写的,没问题,消息第一个代表什么,第二个代表什么,自己知道。但是上百号人去做这个事情,就很难办了。其次,我要是扩展加个ip地址进去,也得通知其他人一声,效率非常低。

    所以xml的就出现了,你不是不知道哪一截是哪个意思吗?好,我给你加上一对标签告诉你。不是扩展性不好吗?我把标签做成可扩展的:
    <msg>
    	<user>user1</user>
    	<date>20190421</date>
    	<content>吃了吗</content>
    	<receiver>user2</receiver>
    	<ip>8.8.8.8</ip>
    </msg
    
    因此,一种主要用于数据传输的eXtensible Markup Language:可扩展标记型语言就出现了。
2.框架层
  • 知道了简单的概念,过渡到框架层很容易,很好的方式就是找一本书,如果是经典书籍最好,然后看他的目录,把这个目录提取成框架。
    在这里插入图片描述
    有了框架之后,先不要着急去学,先对框架有个大体的认识。否则,你这一步就白做了。不对每个点有个大体的认识,每次上来只盯着某一局部学,学完了也不知道学的啥。

    简单的认识:
    概念:无非就是发展历史,定义,作用,应用等等,读了这么久的书,这一套流程我们是很熟悉了。
    XML语法:既然是一门语言,肯定有其对应的语法,知道了语法才知道怎么去用,去写代码,因此XML也一样,知道了xml的语法,才会写xml文档。
    DTD: 限定已经说得很明白了,文档类型的定义。其实你翻开那一章的引言读一读就大体明白了,你可以自定义标签,但是你不能胡来吧,你定义的发送日期的标签<date>,另一个人定义的是<time>,这样程序肯定读不出来,所以有必要对文档规范一下。
    XSD:同样的,翻开引言,第一句就是:“XML模式同DTD一样是负责定义和描述XML文档结构和内容模式的”。再看发现它列举了好多DTD的缺点,所以这个东西大概就是用来优化取代DTD的。
    CSS和XSL:学过HTML的都知道,CSS是用来给标签加样式的。在引言中也可以知道:“如果希望添加一些额外的显示信息,这项功能就由样式表来完成”。所以说这个东西是用来将标签在浏览器中进行显示的。

    框架认识完了,我们可以用简单的逻辑将它们串联起来。首先要知道xml是什么东西,在哪使用(定义);要用到它的话,该怎样去写这个文件;如果你对xml文件有更高的约束,用DTD或者XSD来规范文档。最后如果你想把XML当HTML使唤,它也是支持的。
3.细化层
  • 有了知识的框架,就该填充其中的细节,这才真正进入了知识点的学习;
  1. 概念层
  • 根据引言细化框架
    在这里插入图片描述

  • XML概念
    简介:eXtensible Markup Language,可扩展标记型语言。可扩展指的是标签可以自己来定义,可以写成中文的标签 <dog></dog>、<猫></猫>。不像html里面的标签是固定,每个标签都有特定的含义 <h1> <br/> <hr/>标记型语言:用一堆标签来工作的。
    产生背景:此处省略,没多大用处。
    应用:概念层所提及的就是其中之一。用来表示生活中有关系的数据,如下图。另外也经常用在文件配置,比如你在QQ上换个皮肤,设置个人属性,它都会通过xml配置文件来进行记录。再如:修改数据库的信息,不需要修改源代码,只要修改相应的配置文件就可以了。
    在这里插入图片描述
    优势:已经体会到了,此处不再赘述


  • XML语法
    因为无论什么知识,谈及概念,就那么一个套路,简介、背景、优势、应用。而语法这里,我们没那个套路,所以要边学边细化。因为其标签是可以自定义的,所以文档的语法就是对怎么声明这个文件、这个标签写法上有什么要求、一些实体该怎么样转义、标签的属性怎么样定义、注释怎么写,大概就这些。思维导图是学完之后总结出来的,方便复习,而具体的点中写出案例
    在这里插入图片描述

  1. 文档声明
  • 创建一个后缀是 .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属性后
  1. 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

  1. 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)多个属性值,用空格隔开

  1. xml中的注释
    写法 <!-- xml的注释 -->,注意不能嵌套
  2. xml中的特殊字符
    如果想要在xml中现在 a<b ,不能正常显示,因为把<当做标签
    如果就想要显示,需要对特殊字符 < 进行转义
  3. 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>
    

在这里插入图片描述
把特殊字符,当做文本内容,而不是标签

  1. 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>
    

    在这里插入图片描述

  2. xml的语法的总结:

  • 所有 XML 元素都须有关闭标签

  • XML 标签对大小写敏感

  • XML 必须正确地嵌套顺序

  • XML 文档必须有根元素(只有一个)

  • XML 的属性值须加引号

  • 特殊字符必须转义 — CDATA

  • XML 中的空格、回车换行会解析时被保留


  • DTD(Document Type Definition)
    在这里插入图片描述

  1. 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,会提示出错
    在这里插入图片描述

  1. 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">
    
  2. 使用dtd定义元素

  • 语法: <!ELEMENT 元素名 约束>

  • 简单元素:没有子元素的元素

	<!ELEMENT name (#PCDATA)>
简单元素的约束 含义
(#PCDATA) 约束name是字符串类型,必须要加括号
EMPTY 元素为空(没有内容) 单标签就没有内容
ANY 任意,可以是上述两种任意一个

例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 复杂元素:
    在这里插入图片描述
<!ELEMENT person (name,age,sex,school)>

①子元素出现一次
在这里插入图片描述
②子元素出现一次或者多次
在这里插入图片描述
在这里插入图片描述
③子元素出现零次或者一次
在这里插入图片描述
④出现0次或者多次
在这里插入图片描述
⑤按照顺序出现
在这里插入图片描述
在这里插入图片描述

  1. 使用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 表示一个固定值,属性值必须是你设置的这个值,写其他都是不对的
默认值 不写属性,使用直接值。写了属性,使用设置那个值

在这里插入图片描述
在这里插入图片描述

  1. 实体的定义
  • 语法:
<!ENTITY 实体名称 "实体的值">

在这里插入图片描述
在这里插入图片描述

  • 注意
    定义实体需要写在内部dtd里面,
    如果写在外部的dtd里面,有某些浏览器下,内容得不到


  • XSD

  1. DTD和的scheme的比较
  • dtd语法: <!ELEMENT 元素名称 约束>,从它的写法上看,它是不符合xml语法的。
  • schema符合xml的语法,xml语句
  • 一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)。而一个xml文件中只能有一个DTD约束
  • dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型,比如 年龄 只能是整数,在schema可以直接定义一个整数类型
  • schema语法更加复杂,schema目前不能替代dtd
  1. 快速入门
    在这里插入图片描述
  • 创建一个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 空格 约束文档的地址路径

  1. 复杂元素的约束
  • all:只能出现一次
    在这里插入图片描述
    在这里插入图片描述
  • sequence:顺序出现,且只能出现一次
    在这里插入图片描述
  • choice:只能出现其中一个
    在这里插入图片描述
    在这里插入图片描述
  • maxOccurs=“unbounded”: 表示元素的出现的次数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • <any></any>:表示任意元素
  • 定义属性
    在这里插入图片描述
    在这里插入图片描述
  • 案例
    在这里插入图片描述
    在这里插入图片描述
  • schema数据类型体系:
    在这里插入图片描述
发布了73 篇原创文章 · 获赞 91 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/89429032