XML:Extensible Markup Language, 可擴展標記語言html
特色:java
比起html來, html是顯示/樣式與數據不分離,node
而xml呢, 只顯示純數據,和樣式無關.數據庫
Html的標籤, a,br, p,div,span等等app
Html的標籤是固定的, 而xml的標籤呢,是自定義的. (自描述性)dom
每每定義的時候,是要體現內容的一個簡單描述,ide
所以,咱們說XML具備自描述性.測試
哪些場合容易見到XML?google
交換數據或傳輸數據時編碼
好比公共查詢接口,例如 豆瓣的書評查詢, google的天氣查詢
或者存儲數據時, 能夠當作小型數據庫用[在線詞典]
用來作配置文件
XML的語法規範
1:基本的XML能夠分紅3部分
文檔聲明[可選,可是強烈建議加上,並設置編碼爲utf-8]
例: <?xml version="1.0" encoding="utf-8"?>, version只能選1.0
DTD聲明[可選]
根結點:最頂層的元素,包含其餘全部元素/結點的根結點.
根結點必須有, 且只能有一個.
1.1 元素的語法規範
標籤必須閉合
標籤不容許相互嵌套
標籤名稱區分大小寫
單標籤的閉合
1.2 屬性的語法規範
屬性必有值
屬性值必用引號包起來
1.3 特殊字符與實體
在XML裏, 與xhtml裏,對於實體的概念是同樣的,
對於 &,>,< ',"要用實體來代替, & > < " '
1.4 註釋的語法
註釋寫在 <!-- 註釋寫在這裏-->
註釋內部不要出現 --
註釋不能嵌套
註釋能夠除了標記之內的任何地方寫
1.5 CDATA節, character data的縮寫,一大段字符數據
對於CDATA,原樣輸出,不用實體代替.
DTD用法
document type definition: 文檔類型定義
節點下面能夠子節點,子節點又能夠有子節點,子節點的名稱可能無限種可能.
可否對XML的節點的名稱,個數,類型等作一個限制?
答:能夠,DTD就是用來規範節點的名稱,個數,類型.
能夠理解XML文檔的"說明書".
XML文檔的結構必須符合此說明書
XML是一種通用的規範,只要知足該規範都可以來解析XML文檔,
Javascript, ActionScript,PHP,java,都有解析XML的功能或庫.
Ff, IE也能來解析XML,可是用的不相同的引擎.
用IE來幫咱們進行XML的解析和測試
DTD能夠用來規範XML的元素,屬性, 實體
2.0: DTD的基本寫法
<!DOCTYPE 根節點名稱 [
]>
2.1 DTD如何規範XML的元素?
答:
<!ELEMENT 結點名稱 結點規範> ,結點規範的4種形式,見下:
規範形式1: (子節點1,子節點2,子節點3....子節點N) ,規範的是子節點的名稱
規範形式2: (#PCDATA)
規範形式3: EMPTY
規範形式4 ANY, 若是是ANY,則結點能夠是空結點,能夠文本結點,也能夠是多層子節點,可是,若是是多層子節點,依然是要對子節點作說明.
2.2 DTD如何規範屬性
屬性名="屬性值"
該屬性是否必須有? 是否惟一? 是否只能選某幾個可能值之一? 是否有默認值?
<!ATTLIST 元素名稱
屬性1名稱 屬性類型 屬性特色
屬性2名稱 屬性類型 屬性特色
>
屬性類型:
ID ----> 若是屬性爲ID類型,則屬性的值 必須惟一
IDREF/IDREFS ---> 這個屬性的值必是文檔內某個ID屬性的值
CDATA(文本)
Enumerated(枚舉類型)
屬性特色 ------------------------------>典型寫法
#REQUIRED : 要求屬性必須有 -->#REQUIRED
#IMPLIED : 屬性可有可沒有 ---> #IMPLIED
#FIXED : 屬性值是固定的 ---> #FIXED "固定值"
Default_value : 默認值 ------> "默認值"
屬性類型 ----------------------------->典型寫法
ID :要求該屬性值必須是惟一的--------> ID
CDATA: 屬性值爲普通字符串 ----------> CDATA
IDREF: 屬性值必爲ID類型屬性的一個值----> IDREF
IDREFS:屬性是ID類型屬性的一個,或多個值----> IDREFS, 多個值用空格隔開
Enumerated: 屬性的值改成如下幾個之一, ----------> (值1|值2|值3|值N)
2.3 用DTD規範XML的實體
1實體聲明
<!ENTITY 實體名 "實體值">
2: 引用實體
&實體名;
2.4 在對元素的聲明中, 修飾符的做用
() 包在子元素外面,把子元素合成組
, 夾在子元素名稱之間,限制子元素的順序
+ ,是修飾元素的"個數"用的, + 表明 1->N個,
*, 是修改元素個數, 表明 0->N個
?, 是修飾元素個數, 表明0或1個
|, A|B|C ,從A,B,C任取一個
3. 如何生成和解析XML
經過PHP的DOM操做來生成和解析XML
3.1 , 如何實例化DOM操做類
答: $dom = new DOMDocument(1.0,'utf-8');
3.2 如何載入XML文檔
答: $dom->load('xml-path');
3.3: 若是查詢節點?
3.3.1 根據id來查詢具體節點, (要求DTD中已聲明爲ID的屬性)
例: $dom->getElementById('ID值');
3.3.2 根據已查到的節點,查其子節點, 返回的是"列表對象"
$node->childNodes 屬性就可讀到
3.3.3 根據標籤名 來查詢節點列表, 返回值是一個"列表對象"
$dom->getElementsByTagName('標籤名');
3.3.4 根據節點列表對象,查詢列表中的任意一個子節點.
$list->length 屬性能夠讀出子節點的數量來
$list->item(index), 讀取列表中第index個節點來
3.3.5 查到節點後,又如何讀取節點的值
$node->nodeValue就能夠
3.3.6 查到節點後,又如何讀取屬性的值
$node->getAttribute(屬性名) ;// 讀到屬性的值
3.4 PHPDOM建立XML
3.4.1 建立節點
$xmldom->createElement('節點名'[,節點的文本內容]),
例:->createElement('app','內容'); ---> <app>內容</app>
->crateELement('app') ----> <app></app>
3.4.2 : 如何建立屬性節點?
$node->setAttribute('屬性名','屬性值');
3.4.3 如何建立CDATA節
$dom->createCDATASection('內容');
3.4.4: 如何添加子節點
$node->appendChild(子節點);
3.5 如何刪除子節點,
父節點->removeChild(子節點)
3.6: 如何修改子節點
父節點->replaceChild(新子節點,舊子節點)
XPATH, Xquery
宇宙霹靂無敵光速查詢技術 xpath
XPATH, 的基本寫法
從根節點, 經過節點的層次來定位.
1例: 逐層定位
/cetsix/word/name -->找根節點下->word下->全部name節點, 注意: 節點層次必須緊挨着.
2: 任意層次定位
//name , 找任意層次的,name節點
// 用條件查詢, 按屬性做條件
/cetsix/word[@name="value"], 找cetsix下的word,而且word的name屬性的值是'value'
例: <word name="value"></word>
// 用條件查詢, 按子元素的值作條件
/cetsix/word[name="value"], 找cetsix下的word,而且word的name子元素的值是'value'
例: <word ><name>value</name></word>
討論
<book id="boo1">
</book>
<book>
<id>b001</id>
</book>
什麼時間用屬性? 什麼時間用元素?
商品表爲例:
商品名, 商品價格, 庫存--->這些信息商品固有的信息.
每一行商品,又加了"id"信息,
這個id信息,本來沒有, 由於商品信息太多,爲管理/區別商品的固有信息,另加的id.
這個id, 是'關於信息的信息', ---> "元信息"
通常而言,元信息,適合用屬性,實體信息適合用子元素,