16.XML語法、CDATA、約束(DTD、Schema)講解

 xml主要用來描述數據,好比配置文件,網絡之間傳輸數據等,而且在android中也常常用xml來佈局,,接下來便來學習xml經常使用的東西java

1.XML語法android

xml語法分爲: 安全

1.1 文檔聲明網絡

  • 必須位於文檔第一行,用來聲明當前版本、編碼格式以及standlane,若是沒有編碼格式,折則默認爲utf-8,好比爲<?xml version="1.0" encoding="UTF-8"?>

1.2 元素less

  • 元素能夠包含子元素,文本內容,或者元素屬性.
  • 元素名稱不能以數字、標點或者xml(包括任意大小寫)開頭,而且不能包含空格和冒號

好比包含demo文本內容的title元素 :<title>demo</title>eclipse

不包含文本的元素:<title></title>函數

1.3 元素屬性佈局

  • 一個元素能夠有多個屬性,每一個屬性都有它本身的名稱name和取值value.
  • 屬性值value必須是引號引發來的,而且屬性名name不能重複

好比:<person name="張三">post

1.4 註釋學習

  • 在xml聲明以前不能有註釋
  • 註釋語法爲:<!—這是註釋-->
  • 註釋不能有嵌套,好比這樣使用嵌套是出錯的: <!—這是註釋<!--在嵌套個註釋-->-->
  • 在eclipse裏能夠經過ctrl+shift+/快捷鍵來快速打出註釋

1.5 CDATA區

  • 位於CDATA 區段中的文本會被解析器忽略,不會去解析
  • CDATA內容不能包含字符串 "]]>"。也不容許嵌套的 CDATA 部分。
  • 標記 CDATA內容結尾的 "]]>" 不能包含空格或換行。
  • CDATA語法爲:<![CDATA[   內容  ]]>

由於在XML元素中, 字符都會被解析器解析出來,像<>&" 這樣的字符會被直接報錯,示例以下圖所示:

 

因此若是使用元素沒法知足數據信息時,則能夠經過CDATA來實現,CDATA通常用來存儲函數方法,CSS.大量文本等,好比:

<![CDATA[
    body {
      background: rgb(11,253,216);
    }
]]> 

1.6 轉義字符

因爲在XML元素中, 使用<>&" 這樣的字符會被直接報錯,除了經過CDATA區替代外,咱們還能夠經過轉義字符來實現.

若要在元素中強制使用,須要轉義的字符(包括;)有: 

  • & :   "&amp; ",quotation mark的縮寫
  • < :      "&lt; ",less-than的縮寫
  • > :   "&gt; ", greater than的縮寫
  • "  :  "&quot; ", quote的縮寫
  • '  :   "&apos; ",apostrophe的縮寫

示例以下:

 

 

2.XML約束

若是xml格式出現出錯,則程序將不能正確獲取文件內容,爲了保證數據的規範性和安全性,因此能夠編寫一個約束文檔來約束xml的書寫規範,約束文檔能夠規範xml中出現的指定元素名稱,屬性以及出現的順序.

經常使用的約束有兩種:

  • DTD約束      :語法簡潔,共能比較單一,若是是外部引用,則編碼格式只能爲utf-8編碼,後綴名爲.dtd
  • Schema約束:語法複雜,功能比較強大,後綴名爲.xsd,他是新的xml文檔約束,替代DTD的

 

3.DTD約束

DTD 可被聲明於 XML 文檔中,也可做爲一個外部引用。

3.1 聲明於 XML 文檔

若是內部使用,則能夠直接在文檔聲明下面寫.格式爲"<!DOCTYPE 根元素名稱 [ 約束內容 ]>"

示例以下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE persons [
    <!ELEMENT persons (person+)>
    <!ELEMENT person (年齡,性別,其它信息)>
    <!ELEMENT 年齡 (#PCDATA)>
    <!ELEMENT 性別 (#PCDATA)>
    <!ELEMENT 其它信息 (#PCDATA)>
    <!ATTLIST person
        姓名 ID #REQUIRED
        國籍 (中國|外國) #IMPLIED
        特色 CDATA "吃睡學習"
        動物級別  CDATA  #FIXED  "高級動物"
        >
    <!ENTITY zhangsanMsgUrl "person/id43645.com">
]>

<persons>
    <person 姓名="zhangsan" 國籍="中國" >
        <年齡>21</年齡>
        <性別></性別>
        <其它信息>zhangsanMsgUrl </其它信息>
    </person>  

    <person  姓名="lisi" 特色="吃喝玩樂" >
        <年齡>21</年齡>
        <性別></性別>
        <其它信息> person/id9945.com </其它信息>
    </person>
</persons>

上面的示例,出現了!ELEMENT、!ATTLIST、#REQUIRED等等DTD約束的關鍵字,接下來咱們便來看看這些關鍵字的做用

!ELEMENT-元素定義

ELEMENT關鍵字用來聲明一個XML元素,語法:<!ELEMENT 元素名稱  (使用規則)>

使用規則說明:

  • 以逗號,分開 : 表示該元素裏的子元素必須按照順序來寫,因此上面示例的person內的子元素順序爲:年齡,性別,其它信息,若是沒有逗號則表示該元素只能包含指定的子                         元素,好比"<!ELEMENT person (年齡)>"表示person元素裏只能有"年齡"子元素
  • #PCDATA : 表示元素內容只能是文本,因此上面示例的年齡元素內只能是文本,不能包含子元素.
  • + :   表示子元素至少出現一次,因此上面persons裏的person能夠有多個.
  • ? :  表示子元素出現0次或1次
  • * :   表示子元素無關緊要
  • EMPTY:  表示元素的主體爲空
  • ANY:  表示元素的內容爲任意類型
  • 以|分開 :  表示子元素任選其一

!ATTLIST-屬性定義

ATTLIST關鍵字用來約束某個元素的屬性信息語法:

<!ATTLIST 元素名稱
      屬性名 屬性值類型  約束
      屬性名 屬性值類型  約束
      ......
> 

屬性值類型說明

  • ID:  表示屬性的取值不能重複(不能與其它相同屬性的值一致),不能只寫數字
  • 以|分開 :  表示屬性值任選其一,若是約束爲#IMPLIED時,則能夠忽略不用選
  • CDATA:表示屬性值爲文本字符串。

約束說明

  • #REQUIRED:  表示該屬性必須出現
  • #IMPLIED:  表示該屬性無關緊要。
  • "字符串":     表示屬性的取值爲默認值。
  • #FIXED "字符串": 表示該屬性的取值爲一個固定字符串值

 

3.2 DTD做爲外部引用

若是在xml中要使用外部文件的DTD約束,則須要在聲明下面寫入聲明的根元素名以及DTD文件名,格式爲"<!DOCTYPE 根元素名稱  SYSTEM  "文件名稱.dtd">"

示例,將3.1的內部使用改成外部引用 persons.xml文件以下:

<?xml version="1.0" encoding="utf-8"?>
"<!DOCTYPE persons  SYSTEM  "persons.dtd">"
<persons>
         <person 姓名="zhangsan" 國籍="中國" >
                  <年齡>21</年齡>
                  <性別></性別>
                  <其它信息>zhangsanMsgUrl </其它信息>
         </person>      

         <person  姓名="lisi" 特色="吃喝玩樂" >
                  <年齡>21</年齡>
                  <性別></性別>
                  <其它信息> person/id9945.com </其它信息>
         </person>
</persons>

persons.dtd文件以下:

<!ELEMENT persons (person+)>
<!ELEMENT person (年齡,性別,其它信息)>
<!ELEMENT 年齡 (#PCDATA)>
<!ELEMENT 性別 (#PCDATA)>
<!ELEMENT 其它信息 (#PCDATA)>
<!ATTLIST person
         姓名 ID #REQUIRED
         國籍 (中國|外國) #IMPLIED
         特色 CDATA "吃睡學習"
         動物級別  CDATA  #FIXED  "高級動物"
         >
<!ENTITY zhangsanMsgUrl "person/id43645.com">

 

4.Schema約束

  • XML Schema是基於 XML 的 DTD 替代者
  • XML Schema 符合XML語法結構,而且是可擴展的,後綴名爲.xsd(xml schema document)
  • XML Schema更容易地描述容許的文檔內容,以及約束定義, 並支持名稱空間.

4.1 示例-建立personSchema.xsd

在eclipse中,點擊File->new->other,而後建立XML Schema File文件,名字爲personSchema.xsd.內容以下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"    
xmlns="http://www.example.org/personSchema"
targetNamespace="http://www.example.org/personSchema"
elementFormDefault="qualified">                            <!--講解1-->
 <xs:element name='persons'>                               <!--約束xml根元素爲persons-->
    <xs:complexType>                                       <!--complexType:定義persons爲複合元素-->
        <xs:sequence maxOccurs='unbounded '>               <!--講解2-->
            <xs:element name='person'>                     <!--約束persons下的子元素名字必須爲person-->  
                <xs:complexType>
                   <xs:sequence>                          <!--sequence:必須按照順序實現:先有姓名,最後年齡.-->
                       <xs:element name='姓名' type='xs:string' />
                       <xs:element name='性別' type='xs:string' />
                       <xs:element name='年齡' type='xs:string' />
                   </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
 </xs:element>
</xs:schema>

講解1:

xmlns:xs=http://www.w3.org/2001/XMLSchema

xmlns=http://www.example.org/personSchema

targetNamespace="http://www.example.org/personSchema"

講解2:

<xs:sequence maxOccurs='unbounded'>

  • sequence表示必須按照順序實現, maxOccurs='unbounded'表示能夠有多個相同的,好比上面就是表示persons裏能夠有多個person.

 

4.2 示例-建立對應的XML

而後在eclips中點擊 File->new->other,而後建立XML文件,名字爲person.xml,而後點擊next,而後選擇建立基於schema的XML:

 

再選擇咱們剛剛寫好的personSchema.xsd:

 

而後設置文件名爲person.xml,且內容以下:

<?xml version="1.0" encoding="UTF-8"?>
<p:persons xmlns:p="http://www.example.org/personSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">
  <p:person>
    <p:姓名>p:張三</p:姓名>
    <p:性別>p:男</p:性別>
    <p:年齡>p:22</p:年齡>
  </p:person>
  <p:person>
    <p:姓名>p:李四</p:姓名>
    <p:性別>p:男</p:性別>
    <p:年齡>p:17</p:年齡>
  </p:person>
</p:persons>

xmlns:p="http://www.example.org/personSchema"

  • 代表此schema中使用的前綴爲p:的元素和數據類型來自於"http://www.example.org/personSchema"名稱空間

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • 指定定義的XML實例名稱空間規範格式.默認都以這個2001版本爲使用

xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">

  • 指定咱們使用的"http://www.w3.org/2001/XMLSchema"名稱空間的約束格式爲personSchema.xsd約束文件的內容(也就是說該xml被personSchema.xsd所約束)

 

4.3 驗證

以下圖所示,假如咱們不按照personSchema.xsd約束來寫XML,則直接出現error:

 

 

未完待續,下章學習java解析xml

相關文章
相關標籤/搜索