一、xml的基本文法、
1.XML文檔隻能包含一個根元素。XML文檔的根元素是包含所有被視為文檔本身内容的單個元素。根元素是在文檔的序言碼部分後出現的第一個元素,它也稱為文檔元素。
2.所有XML元素必須包含結束标記。
3.元素的開始标記和結束标記的名稱必須相同。XML區分大小寫,是以結束标記名稱必須與其伴随的開始标記名稱完全比對。
4.XML元素不能重疊。如果一個元素的開始标記出現在另一個元素中,則該元素的結束标記也必須包含在其中。
5.所有屬性值都必須使用引号。屬性值必須用單引号或雙引号括起來。
6.在XML文檔的文本中不能使用“<”、“>”、“&”3個字元,這些都是對于XML分析程式具有特定含義的特殊字元。如果需要在XML文檔的文本中使用這些字元,則應使用預定義的字元或實體引用。
二、xml的基本結構
XML文檔包含7個主要部分:序言碼、處理指令、根元素、元素、屬性、CDATA節和注釋。
1.序言碼
序言碼是XML文檔的第一部分。序言碼包含XML聲明(表明該文檔是XML文檔)、處理指令(提供XML分析程式用于确定如何處理文檔的資訊)和架構聲明(确定用于驗證文檔是否有效的XML架構)。以下是XML文檔中序言碼的示例:
<?xml version="1.0" encoding="gb2312"?>
2. 處理指令
處理指令是用來給處理XML文檔的應用程式提供資訊的,XML分析器把這些資訊原封不動地傳給應用程式,由應用程式來解釋這個指令,遵照它所提供的資訊進行處理。處理指令應該遵循下面的格式:<?處理指令名 處理指令資訊?>
如:<?xml-stylesheet type="text/xsl" href="book.xsl" target="_blank" rel="external nofollow" ?>
3. 根元素
根元素是XML文檔的主要部分,它包含文檔的資料以及描述資料結構的資訊。以下是XML文檔中根元素部分的示例。
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
…
</books>
根元素中的資訊存儲在兩種類型的XML結構中:元素和屬性。XML文檔中使用的所有元素和屬性都嵌套在根元素中。
4. 元素
元素是XML文檔的基本構成單元,它用于表示XML文檔的結構和XML文檔中包含的資料。元素包含開始标記、内容和結束标記。由于XML區分大小寫,是以,開始标記和結束标記必須完全比對。以下是描述書籍資訊的示例,publish元素下有3個有關出版社的子元素。
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
元素可以包含文本、其他元素、字元引用或字元資料部分。沒有内容的元素稱為空元素。空元素的開始标記和結束标記可以合并為一個标記,例如:<sale/>
5. 屬性
屬性是使用與特定元素關聯的對應“名稱—值”的XML構造。其中包含的有關元素内容的資訊并非總是用于顯示,而是用于描述元素的某種屬性。使用等号分隔屬性名稱和屬性值,并且包含在元素的開始标記中。屬性值包含在單引号或雙引号中。以下是與book元素關聯的bookcategory等4個屬性的示例。
<books>
<book id="018" bookcategory="計算機" amount="560" remain="200" discount="8.2">
</book>
</books>
6. CDATA
在标記CDATA下,所有的辨別、實體引用都被忽略,而被XML處理程式一視同仁地作為字元資料看待。CDATA的形式如下。該标記中的代碼包括文字和标記都要當成純文字來解析,并原封不動的将這段代碼傳給下一個XML應用程式。
<![CDATA[ 文本内容 ]] >
CDATA的文本内容中不能出現字元串“]]>”,另外,CDATA不能嵌套。
7. 注釋
XML文檔可以包含注釋,也可以沒有這項内容。注釋并不由XML分析程式進行處理,但用于在文檔的XML源代碼中提供必要的說明。注釋以“<!--”開始,并以“-->”結束。在這些字元之間的文本會被XML分析程式忽略。以下是XML文檔中注釋的示例。
三、注意事項
标記名字,屬性,文檔中其他實體的字元串必須滿足以下要求
(1) 名稱的開頭必須是字母或“_”;
(2) 标記名稱中不能有空格;
(3) 名稱的字元串隻能包含英文字母、數字、“_”、“-”、“.”等字元。
标記對大小寫敏感。
四、XML中的特殊字元表
特殊字元 | 代替符号 | 特殊的原因 |
& | & | 每一個代表符号的開頭字元 |
> | > | 标記的結束字元 |
< | < | 标記的開始字元 |
" | " | 設定屬性的值 |
' | ' | 設定屬性的值 |
五、XML名稱空間
XML名稱空間提供了一套簡單的方法,将XML文檔和URI引用标記的名稱相結合,來限定其中的元素和屬性名。由此可知它通過使用URI,解決了XML文檔中标記重名的問題。
1.名稱空間的聲明
在使用名稱空間之前,必須首先進行聲明,名稱空間的聲明類似于前面元素的聲明,将一個唯一的辨別符号指定到一個URI或其他合法字元串上,使用前面定義的辨別符号作為标記的字首,表示一類标記的出處。
如:
<book:bookinfo xmlns:book="http://bestbook.jmu.edu.cn/cs/textbook">
<book:title>計算機導論</book:title>
<book:author>丁躍潮等</book:author>
<book:price>19.7</book:price>
</book:bookinfo>
xmlns是一個專門用來指定名稱空間的關鍵字,book是為了XML文檔中使用友善而随便起的一個名字,它被用來辨別字元串“http://bestbook.jmu.edu.cn/cs/textbook”。因為通常情況之下,後面的URI很長,使用起來和讀起來都很不友善,而“book”就是給該長字元串臨時起的一個簡短好用的名字,它可以是任意合法的字元串。
a.多個聲明空間的使用
注意在聲明名稱空間時可以将多個聲明結合在一起,例如下面語句:
<book:bookinfo xmlns:book1="http://bestbook.jmu.edu.cn/cs/textbook"
xmlns:book2="http://cheapbook.jmu.edu.cn/ee/textbook">
b.名稱空間的繼承性
名稱空間具有繼承性,也就是說,如果不明确聲明子元素的名稱空間,子元素将繼承父元素的名稱空間聲明。但要注意的是,在預設聲明的名稱空間範圍内,所有的元素及其子元素不加字首,而在顯示聲明的名稱空間範圍内,所有的元素及其子元素必須加字首。
如:
<?xml version="1.0" encoding="gb2312"?>
<book xmlns="http://bestbook.jmu.edu.cn/cs/textbook" xmlns:bo=" http://cheapbook.jmu.edu.cn/ee/textbook">
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<price>19.7</price>
</bookinfo>
<bo:publish>
<bo:publisher>高等教育出版社</bo:publisher>
<bo:ISBN>7-04-014768-8</bo:ISBN>
<bo:pubdate>2004.6</bo:pubdate>
</bo:publish>
</book>
2 、名稱空間的範疇
名稱空間的範疇就是名稱空間起作用的範圍。而範圍就是聲明該名稱空間的元素及該元素中所有的子元素,除非是在該元素的某一個子元素上又聲明了相同的名稱空間。
如:
<book:bookinfo xmlns:book="http://book.jmu.edu.cn/it/textbook">
<title>計算機導論</title>
<author>丁躍潮等</author>
<book:publish xmlns:book="http://bestbook.jmu.edu.cn/cs/textbook">
<book:publisher>高等教育出版社</book:publisher>
<book:ISBN>7-04-014768-8</book:ISBN>
<book:pubdate>2004.6</book:pubdate>
</book:publish>
<book:price>19.7</book:price>
</book:bookinfo>
上面的程式當中,用了同名的兩個名稱空間。第一個名稱空間的作用範圍是除了<publish>标記塊的整個文檔内容,屬于http://book.jmu.edu.cn/it/textbook名稱空間。因為<publish>标記塊的内容中使用的名稱空間為http://bestbook.jmu.edu.cn/cs/textbook,它是一個獨立的區域,第一個名稱空間的作用範圍要去除該區域。
六、DTD
定義了文檔的邏輯結構,規定了文檔中所使用的元素、實體、元素的屬性、元素與實體之間的關系。
1、作用
(1) 使用DTD可以提供一種統一的格式。
(2) 使用DTD可以保證資料交流和共享的順利進行。
(3) DTD使使用者能夠不依賴具體的資料就知道文檔的邏輯結構。
(4) 使用DTD可以驗證資料的有效性。
2、DTD元素
2.1 元素的基本類型
簡單型具有文本資料,即可析字元資料,該類型也稱為上下文中的“#PCADTA”;
複合型可以包含其他元素和文本資料。
a、簡單型
用“#PCDATA”規範了的元素不能再包含子元素。
“#PCDATA”的聲明格式:<!ELEMENT Element_Name (#PCDATA )>
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
b.複合型元素
複合型元素與簡單型元素相對,複合型元素可包含其他元素。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
2.2 元素的聲明
a. 元素聲明的基本文法
元素的聲明格式:
<ELEMENT Element_Name Element_Defination>
其中,Element_Name為聲明的元素名稱,Element_Defination為元素内容格式的定義。
合法的元素聲明語句如:
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT publisher (#PCDATA)>
b.空元素的聲明
<ELEMENT Element_Name EMPTY>
例如下面的語句:
<ELEMENT hr EMPTY>
C.不限定元素内容的聲明
ANY是DTD中使用很頻繁的一個關鍵字,特别是對于文檔根元素的聲明。在定義一個DTD文檔時通常很難準确地确定一個元素是否具有子元素的情況,此時一般的做法是指定該元素的子元素為ANY型(表示可以是任意的元素),這樣在它之中可以包含任何資料、任何聲明的子元素及其資料和子元素的組合。
ANY元素的聲明格式:<!ELEMENT Element_Name ANY>
如: <!ELEMENT person ANY>
d.子元素清單的設定
在XML中有一種針對複合元素的最為嚴格的設定方法,稱為子元素清單的設定。這種方式下,元素都擁有哪些子元素、每個子元素出現的次數和位置都有明确的規定,在具體文檔實作時,必須嚴格執行。子元素清單的設定文法如下:
<!ELEMENT Element_Name(Child_Element1, Child_Element2,…)>
其中“(Child_Element1, Child_Element2,…)”部分為Element_Name所擁有的子元素清單。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
e.可選擇的子元素
有些時候,需要在兩個或多個互斥的元素中進行選擇。即多選一的情況,如一個人的性别可以是男或女,兩者中隻能有一種情況。DTD有專門的文法來處理這種情況,其文法格式如下:
<!ELEMENT Element_Name(Child_Element1|Child_Element2|……)>
其中,“(Child_Element1|Child_Element2|…)”部分為選擇性元素組合,具體使用時必須要在這個清單中選擇其一。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher|ISBN|pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
</publish>
<price>19.7</price>
</bookinfo>
f.元素出現次數的控制
(1) 一個元素可能出現一次,也可能不出現。這時可通過在元素名後面加上一個“?”來實作。
(2) 一個元素可能不出現,也可能出現多次。這時可通過在元素名後面加上一個“*”來實作。
(3) 一個元素可能出現一次,也可能出現多次,但至少也要出現一次。這時可通過在元素名後面加上一個“+”來實作。
h.元素組
在聲明複合型元素的時候,可以使用括号将其部分子元素組合在一起,成為一個元素組,該元素組在特性上與普通元素沒什麼差別,可以對其使用“?”、“*”、“+”等控制字元。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ((title,author,price)+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<price>19.7</price>
<title>三國演義</title>
<author>羅貫中</author>
<price>50.0</price>
</bookinfo>
使用元素組可能不是最好的方案。這時也可以先将準備分組的元素定義為一個複合元素,再在原來的元素中引用剛定義的複合元素,這樣文檔的結構更清晰
如:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT maininfo (title, author, price)>
<!ELEMENT bookinfo (booknumb, maininfo+)>
<!ELEMENT booknumb (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<booknumb>2</booknumb>
<maininfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<price>19.7</price>
</maininfo>
<maininfo>
<title>三國演義</title>
<author>羅貫中</author>
<price>50.0</price>
</maininfo>
</bookinfo>
i.混合型元素
還有另一種元素,其内容既可以為字元資料,也可以為子元素,這種元素稱為混合型元素。混合型元素的聲明格式:
<!ELEMENT Element_Name (#PCDATA|Child_Element1|Child_Element2,…)>
3 DTD屬性
3.1 屬性的聲明
在DTD中,屬性的聲明格式:
<!ATTLIST Element_name Attribute_name TYPE Default_value>
其中,<!ATTLIST>為屬性聲明的關鍵字,Element_name為元素名,Attribute_name為屬性名,TYPE是屬性類型,Default_value為沒有設定屬性值時的預設值。
如:
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ATTLIST bookinfo ISBN CDATA "7-04-014768-8">
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo ISBN="7-04-014768-8">
<title>計算機導論</title>
<author>丁躍潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
a.在聲明屬性時有以下需要注意的事項。
(1) 可以多次為一個元素聲明其中所包含的屬性。如在XML文檔中有如下語句:
<bookinfo id="001" bookcategory="文藝" >
</bookinfo>
屬性聲明可以為
<!ATTLIST bookinfo id CDATA "001">
<!ATTLIST bookinfo bookcategory CDATA "文藝" >
<!ELEMENT bookinfo (#PCDATA)>
(2) 屬性的聲明在文檔中的次序沒有嚴格的要求,可位于與其相連的元素聲明之前或之後。如在XML文檔中有如下語句:
<bookinfo id="001" bookcategory="文藝" >
</bookinfo>
屬性聲明可以為
<!ATTLIST bookinfo bookcategory CDATA "文藝" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
(3) 所有元素的屬性,都要在各自所對應的标記中聲明。如在XML文檔中有如下語句:
<bookinfo id="001" bookcategory="文藝" >
</bookinfo>
<publish publisher="高等教育出版社" ISBN="7-04-014768-8">
</publish>
屬性聲明可以為
<!ATTLIST bookinfo bookcategory CDATA "文藝" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
<!ATTLIST publish publisher CDATA "高等教育出版社" >
<!ATTLIST publish ISBN CDATA "7-04-014768-8">
<!ELEMENT publish (#PCDATA)>
(4) 屬性有4種不同類型的預設值,可在屬性聲明中的Default_value部分指定。
① default:表示使用提供的預設值,default不是一個關鍵字,它代表一個預設的字元串。
<!ATTLIST bookinfo bookcategory (文藝|自然科學) "文藝" >
此例句表示當在XML文檔中省略了對bookinfo元素的bookcategory屬性值進行設定時,該屬性的預設值就是“文藝”
② #REQUIRED:表示屬性值必須指定。
③ #IMPLIED:表示元素的這個屬性可用可不用。
④ #FIXED:表示元素的這個屬性值是一個固定值,且必須是指定的值。
3.2 屬性的類型
在屬性的聲明中TYPE部分為屬性的類型設定,DTD中屬性的類型有10種,下面将對這些資料類型進行逐一的介紹。
1. CDATA型
CDATA型表明屬性值為不包含“<”和“"”的任意字元串,如果屬性值中需要包含“<”和“"”,則可使用特殊字元來代替。
2. Enumerated型
如果屬性值并不是任意的字元串,而是在幾個可能的值中進行選擇,如書籍的“類别”屬性,其值可為“文藝”,也可為“自然科學”,而不可能為其他情況時,則可以将書籍的“類别”屬性設定為Enumerated型。
如:<!ATTLIST bookinfo bookcategory (文藝|自然科學) "文藝" >
3. ID型
當元素的某個屬性值是不能重複時,如書籍的ISBN屬性、個人的“身份證号”屬性等,要定義這樣的屬性則需使用屬性的ID類型。在一個XML文檔中,所有元素的ID類型屬性的屬性值必須是唯一的,不可重複,另外,一個元素不能有超過一個ID類型的屬性。
4. IDREF與IDREFS型
IDREF為Identifier Reference的縮寫,IDREF與ID類型屬性的關系為子元素與父元素的關系,即IDREF類型屬性的值必須是其他元素的ID類型屬性的值,且該ID類型屬性的值必須在文檔的其他地方被設定過。IDREFS類型屬性的屬性值可有多個,每一個都必須是在文檔其他地方被設定了的ID類型屬性的值,而這多個屬性值之間用空格隔開。
5. ENTITY與ENTITIES型
ENTITY類型的屬性提供了把外部二進制形式的檔案(如.jpeg、.mp3等)和外部不可解析實體連結到XML文檔的功能。是以其屬性值也必須為不可解析的連結外部實際資料的通用實體名。ENTITIES類型屬性的屬性值可由多個不可解析的外部實體名稱組成,各實體名稱之間使用空格隔開。
6. NMTOKEN與NMTOKENS型
NMTOKEN類型的屬性限定屬性值是有效的XML名稱,這個屬性值可以由英文、數字、“.”、 “_”、“-”、“:”等組成,這裡有幾點需要注意。
(1) 不能包括空格。
(2) 以上字元中除“:”以外,其他字元都可以作為開頭字元。
(3) “:”可以出現在中間,但由于它是命名域的關鍵字元,是以一般不提倡使用。
正因為NMTOKEN類型的屬性對于字元的嚴格要求,使得它在一些常用程式設計語言中,都是合法的資料,這就為這些程式設計語言對XML文檔資料的操作打下了良好的基礎。
NMTOKENS類型的屬性具有與NMTOKEN屬性相近的形式。這種類型的屬性可以使如下情況合法——屬性由若幹XML名稱組成,彼此間由空格隔開。通常可為使用NMTOKEN屬性相同的理由而使用NMTOKENS屬性,但僅僅在需要多個名字的時候。
7. NOTATION型
XML文檔中引入了外部不可解析的實體後,解析器無法解析這些二進制檔案,這時,就可以使用NOTATION類型的屬性為這些二進制檔案指定與其對應的應用軟體以對其進行處理。
4 、DTD中的實體
4.1 實體的概念
實體是包含了文檔片段的虛拟存儲單元,可用來存儲XML聲明、DTD、其他形式的文本及二進制資料等。簡單來講就是一段代碼或資料的代稱,這個代稱即為實體的名字。
4.2 實體的分類
按照實體的具體内容來分類,實體可分為可解析與不可解析兩類。可解析實體的具體内容為簡單的字元、數字、文本塊,而不可解析實體的具體内容則為圖檔、聲音等二進制檔案。
按照邏輯存儲來分類,實體可分為内部實體與外部實體兩類。内部實體的内容是在文檔内部設定的;而外部實體則是一個外部獨立的實體存儲對象,如某個外部檔案。
按照使用的範圍來分類,實體可分為一般實體與參數實體兩類。一般實體都用來構成文檔的具體内容,可出現在XML文檔中,也可出現在DTD中;而參數實體隻能出現在DTD中,不能出現在XML文檔中。
1. 内部一般實體
内部一般實體就是在文檔實體内部定義和使用的實體,其内容通常是一段文本字元。這種實體要在DTD中通過DTD語句的定義,可以在XML文檔中使用,也可在DTD中使用。其定義的文法格式如:<!ENTITY Eentity_name "Replacement" >
其中,<!ENTITY>為關鍵字,Eentity_name為實體名稱,Replacement為實體所代替的文本内容。
當内部一般實體在DTD中引用時,有以下幾方面需注意。
(1) 不能在元素及屬性的聲明中引用内部一般實體
(2) 在語句中不能出現循環,
2. 外部一般實體
所謂外部一般實體就是在文檔實體以外定義的,要通過一個URL才能引用到的實體。外部一般實體為獨立的檔案,可被多個文檔所引用。正因為每一個完整的XML文檔都是一個合法的實體,是以XML通過對外部一般實體的引用,可以在一個XML文檔中嵌入另一個XML文檔,或者将多個文檔組合成一個文檔。其定義的文法格式如下:
<!ENTITY Eentity_name "URL" >
其中,URL為引用的外部實體的URL位址。引用外部一般實體也與引用内部一般實體的方法一樣:
&Eentity_name;
在引用外部一般實體時,有以下幾方面需注意。
(1) 因為在一個文檔中需引用某些外部檔案,是以該文檔聲明中的standalone屬性不再是預設值yes,而應該為no。
(2) 作為外部一般實體的文檔,若使用的是XML的預設字元集即UTF-8或UNICODE,則可以在文檔頭部不進行XML聲明,否則,必須有XML聲明,且聲明時,一定要說明encoding屬性。