XML是可扩展标记语言德意思,它和HTML一样都是标记语言(标签语言),不同之处在于XML可拓展,何为可拓展?在HTML中每个标签都有其特定的含义,我们不可以随便写一个标签并赋予其意义,而XML中就可以,XML中每个标签的作用意义由你决定,甚至可以使用中文作为标签(不推荐)

XML的应用

XML最早是开发用于存储数据的,用来表示数据之间的关系,但随着历史发展,现在使用XML主要用于:

  1. 作为网络中传输数据的一种格式
  2. 作为配置文件
  3. 作为简单的存放数据的载体

XML的文档声明

一个文件要声明为XML文件,不仅仅是修改后缀为.xml ,还需要在文件的第一行第一列使用其声明:

<?xml version="1.0" encoding="utf-8"?>

由<? ?>包裹声明,version为版本号,目前XML版本分为1.0和1.1,但是因为1.1无法向后兼容,所以我们一般使用的都是1.0版本,encoding表示编码方式,这里我们使用utf-8

注意:这一行声明必须放在第一行第一列,其前面不允许存在空格,也不允许位于其他行

XML中文乱码

其实我们使用任何IDE开发过程中,写一个XML文件并不太会出现乱码的问题,因为IDE已经帮助我们确定了编码格式,而我们直接手写,或是使用NodePad++,EditPlus等编辑器就可能出现中文乱码的问题

我们先来思考一下乱码的原因:XML文件存在我们硬盘上的时候,其编码格式由你的文本编辑器默认的编码决定,也就是说存在硬盘的文件编码是根据默认编码存的,可能会问我们在XML的第一行第一列中写的声明指定了编码了,这个编码是给浏览器看的,浏览器根据这个编码解释XML,所以两个编码就会不一致从而乱码

乱码的原因已经知道了,我们就需要在保存的时候注意保存的编码格式,为utf-8或者是gbk,这两种格式都可以表示中文,而ISO-8859-1只可以表示英文字符。索性我们就把保存的编码和XML声明的编码保持一致

XML中标签的定义

虽然说XML文件的标签是可以自定义的,但是其还是有一定的命名规范:

  1. XML标签区分大小写,比HTML严格。<p>和<P>是不一样的
  2. XML标签不能以数字和下划线开头。<2a>和<_a>都是不合法的
  3. XML标签不能以xml,XML,Xml等开头。<XML>这种有特殊含义的关键字开头是错误的
  4. XML标签中不可以包含空格,冒号。<a b> ,<a:b>都是错误的

XML中属性的定义

相同于HTML(input标签中有type属性),XML中标签也可以有属性,属性的也有一定的规范:

  1. 一个标签可以有多个属性。<person name="lz" age="21"></person>
  2. 属性名不可以重复。<person id="1" id="2"></person>属性名重复 错误
  3. 属性名与属性值之间使用=,属性值使用引号包起来(单引号和双引号都行)
  4. 命名规范和标签的命名规范一致

XML中的注释

XML的注释和HTML一致,都是使用<!--注释-->来包裹注释,值得注意的是:

  1. 注释不可以嵌套注释。<!--<!--嵌套注释是错误的-->-->
  2. 注释不可以在第一行,因为第一行只能放XML的声明

XML中特殊字符的处理

例如:<b>1<2</b>这样的标签就会报错,因为小于号"<"属于特殊字符,需要转义使用,转义为:<b>1&lt;2</b>

这是一张常见的特殊字符转义表,其实和HTML中的转义是一样的

约束

XML其优点就是可拓展性,标签随便定义,但是我们有时候又希望可以限制一个XML文件使用特定的标签(作为配置文件的时候),这时就有了约束,XML文件的约束有两种:dtd和schema。建议在IDE中试验约束,因为IDE中大多都带有检查XML文件的功能

dtd约束

一个dtd文件是以".dtd"作为后缀的,我们可以在其中编写我们的dtd约束

语法:

1.有多少标签就需要在dtd中有多少个<!ELEMENT>。如果有3个<!ELEMENT>,那么在XML中标签也只能最多有3个,多了会报错

2.区分复杂元素和简单元素。对XML中的标签进行划分,有子标签的就是复杂元素,复杂元素在dtd文件中需要用圆括号写出其子标签<!ELEMENT 元素名 (子元素名)>

子元素名之间使用 "," 分割,也可以使用“|”分割,后者表示子元素中只可以选择其中的一项

子元素名的顺序表示类XML中标签的顺序,顺序不可以错。我们可以使用 + ? * 这三个符号来表示子标签的个数,不写默认是只能使用1个该标签

+ 表示标签可以出现一次或多次 ; ? 表示标签可以出现零次和一次 ; * 表示标签可以出现任意次

没有的就是简单元素,简单元素需要在圆括号中写出其类型<!ELEMENT 元素名 (类型)>

类型(注意大写):#PCDATA 表示该标签的值是字符串类型 ;EMPTY 表示该标签的值为空(没有内容) ;ANY 表示该标签的值是任意的

使用约束:

dtd文件准备好,接下来只要在XML文件中引用就好了,使用 <!DOCTYPE 根标签名 约束所在的地方 (约束名) 约束路径>

根标签名容易理解,约束所在的地方可以分为(注意大写):SYSTEM 表示在本系统环境下 ;PUBLIC 表示在网络上(这时候验证XML就需要联网了,框架的配置文件都是放在网上的,所以第一次使用其配置文件可能会需要网络);

约束名(不一定存在):在本系统环境下(SYSTEM)不用写出来,但是在网络环境下(PUBLIC)就需要了,一般名称固定

约束路径:直接写出dtd文件所在的路径,在网络环境下(PUBLIC)可能就是一个URL,所以第一次效验XML需要联网下载该dtd文件

看一个例子

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "1.dtd">
<person>
<name>lz</name>
<name>lz</name>
<age>21</age>
</person>

1.dtd文件:

<!ELEMENT person (name+,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

这里使用的就是我写的本地dtd文件,所以在XML中引用的时候没有使用约束名,约束路径直接使用文件名

也可以把dtd文件的内容写到XML中 (但是不推荐内联这样的写法,不利于维护):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name+,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<person>
<name>lz</name>
<name>lz</name>
<age>21</age>
</person>

使用dtd定义属性

语法:<!ATTLIST 元素名

                              属性名 属性类型 属性的约束>

属性的类型:

CDATA 表示字符串

枚举(AA|BB|CC) 表示其中只选择一项

ID 表示id,id只可以用字母或下划线开头

属性的约束:

#REQUIRED 表示属性必须存在

#IMPLIED  表示属性可有可无

#FIXED 表示必须是一个固定值 #FIXED “AAA” 说明这个属性值必须为AAA

默认值 “AAA”  不写属性,使用默认值;写了属性,就用那个值

修改后的1.dtd :

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT person (name+,age)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name id ID #REQUIRED>
<!ELEMENT age (#PCDATA)>

name元素的属性为id,必须写,且为ID类型

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "1.dtd">
<person>
<name id="id1">lz</name>
<age>21</age>
</person>

设置了name标签的属性id,必须写,不写会报错

使用dtd定义常量

语法: <!ENTITY 常量名 常量值>

在XML中使用:" &常量名; "

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name+,age+)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name id ID #REQUIRED>
<!ELEMENT age (#PCDATA)>
<!ENTITY test "HAHA">
]>
<person>
<name id="id1">lz</name>
<age>21</age>
<age>&test;</age>
</person>

注意:使用常量只能用内联的方式,如果写到外部的dtd文件中,会得不到值

schema约束

schema约束采用XML的语法,它的标签源于w3c标准,它是为了替代dtd约束而生的,但是事实上并没有完全取代,因为schema要比dtd复杂,是优点也是缺点,复杂表明schema可以比dtd表示更多的数据类型,可以更丰富,但是也带来了编写的复杂。一个XML文件只能有一个dtd约束,但是可以有任意多个schema约束,不同的schema使用名称空间进行区分(类似于java的包名)

schema约束文件是以 .xsd 为后缀的

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/1"
elementFormDefault="qualified">

这是一个标准的schema文件的开头

  xmlns="http://www.w3.org/2001/XMLSchema" 表明这是一个schema约束文件

  targetNamespace 表明这个约束文件的名字

  elementFormDefault="qualified" 这个差不多是固定的,表明格式合格

同样schema约束也需要判断元素是简单元素还是复杂元素,不过这两者都是使用<element name="标签名">表示,复杂元素的element标签中还可以嵌套,简单元素写在复杂元素的complexType属性下的某个属性中,简单元素的element中使用type属性表明类型,可以为int,String等等

"复杂元素的complexType属性下的某个属性中"这句话的某个属性可以为:

all :表明其中的简单元素只能出现一次

choice:表明其中的简单元素只能出现一个

sequence:表明其中的简单元素必须按顺序出现

如果想要某个简单元素出现多次,需要在其中添加 maxOccurs="unbounded" ,是与name同级的

any:表明任意元素

使用schema定义属性

使用 <attribute name="属性名" type="属性类型" use="required"></attribute>,use="required"表明这个属性是必须存在的,还有其他值可选择,这个标签放在complexType标签下

使用schema约束

在XML文件中使用schema约束需要在根元素中使用名称空间:

<person xmlns="http://www.example.org/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/1 1.xsd" id1="1">

这里使用

xmlns="http://www.example.org/1" 表明schema约束名

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" (固定写法)表明这是一个实现schema约束的XML文件,比表明schema约束文件多了个"-instance"

xsi:schemaLocation="http://www.example.org/1 1.xsd" id1="1" 指出约束文件位置(约束名+约束文件名) id1是我添加的属性,没什么用只是练习添加属性,如果没有定义属性可以不写

例子:

1.xsd :

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/1"
xmlns:tns="http://www.example.org/1"
elementFormDefault="qualified">
<element name="person">
<complexType>
<sequence>
<element name="name" type="string" maxOccurs="unbounded"></element>
<element name="age" type="int"></element>
</sequence>

<attribute name="id1" type="int" use="required"></attribute>
</complexType>
</element>
</schema>

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.org/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/1 1.xsd" id1="1">
<name>lz</name>
<name>zhangsan</name>
<age>21</age>
</person>

我们使用Strut2 和Hibernate 的配置文件使用的都是dtd约束,web.xml文件和spring的配置文件使用的schema约束

XML的学习的更多相关文章

  1. xml基础学习笔记05

    Xpath快速解析 如题一样,本篇主要说说Xpath快速查找XML文档   * Xpatn.Xquery,是专门用来查询xml的语言   * 查询xml非常快   Xpatn.Xquery,是专门用来 ...

  2. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  3. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  4. Android] Android XML解析学习——方式比较

     [Android] Android XML解析学习——方式比较 (ZT)  分类: 嵌入式 (From:http://blog.csdn.net/ichliebephone/article/deta ...

  5. XML基础学习01

    XML学习 1:XML:可扩展的标识语言,是一种描述结构数据的格式,简化了网络中数据交换和表示,使得代码,数据和表示分离,并作为数据交换的标准格式,被称为智能数据文档. 2:当我们不使用数据库来存储数 ...

  6. xml基础学习笔记04

    今天继续xml学习,主要是:SimpleXML快速解析文档.xml与数组相互转换 .博客中只是简单的做一个学习记录.积累.更加详细的使用方法,可以查看php手册 1.SimpleXML快速解析文档 前 ...

  7. xml基础学习笔记03

    继续上篇xml学习笔记,坚持.坚持.再坚持啊.... 本篇主要记录: 35.XML节点的删除与修改 36集.用XML制作RSS订阅源 <?php /* 笔记: 35.XML节点的删除与修改 使用 ...

  8. xml基础学习笔记01

    注意:刚刚看了网上对于XML中的标签,节点和元素?到底应该怎么表述?起初我也有这个疑惑,现在我的想法是:下面出现node的应称作节点,节点对象.element应称作元素,毕竟这更符合英文的本意.至于标 ...

  9. Android Studio 学习 - AndroidManifest.xml文件学习

    首先,今天发现了一个很牛逼的教程网站:慕课网(http://www.imooc.com/).有很多大牛发布的教学视频.值得收藏.学习. 今天主要参照陈启超老大的视频,学习了多个Activity之间的切 ...

  10. Sql server For XML Path 学习

    最近看到太多人问这种问题   自己也不太了解  就在网上学习学习 自己测试一番 CREATE TABLE test0621 (id INT,NAME NVARCHAR(max)) INSERT tes ...

随机推荐

  1. SpringMVC札集(07)——JSON数据

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  2. React-Native进阶_5.导航 Naviagtion

    有这样一个组件 他可以控制页面跳转 返回,在移动端叫做导航控制器, 在RN中叫路由 我们使用的  react-native-navigation 是一个开源组件库介绍:A complete nativ ...

  3. 依存可视化︱Dependency Viewer——南京大学自然语言处理研究组

    来源网页:http://nlp.nju.edu.cn/tanggc/tools/DependencyViewer.html 视频演示网页:http://nlp.nju.edu.cn/tanggc/to ...

  4. 解决 src/MD2.c:31:20: fatal error: Python.h: No such file or directory安装包错误

    在linux命令行安装包时报错 src/MD2.c:31:20: fatal error: Python.h: No such file or directory 原因:缺少了python的dev 解 ...

  5. 6.二元查找树的后序遍历结果[PostOrderOfBST]

    [题目] 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...

  6. 对集合应用符号 | & ^ -

    s1 = set('abc') s2 = set('abs') # 在s1而不在s2 print s1 - s2 # set(['c']) # 在s1或者s2 print s1 | s2 # set( ...

  7. Spring配置--Aop配置详情

    首先我们来看一下官方文档所给我们的关于AOP的一些概念性词语的解释: 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在 ...

  8. (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切

    if (this == null) Console.WriteLine("this is null"); 这句话一写,大家一定觉得荒谬,然而 if 内代码的执行却是可能的!本文讲介 ...

  9. ubuntu中安装iso文件

    [font=微软雅黑]小施今天写一篇教程来教大家如何在Ubuntu中使用虚拟光驱. 在中使用是很简单的.可是很多新手却不会  前提:你所在的用户必须拥有root权限(终端中需要用到root权限).一个 ...

  10. Windows下安装Redis服务,修改查看密码,修改端口,常用命令

    一.安装 出自:https://jingyan.baidu.com/article/0f5fb099045b056d8334ea97.html 1.要安装Redis,首先要获取安装包.Windows的 ...