Xml、Dtd

1.XML概述

1.1XML:XML一种数据存储格式,这种数据存储格式在存储数据内容的同时,还能够保存数据之间的关系

1.2XML保存数据的方法:XML利用标签来保存数据的内容,利用标签之间的嵌套关系来保存数据之间的关系。

1.3XML的应用场景:

1.3.1利用XML跨平台的特性,用来在不同的操作系统不同的开发语言之间传输数据。如果说java是一门跨平台的语言,那XML就是跨平台的数据。

1.3.2利用XML可以保存具有关系的数据的特性,还常常被用来做为配置文件使用。,

1.4XML文件:把XML格式的数据保存到文件中,这样的文件通常起后缀名为.XML,这样的文件就叫做XML文件,XML文件是XML数据最常见的存在形式,但是,这不是XML的唯一存在形式(在内存中或在网络中也可以存在),不要把XML狭隘的理解成XML文件。

1.5XML校验:浏览器除了内置html解析引擎外还内置了XML解析器,利用浏览器打开XML格式的数据,就可以进行XML校验。

2.XML语法

2.1文档声明:一个格式良好的XML必须包含也只能包含一个文档声明,并且文档声明必须出现在XML文档第一行,其前不能有其他任何内容。

2.1.1最简单的写法:<?XML version="1.0" ?>其中的version代表当前XML所遵循的规范版本。

2.1.2使用encoding属性指定文档所使用的字符集编码:<?XML version="1.0" encoding="gb2312" ?>

注意:encoding属性指定的编码集和XML真正使用的编码应该一致,如果不一致就会有乱码问题。

encoding属性默认值为老外喜欢的iso8859-1

2.1.3使用standalone属性指定当前XML文档是否是一个独立文档:<?XML version="1.0" standalone="no" ?>,standalone默认值为yes表示是一个独立文档。

注意:很多的解析器会忽略这个属性,但是学习知识要按标准去学,所以这个属性也要掌握。

2.2元素

2.2.1元素分为开始标签和结束标签,在开始标签和结束标签之间的文本称为标签体,如果一个标签即不含标签体也不包含其他标签,那这样的标签可以把开始标签和结束标签进行合并,这样的标签叫自闭标签。

<a>xxxxx</a>   <a/>

2.2.2一个元素也可以包含若干子元素,但是要注意所有的标签都要进行合理嵌套。

2.2.3一个格式良好的XML文档应该具有并且只能有一个跟标签,其他标签都应该是这个跟标签的子孙标签。

2.2.4元素的命名规范:

区分大小写,例如,<P>和<p>是两个不同的标记。

不能以数字或标点符号或"_"开头。

不能以XML(或XML、或Xml 等)开头。

不能包含空格。

名称中间不能包含冒号(:)

2.3属性

一个元素可以包含多个属性,属性的值要用单引号或双引号括起来。如果属性的之中包含双引号,就要用单引号了。

属性的命名规范,参照元素的命名规范。

2.4注释

<!--这是一段注释-->

注意:注释不能出现在文档声明之前。实验:把注释写到文档声明之前,用ie打开是没问题,但是用chrome打开是报错的。这就看出来了不同的解析器有不同的处理,我们学习的时候还是按标准去学。

注释不能嵌套注释

2.5CDATA区、转义字符

都可以用来转义特殊字符。

2.5.1CDATA区<![CDATA[这是要转义的内容]]>

被CDATA区扩起来的内容,将会被浏览器当作文本来处理。

2.5.2转义字符

& --> &amp;

< --> &lt;

>     --> &gt;

" --> &quot;

‘ --> &apos;

2.5.3CDATA区和转义字符的区别

(1)CDATA区可以成段的进行转义,而转义字符一次只能转义一个字符

(2)CDATA区转义的字符可以保存数据本来的格式只是通知解析器按文本去处理。转义字符改变了数据本身的内容,利用其他字符替代了转义字符。请思考,如果要转义的内容是一段js程序的话,如果用转义字符合适不合适?

2.6处理指令:一段指令通知解析器以何种方式解析XML

<?XML-stylesheet type="text/css" href="1.css" ?>指定解析器使用1.css去渲染当前的XML数据

其实文档声明就是一个最常见的处理指令。

3.DTD技术

3.1DTD是一门XML约束技术,用来约束XML写法。

3.2如何在XML中引入一个DTD

3.2.1外部引入:dtd约束文件存在在一个外部文件中,我们在XML中引入该约束。

(1)本地文件引入:该dtd文件存在在本地硬盘中

<!DOCTYPE 根元素的名称 SYSTEM "文件所在的路径">

(2)公共位置文件引入:dtd约束文件存在在一个公共网络上,我们在XML引入该约束

<!DOCTYPE 根元素的名称 PUBLIC "dtd名称" "dtd所在的URL">

3.2.2在XML内部写dtd约束

在文档声明下<!DOCTYPE 根元素名称 [dtd约束的内容]>

3.3利用dtd约束XML中的元素

<!ELEMENT 元素名称 元素约束>

3.3.1元素约束

(1)存放类型

ANY:当前声明的元素可以包含任意子元素

EMPTY:当前声明的元素不能包含任何元素

(2)存放内容:利用小括号括起来的元素的名称,用来表示该元素中可以存放哪些内容

<!ELEMENT "元素名" (可以包含的元素的名称)>

小括号中的内容,可以有多个子元素的名称

如果用“,”分割这些子元素就表明这些子元素必须按指定的顺序出现

如果用“|”分割这些内容就表明这些子元素只能出现其中之一

使用“+”来表明内容可以出现一次或多次

使用“*”来表明内容可以出现零次或多次

使用“?”来表明内容可以出现零次或一次

#PCDATA表明该元素可以包含标签体

可以利用()进行组操作:

<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

3.4利用dtd约束XML中的属性

<!ATTLIST 元素名

属性名 属性类型 属性约束

。。。。>

3.4.1属性类型

(1)CDATA:表明该属性的值是一个普通的文本值。

(2)ENUMERATED:表明该属性的值只能取指定范围内的其中之一

(3)ID:表明该属性值在整个文档中必须唯一,注意ID类型的属性的值必须以字母下划线开头,并且不能以数字开头,不能包含空白字符

3.4.2属性约束

(1)#REQUIRED 来表明当前这个属性是必须存在的属性

(2)#IMPLIED 来表明当前这个属性是可选的属性

(3)#FIXED "固定值" 来表明当前这个属性具有一个默认的值,可以不明确指定该属性,解析器会帮你加上,如果你硬是指定了一个其他的值,会出错。

(4)"默认值" 来表明当前属性具有一个默认的值,如果给这个属性指定一个值就用指定的值,如果不指定呢,就使用默认值。

3.5实体:可以理解为对一段内容的引用,如果有一段内容到处在被使用,可以将其设计为一个实体

3.5.1引用实体:用在XML中的实体

声明实体:<!ENTITY 实体名称 "实体内容">

引用引用实体:&实体名称;

3.5.2参数实体:用在DTD文件中的实体

声明实体:<!ENTITY % 实体名称 "实体内容">

引用参数实体: %实体名称;

一、xml语法

1.文档声明

用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml

通常一个xml都要包含并且只能包含一个文档声明

xml的文档必须在整个xml的最前面,在文档声明之前不能有任何内容

<?xml version="1.0" ?>--version是必须存在的属性,表明当前xml所遵循规范的版本,目前位置都写1.0就可以了

<?xml version="1.0" encoding="utf-8" ?>--encoding用来只会解析引擎在解析xml时使用的编码,一定要保证xml格式的数据在保存时使用的编码和解析时使用的编码必须一致,才不会有乱码问题

<?xml version="1.0" encoding="utf-8" standalone="yes" />--standalone属性用来指明当前xml是否是一个独立的xml,默认值是yes表明当前文档不需要依赖于其他文档,如果当前文档依赖其他文档而存在则需要将此值设置为no

2.元素

一个xml标签就是一个元素

一个标签分为开始标签和结束标签

在开始标签和结束标签之间可以包含文本内容,这样的文本内容叫做标签体

如果标签的开始标签和结束标签之间不包含标签和子标签则可以将开始标签和结束标签进行合并,这样的标签就叫做自闭标签

一个标签中也可以包含任意多个子标签,但是一定要注意标签一定要合理嵌套

一个格式良好的xml要包含并且只能包含一个根标签,其他的标签都应该是这个标签的子孙标签

区分大小写,例如,<P>和<p>是两个不同的标记。

不能以数字或标点符号或"_"开头。

不能以xml(或XML、或Xml 等)开头。

不能包含空格

名称中间不能包含冒号(:)。

3.属性

一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

<china capital="beijing"/>

属性的名在定义时要遵循和xml元素相同的命名规则

属性的值需要用单引号或双引号括起来

4. 注释

<!-- 注释内容 -->

注释可以出现在xml文档的任意位置除了整个文档的最前面.不能出现在文档声明之前

注释不能嵌套注释

5.CDATA区/转义字符

<![CDATA[转义的内容]]>:

当XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住

当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析

语法:<![CDATA[ 内容 ]]>

转义字符:

&  --> &amp;

<  --> &lt;

>  --> &gt;

"  --> &quot;

‘  --> &apos;

6.处理指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

<?xml-stylesheet type="text/css" href="1.css"?>

二、dtd语法 --- 了解语法,看得懂dtd就可以

1.如何在xml中引入dtd

(1)外部引入

可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd而文件保存时必须用utf-8编码保存.

再在xml文件中使用

<!DOCTYPE 根元素名称  SYSTEM 文件的位置>

如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置

<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明dtd的名字和dtd所在网络位置URL地址

(2)内部引入

直接在xml中书写dtd

<!DOCTYPE 根元素名称[

dtd约束....

]>

2.dtd语法

(1)元素

<!ELEMENT 元素名称 元素约束>

元素约束:

存放类型:ANY/EMPTY

元素约束:子元素的列表,将可以包含的子元素用小括号括起来

子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现

子元素之间可以使用竖线进行分割,表面子元素出现其中之一

#PCDATA 表明包含标签体

+ 表示一次或多次

* 0次或多次

? 0次或一次

也可以使用小括号进行组的操作

(2)属性

<!ATTLIST 元素名

属性名 属性类型 属性约束

属性名2 属性类型  属性约束

......

>

属性类型:

CDATA:表示属性的值是一个普通字符串

ENUMERATED : 属性的值是一个枚举列表中的值

ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,不能使用数字,不能出现空白字符

属性约束:

#REQUIRED  ---      表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错

#IMPLIED --- 表明当前属性是一个可选的属性,可以有也可以没有

#FIXED ‘固定值‘ --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值.如果这样的属性指定了一个不是固定值的值则校验报错

‘默认值‘  ---  表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值

(3)ENTITY(实体)

<!ENTITY >,就是对一大段内容的引用,可以简化代码的复用

引用实体:在xml中引用的实体叫做引用实体

<!ENTITY 实体名称 “实体内容” >

&实体名称;

参数实体:在dtd中引用的实体叫做参数实体

<!ENTITY % 实体名称 "实体内容">

%实体名称;

三、XML编程:利用java程序去增删改查(CRUD)xml中的数据

解析思想:

dom解析

sax解析

基于这两种解析思想市面上就有了很多的解析api

sun jaxp既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式.但是这种解析方式效率低下,没什么人用.

dom4j 可以使用dom方式高效的解析xml.

pull

!!dom4j

导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导入缺少的包即可

四、Schema -- xml的约束技术  --- 需要掌握名称空间的概念,会读简单的Schema就可以了,不需要大家自己会写

Schema是xml的约束技术,出现的目的是为了替代dtd

本身也是一个xml,非常方便使用xml的解析引擎进行解析

对名称空间有非常好的支持

支持更多的数据类型,并且支持用户自定义数据类型

可以进行语义级别的限定,限定能力大大强于dtd

相对于dtd不支持实体

相对于dtd复杂的多,学习成本比较的高

如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.

~~~ Schema的语法---参照Schema的文档,了解即可

一、xml语法

1.文档声明

用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml

通常一个xml都要包含并且只能包含一个文档声明

xml的文档必须在整个xml的最前面,在文档声明之前不能有任何内容

<?xml version="1.0" ?>--version是必须存在的属性,表明当前xml所遵循规范的版本,目前位置都写1.0就可以了

<?xml version="1.0" encoding="utf-8" ?>--encoding用来只会解析引擎在解析xml时使用的编码,一定要保证xml格式的数据在保存时使用的编码和解析时使用的编码必须一致,才不会有乱码问题

<?xml version="1.0" encoding="utf-8" standalone="yes" />--standalone属性用来指明当前xml是否是一个独立的xml,默认值是yes表明当前文档不需要依赖于其他文档,如果当前文档依赖其他文档而存在则需要将此值设置为no

2.元素

一个xml标签就是一个元素

一个标签分为开始标签和结束标签

在开始标签和结束标签之间可以包含文本内容,这样的文本内容叫做标签体

如果标签的开始标签和结束标签之间不包含标签和子标签则可以将开始标签和结束标签进行合并,这样的标签就叫做自闭标签

一个标签中也可以包含任意多个子标签,但是一定要注意标签一定要合理嵌套

一个格式良好的xml要包含并且只能包含一个根标签,其他的标签都应该是这个标签的子孙标签

区分大小写,例如,<P>和<p>是两个不同的标记。

不能以数字或标点符号或"_"开头。

不能以xml(或XML、或Xml 等)开头。

不能包含空格

名称中间不能包含冒号(:)。

3.属性

一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

<china capital="beijing"/>

属性的名在定义时要遵循和xml元素相同的命名规则

属性的值需要用单引号或双引号括起来

4. 注释

<!-- 注释内容 -->

注释可以出现在xml文档的任意位置除了整个文档的最前面.不能出现在文档声明之前

注释不能嵌套注释

5.CDATA区/转义字符

<![CDATA[转义的内容]]>:

当XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住

当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析

语法:<![CDATA[ 内容 ]]>

转义字符:

&  --> &amp;

<  --> &lt;

>  --> &gt;

"  --> &quot;

‘  --> &apos;

6.处理指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

<?xml-stylesheet type="text/css" href="1.css"?>

二、dtd语法 --- 了解语法,看得懂dtd就可以

1.如何在xml中引入dtd

(1)外部引入

可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd而文件保存时必须用utf-8编码保存.

再在xml文件中使用

<!DOCTYPE 根元素名称  SYSTEM 文件的位置>

如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置

<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明dtd的名字和dtd所在网络位置URL地址

(2)内部引入

直接在xml中书写dtd

<!DOCTYPE 根元素名称[

dtd约束....

]>

2.dtd语法

(1)元素

<!ELEMENT 元素名称 元素约束>

元素约束:

存放类型:ANY/EMPTY

元素约束:子元素的列表,将可以包含的子元素用小括号括起来

子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现

子元素之间可以使用竖线进行分割,表面子元素出现其中之一

#PCDATA 表明包含标签体

+ 表示一次或多次

* 0次或多次

? 0次或一次

也可以使用小括号进行组的操作

(2)属性

<!ATTLIST 元素名

属性名 属性类型 属性约束

属性名2 属性类型  属性约束

......

>

属性类型:

CDATA:表示属性的值是一个普通字符串

ENUMERATED : 属性的值是一个枚举列表中的值

ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,不能使用数字,不能出现空白字符

属性约束:

#REQUIRED  ---      表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错

#IMPLIED --- 表明当前属性是一个可选的属性,可以有也可以没有

#FIXED ‘固定值‘ --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值.如果这样的属性指定了一个不是固定值的值则校验报错

‘默认值‘  ---  表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值

(3)ENTITY(实体)

<!ENTITY >,就是对一大段内容的引用,可以简化代码的复用

引用实体:在xml中引用的实体叫做引用实体

<!ENTITY 实体名称 “实体内容” >

&实体名称;

参数实体:在dtd中引用的实体叫做参数实体

<!ENTITY % 实体名称 "实体内容">

%实体名称;

三、XML编程:利用java程序去增删改查(CRUD)xml中的数据

解析思想:

dom解析

sax解析

基于这两种解析思想市面上就有了很多的解析api

sun jaxp既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式.但是这种解析方式效率低下,没什么人用.

dom4j 可以使用dom方式高效的解析xml.

pull

!!dom4j

导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导入缺少的包即可

四、Schema -- xml的约束技术  --- 需要掌握名称空间的概念,会读简单的Schema就可以了,不需要大家自己会写

Schema是xml的约束技术,出现的目的是为了替代dtd

本身也是一个xml,非常方便使用xml的解析引擎进行解析

对名称空间有非常好的支持

支持更多的数据类型,并且支持用户自定义数据类型

可以进行语义级别的限定,限定能力大大强于dtd

相对于dtd不支持实体

相对于dtd复杂的多,学习成本比较的高

如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.

~~~ Schema的语法---参照Schema的文档,了解即可

时间: 2024-10-30 09:54:09

Xml、Dtd的相关文章

XML、DTD、Schema、dom4j解析

XML:可扩展的标记语言 XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的. XML语法: XML文档声明 1.文档声明必须为<?xml开头,以?>结束; 2.文档声明必须从文档的0行0列位置开始: 3.文档声明只有属性: a) versioin:指定XML文档版本. b) encoding:指定当前文档的编码.可选属性,默认值是.utf-8: 元素element 1.元素是XML文档中最重要的组成部分, 2.普通元素的结构开始标签.元素体.结束标

二、XML的DTD和Schema

  1.DTD简单介绍   2.schema入门 schema出现的目的是通过一个更加合理的方式来编写xml的限制文件(基于xml语法的方式) schema可以使用命名空间来支持多个名称相同的元素 schema可以很好的完成对java或者所有对象的修饰并且提供了大量的数据类型     2.1.命名空间 在xml中引入schema 通过文件路径引入     2.2.元素和属性     2.3.相关约束   3.深入schema     3.1.数据模型的创建     3.2.相关的设计方案    

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

Java 模拟servlet执行、DTD约束、Schema约束、dom4j解析(读写xml)

模拟servlet执行 浏览器请求WEB服务器上的资源,WEB服务器返回给浏览器 浏览器的入口不同(访问路径),访问的资源也不同. 我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析. XML(不同路径(/hello)执行不同的资源( HeIIoMyServlet)) XML可扩展的标记语言  标签可自定义的 包下创建xml 文件   new → other  →  XMLFile 粘贴web-app_ 2_ 3.dtd文件 复制web-app_

XML的DTD约束

DTD约束:DTD的声明和引用 1.内部DTD文档 <!DOCTYPE 根元素 [定义内容]> 2.外部DTD文档 <!DOCTYPE 根元素 SYSTEM "DTD文件路径"> 或者 <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">  3.DTD元素基本语法: <!ELEMENT 元素名称  类别> 或 <!ELEMENT 元素名称 (元素内容)> -

利用mybatis generator插件反向生成Dao、Mapper.xml、pojo(通过maven)

直接进入主题,由于项目选择的利用maven构建,所以选择了利用maven的生成方式.(还有一种可自行百度) 一.在pom.xml中添加插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configur

jdom dom4j解析xml不对dtd doctype进行验证(转)

一.写在所有之前:因为dom4j和jdom在这个问题上处理的方法是一模一样的,只是一个是SAXBuilder 一个SAXReader,这里以jdom距离,至于dom4j只需要同理替换一下就可以了.二.问题发生的情况当你用jdom读取一个有dtd验证的xml文件,同时你的网络是不通的情况下.会出现以下错误:1,代码如下 package dom;import java.io.File;import org.jdom.Document;import org.jdom.input.SAXBuilder;

【PHP XML与dtd概述【完整版】】

一.XML文件简介 关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序. XML可以当做配置文件使用,还可以充当小型的数据库. version:文档符合xml1.0规范,我们学习的一般都是1.0encoding:文档字符编码,比如gb2312,一般使用utf-8standalone:文档定义是否独立使用standalone="yes",表名文档独立使用standalone="no":默认 XML文档有且

XML之------DTD(文档类型定义)

一.DTD概述 1.XML文档是一种元标记语言,即一种定义标记语言的语言.在XML中可以创建新的标记语言,这些新的标记语言(也叫标记集)要通过文档类型定义(Document Type Definitions,DTD)来定义. 2.DTD文档是这些新的标记语言的法律性文档.如果XML文档的语法符合DTD的定义和规定,那么就称为一个合法的XML文档,否则就是非法的XML文档. 二.DTD的作用 DTD定义了文档的逻辑结构,规定了文档中所使用的元素.实体.元素的属性.元素与实体之间的关系. 1.使用D