基礎(chǔ)知識(shí):
## 1、xml:
XML 指可擴(kuò)展標(biāo)記語(yǔ)言
XML 被設(shè)計(jì)用來(lái)傳輸和存儲(chǔ)數(shù)據(jù)
HTML 被設(shè)計(jì)用來(lái)顯示數(shù)據(jù)
XML與HTML的主要差異:
XML不是HTML的替代。
XML和HTML為不同的目的而設(shè)計(jì):
XML被設(shè)計(jì)為傳輸和存儲(chǔ)數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的內(nèi)容。
HTML被設(shè)計(jì)用來(lái)顯示數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的外觀。
HTML旨在顯示信息,而XML旨在傳輸信息。
一個(gè) XML 文檔實(shí)例
XML 使用簡(jiǎn)單的具有自我描述性的語(yǔ)法:
```
<?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>``` 描述文檔的根元素
接下來(lái) 4 行描述根的 4 個(gè)子元素(to, from, heading 以及 body)
最后一行 ```</note>``` 定義根元素的結(jié)尾
XML 語(yǔ)法規(guī)則:
所有 XML 元素都須有關(guān)閉標(biāo)簽
XML 標(biāo)簽對(duì)大小寫敏感
XML 必須正確地嵌套
XML 必須正確地嵌套
XML 的屬性值須加引號(hào)
實(shí)體引用
在 XML 中,一些字符擁有特殊的意義。
如果你把字符 "<" 放在 XML 元素中,會(huì)發(fā)生錯(cuò)誤,這是因?yàn)榻馕銎鲿?huì)把它當(dāng)作新元素的開(kāi)始。為了避免這個(gè)錯(cuò)誤,請(qǐng)用實(shí)體引用來(lái)代替 "<" 字符:
```
<message>if salary < 1000 then</message>
```
在 XML 中,有 5 個(gè)預(yù)定義的實(shí)體引用:
```
< < 小于
> > 大于
& & 和號(hào)
' ' 單引號(hào)
" " 引號(hào)
```
## 2、DTD
文檔類型定義(DTD)可定義合法的XML文檔構(gòu)建模塊。它使用一系列合法的元素來(lái)定義文檔的結(jié)構(gòu)。
DTD 可被成行地聲明于 XML 文檔中,也可作為一個(gè)外部引用。
01、內(nèi)部的 DOCTYPE 聲明
假如 DTD 被包含在您的 XML 源文件中,它應(yīng)當(dāng)通過(guò)下面的語(yǔ)法包裝在一個(gè) DOCTYPE 聲明中:
<!DOCTYPE 根元素 [元素聲明]>
一個(gè)實(shí)例:
```
<?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 元素有四個(gè)元素:"to、from、heading,、body"
!ELEMENT to (第四行)定義 to 元素為 "#PCDATA" 類型
!ELEMENT from (第五行)定義 from 元素為 "#PCDATA" 類型
!ELEMENT heading (第六行)定義 heading 元素為 "#PCDATA" 類型
!ELEMENT body (第七行)定義 body 元素為 "#PCDATA" 類型
02、外部文檔聲明
假如 DTD 位于 XML 源文件的外部,那么它應(yīng)通過(guò)下面的語(yǔ)法被封裝在一個(gè) DOCTYPE 定義中:
```
<!DOCTYPE 根元素 SYSTEM "文件名">
```
這個(gè) XML 文檔和上面的 XML 文檔相同,但是擁有一個(gè)外部的 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 文檔構(gòu)建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡(jiǎn)單的構(gòu)建模塊構(gòu)成:
元素
屬性
實(shí)體
PCDATA
CDATA
元素是 XML 以及 HTML 文檔的主要構(gòu)建模塊。
屬性可提供有關(guān)元素的額外信息。
實(shí)體是用來(lái)定義普通文本的變量。實(shí)體引用是對(duì)實(shí)體的引用。
大多數(shù)同學(xué)都了解這個(gè) HTML 實(shí)體引用:" "。這個(gè)“無(wú)折行空格”實(shí)體在 HTML 中被用于在某個(gè)文檔中插入一個(gè)額外的空格。
當(dāng)文檔被 XML 解析器解析時(shí),實(shí)體就會(huì)被展開(kāi)。
PCDATA
PCDATA 的意思是被解析的字符數(shù)據(jù)(parsed character data)。
可把字符數(shù)據(jù)想象為 XML 元素的開(kāi)始標(biāo)簽與結(jié)束標(biāo)簽之間的文本。
PCDATA 是會(huì)被解析器解析的文本。這些文本將被解析器檢查實(shí)體以及標(biāo)記。
文本中的標(biāo)簽會(huì)被當(dāng)作標(biāo)記來(lái)處理,而實(shí)體會(huì)被展開(kāi)。
不過(guò),被解析的字符數(shù)據(jù)不應(yīng)當(dāng)包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 實(shí)體來(lái)分別替換它們。
CDATA
CDATA 的意思是字符數(shù)據(jù)(character data)。
CDATA 是不會(huì)被解析器解析的文本。在這些文本中的標(biāo)簽不會(huì)被當(dāng)作標(biāo)記來(lái)對(duì)待,其中的實(shí)體也不會(huì)被展開(kāi)。
以下用案例重點(diǎn)說(shuō)明下實(shí)體:
01、一個(gè)內(nèi)部實(shí)體聲明
語(yǔ)法:
```
<!ENTITY 實(shí)體名稱 "實(shí)體的值">
```
例子:
DTD 例子:
```
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
```
XML 例子:
```
<author>&writer;©right;</author>
```
注釋: 一個(gè)實(shí)體由三部分構(gòu)成: 一個(gè)和號(hào) (&), 一個(gè)實(shí)體名稱, 以及一個(gè)分號(hào) (;)。
02、一個(gè)外部實(shí)體聲明
語(yǔ)法:
```
<!ENTITY 實(shí)體名稱 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 文檔的結(jié)構(gòu)。
XML Schema 語(yǔ)言也稱作 XML Schema 定義(XML Schema Definition,XSD)。
XML Schema 的作用是定義 XML 文檔的合法構(gòu)建模塊,類似 DTD:
定義可出現(xiàn)在文檔中的元素<br>
定義可出現(xiàn)在文檔中的屬性<br>
定義哪個(gè)元素是子元素<br>
定義子元素的次序<br>
定義子元素的數(shù)目<br>
定義元素是否為空,或者是否可包含文本<br>
定義元素和屬性的數(shù)據(jù)類型<br>
定義元素和屬性的默認(rèn)值以及固定值<br>
下面這個(gè)例子是一個(gè)名為 "note.xsd" 的 XML Schema 文件,它定義了上面那個(gè) 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 元素是一個(gè)復(fù)合類型,因?yàn)樗渌淖釉?。其他元?(to, from, heading, body) 是簡(jiǎn)易類型,因?yàn)樗鼈儧](méi)有包含其他元素。您將在下面的章節(jié)學(xué)習(xí)更多有關(guān)復(fù)合類型和簡(jiǎn)易類型的知識(shí)。
此文件包含對(duì) 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> 元素是每一個(gè) XML Schema 的根元素,<schema> 元素可包含屬性。一個(gè) 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 中用到的元素和數(shù)據(jù)類型來(lái)自命名空間 "http://www.w3.org/2001/XMLSchema" 。同時(shí)它還規(guī)定了來(lái)自命名空間 "http://www.w3.org/2001/XMLSchema" 的元素和數(shù)據(jù)類型應(yīng)該使用前綴 xs:
```
xmlns:xs="http://www.w3.org/2001/XMLSchema"
```
顯示被此 schema 定義的元素 (note, to, from, heading, body) 來(lái)自命名空間: "http://www.w3school.com.cn"。
```
targetNamespace="http://www.w3school.com.cn"
```
指出默認(rèn)的命名空間是 "http://www.w3school.com.cn"。
```
xmlns="http://www.w3school.com.cn"
```
指出任何 XML 實(shí)例文檔所使用的且在此 schema 中聲明過(guò)的元素必須被命名空間限定。
```
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"
```
規(guī)定了默認(rèn)命名空間的聲明。此聲明會(huì)告知 schema 驗(yàn)證器,在此 XML 文檔中使用的所有元素都被聲明于 "http://www.w3school.com.cn" 這個(gè)命名空間。
一旦您擁有了可用的 XML Schema 實(shí)例命名空間:
```
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
```
您就可以使用 schemaLocation 屬性了。此屬性有兩個(gè)值。第一個(gè)值是需要使用的命名空間。第二個(gè)值是供命名空間使用的 XML schema 的位置:
```
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
```
## 注:學(xué)習(xí)XXE漏洞需要一定的xml基礎(chǔ)知識(shí),以上摘自w3c文檔,詳細(xì)教程參考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)