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

XML的应用

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

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

XML的文档声明

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

  1. <?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文件:

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

1.dtd文件:

  1. <!ELEMENT person (name+,age)>
  2. <!ELEMENT name (#PCDATA)>
  3. <!ELEMENT age (#PCDATA)>

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE person [
  3. <!ELEMENT person (name+,age)>
  4. <!ELEMENT name (#PCDATA)>
  5. <!ELEMENT age (#PCDATA)>
  6. ]>
  7. <person>
  8. <name>lz</name>
  9. <name>lz</name>
  10. <age>21</age>
  11. </person>

使用dtd定义属性

语法:<!ATTLIST 元素名

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

属性的类型:

CDATA 表示字符串

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

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

属性的约束:

#REQUIRED 表示属性必须存在

#IMPLIED  表示属性可有可无

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

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

修改后的1.dtd :

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

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

XML文件:

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

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

使用dtd定义常量

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE person [
  3. <!ELEMENT person (name+,age+)>
  4. <!ELEMENT name (#PCDATA)>
  5. <!ATTLIST name id ID #REQUIRED>
  6. <!ELEMENT age (#PCDATA)>
  7. <!ENTITY test "HAHA">
  8. ]>
  9. <person>
  10. <name id="id1">lz</name>
  11. <age>21</age>
  12. <age>&test;</age>
  13. </person>

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

schema约束

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <schema xmlns="http://www.w3.org/2001/XMLSchema"
  3. targetNamespace="http://www.example.org/1"
  4. 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约束需要在根元素中使用名称空间:

  1. <person xmlns="http://www.example.org/1"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. 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 :

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

  12. <attribute name="id1" type="int" use="required"></attribute>
  13. </complexType>
  14. </element>
  15. </schema>

XML文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <person xmlns="http://www.example.org/1"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.example.org/1 1.xsd" id1="1">
  5. <name>lz</name>
  6. <name>zhangsan</name>
  7. <age>21</age>
  8. </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. getaddrinfo()详解

    IPv4中使用gethostbyname()函数完成主机名到地址解析,但是该API不允许调用者指定所需地址类型的任何信息,返回的结构只包含 了用于存储IPv4地址的空间.为了解决该问题,IPv6中引入 ...

  2. CSS字幕滚动 !!!

    marquee的基本语法:<marquee> … </marquee>,与大多数HTML语法元素一样,它也是成双出现的,被修饰对象就放在起始符和终止符之间.而且它自己可以实现鼠 ...

  3. TypeError: pivot_table() got an unexpected keyword argument 'rows'

    利用Python进行数据分析>第二章,处理MovieLens 1M数据集,有句代码总是报错: mean_rating = data.pivot_table('rating', rows='tit ...

  4. Windbg 调试工具32位/64位版本下载

    最新的Windbg调试工具32位/64位版本越来越不好下载了,这里通过CSDN的渠道给大家一个下载地址,帮助大家更好下载工具: https://github.com/EasyDarwin/Tools/ ...

  5. caffe 一些网络参数

    caffe一些网络参数的:http://www.docin.com/p-871820919.html

  6. learn go passing variable-length arguments

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.3.md im ...

  7. HDU1671 水题字典树

    #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...

  8. js判断当前浏览类型

    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isOpera = userAgent.indexOf("Opera ...

  9. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论 ...

  10. 不再为命名而苦恼!使用 MSTestEnhancer 单元测试扩展,写契约就够了

    有没有觉得命名太难?有没有觉得单元测试的命名更难?没错,你不是一个人!看看这个你就知道了:程序员最头疼的事:命名 或它的英文原文 Don’t go into programming if you do ...