基础知识:
## 1、xml:
XML 指可扩展标记语言
XML 被设计用来传输和存储数据
HTML 被设计用来显示数据
XML与HTML的主要差异:
XML不是HTML的替代。
XML和HTML为不同的目的而设计:
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。
一个 XML 文档实例
XML 使用简单的具有自我描述性的语法:
```
<?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 声明
```<note>``` 描述文档的根元素
接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body)
最后一行 ```</note>``` 定义根元素的结尾
XML 语法规则:
所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 必须正确地嵌套
XML 必须正确地嵌套
XML 的属性值须加引号
实体引用
在 XML 中,一些字符拥有特殊的意义。
如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。为了避免这个错误,请用实体引用来代替 "<" 字符:
```
<message>if salary < 1000 then</message>
```
在 XML 中,有 5 个预定义的实体引用:
```
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
```
## 2、DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
01、内部的 DOCTYPE 声明
假如 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>
```
以上 DTD 解释如下:
!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" 类型
02、外部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
```
<!DOCTYPE 根元素 SYSTEM "文件名">
```
这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:
```
<?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>
```
这是包含 DTD 的 "note.dtd" 文件:
```
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
```
XML 文档构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
元素是 XML 以及 HTML 文档的主要构建模块。
属性可提供有关元素的额外信息。
实体是用来定义普通文本的变量。实体引用是对实体的引用。
大多数同学都了解这个 HTML 实体引用:" "。这个“无折行空格”实体在 HTML 中被用于在某个文档中插入一个额外的空格。
当文档被 XML 解析器解析时,实体就会被展开。
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
以下用案例重点说明下实体:
01、一个内部实体声明
语法:
```
<!ENTITY 实体名称 "实体的值">
```
例子:
DTD 例子:
```
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
```
XML 例子:
```
<author>&writer;©right;</author>
```
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
02、一个外部实体声明
语法:
```
<!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>
```
### 3、XML Schema
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD:
定义可出现在文档中的元素<br>
定义可出现在文档中的属性<br>
定义哪个元素是子元素<br>
定义子元素的次序<br>
定义子元素的数目<br>
定义元素是否为空,或者是否可包含文本<br>
定义元素和属性的数据类型<br>
定义元素和属性的默认值以及固定值<br>
下面这个例子是一个名为 "note.xsd" 的 XML Schema 文件,它定义了上面那个 XML 文档的元素:
```
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
```
note 元素是一个复合类型,因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素。您将在下面的章节学习更多有关复合类型和简易类型的知识。
此文件包含对 XML Schema 的引用:
```
<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
```
<schema> 元素是每一个 XML Schema 的根元素,<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:
```
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
...
</xs:schema>
```
代码解释:
显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema" 。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:
```
xmlns:xs="http://www.w3.org/2001/XMLSchema"
```
显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。
```
targetNamespace="http://www.w3school.com.cn"
```
指出默认的命名空间是 "http://www.w3school.com.cn"。
```
xmlns="http://www.w3school.com.cn"
```
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
```
elementFormDefault="qualified"
```
在 XML 文档中引用 Schema:
```
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
```
代码解释:
下面的片断:
```
xmlns="http://www.w3school.com.cn"
```
规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。
一旦您拥有了可用的 XML Schema 实例命名空间:
```
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
```
您就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:
```
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
```
## 注:学习XXE漏洞需要一定的xml基础知识,以上摘自w3c文档,详细教程参考w3c
[XML教程](http://www.w3school.com.cn/xml/index.asp)
[DTD](http://www.w3school.com.cn/dtd/index.asp)
[XSD](http://www.w3school.com.cn/schema/index.asp)
[XSLT](http://www.w3school.com.cn/xsl/index.asp)
[XML DOM](http://www.w3school.com.cn/xmldom/index.asp)