文章從最基礎的什么是xml到最終于用實例告訴你如何利用php來讀,寫,刪除,編輯xml文檔,是一篇不錯的xml講解文檔,有需要的同學可以收藏本文章.
什么是XML?
XML(eXtensible Markup Language)是國際標準化組織的標準通用標記語言SGML的子集,由以下規范組成:
可擴展樣式語言(eXtensible Sytle Language , XSL)
XML鏈接語言(XML Linking Language,包括Xpath、Xlink和Xpointer)
XML名稱空間(XML Namespace)
在PHP5之前的版本對XML的處理存在很多的問題,例如XML工具之間只具有簡單的關聯、每個工具不能一起協同工作等,PHP5中的新XML擴展具有下列特點:
能夠像一個整體一樣協調工作,是一個標準化的XML庫:libxml2,完全遵循W3C規范,更有效地處理數據,是你工作中合適的XML工具
HTML和XML區別與聯系?
HTML和XML都是SGML的子集,所以他們有很大的相似性,下面是XML相對于HTML具有的獨特性:
可擴展性,用以定義需要的新標記。這對于今天的web是很有意義的
結構,用于表示任意復雜程度的數據。從某種意義上說是一個小型的關系數據庫
校驗,用以檢查數據的結構正確性。通過DTD約束可以達到這一目的。
媒體無關性,以多種格式發布內容,網頁、手機顯示的wml、其他媒體終端的顯示等,廠商和平臺中立,數據的表示與內容分離(這是與html本質區別,但現在流行的DIV+CSS設計思路與這種近似).
XML的元素區分大小寫,任何元素都需要有結束標記,XML只有一個根元素,屬性必須加上引號.
一個完整的XML長什么樣子,代碼如下:
- <?xml version="1.0"?>
- <shows>
- <show>
- <name>Simpsons</name>
- <channel>FOX</channel>
- <start>8:00 PM</start>
- <duration>30</duration>
- </show>
- <show>
- <name>Law & Order</name>
- <channel>NBC</channel>
- <start>8:00 PM</start>
- <duration>60</duration>
- </show>
- </shows>
形式良好的XML文檔須具備下列特征:
每一個元素有一個開始和結束標記,文檔有且只有一個根元素,其他的所有元素都是它的子元素,正確的格式化空元素,標記的大小寫匹配,正確的嵌套,屬性值必須用引號,實體在引用之前必須聲明,實體不能循環指向自身.
通過DOM生成XML,代碼如下:
- // 創建一個新的文檔$dom = new DOMDocument('1.0');
- // 創建一個根元素<book>并將其添加到文檔$book = $dom->appendChild($dom->createElement('book'));
- // 創建一個title子元素,并添加到$book中
- $title = $book->appendChild($dom->createElement('title'));
- // 設置title元素的文本及cover屬性
- $title->appendChild($dom->createTextNode('PHP Cookbook'));
- $title->setAttribute('cover', 'soft');
- // 創建并將author元素添加到$book中
- $sklar = $book->appendChild($dom->createElement('author'));
- //添加文本到author節點$sklar->appendChild($dom->createTextNode('Sklar'));
- //開源代碼Vevb.com
- $trachtenberg = $book->appendChild($dom->createElement('author'));
- $trachtenberg->appendChild($dom->createTextNode('Trachtenberg'));
- // 輸出完美格式化的XML文檔$dom->formatOutput = true;
- echo $dom->saveXML();//輸出內容如下:
- <?xml version="1.0"?>
- <book?>
- <cover="soft">PHP Cookbook</title>
- </book>
用PHP解析已經存在的XML文件,常用有三種方式來解析XML文件,對于簡單文件采用SimpleXML,對于復雜的XML文件采用DOM擴展來實現,對于大型XML文件采用XMLReader擴展來實現.
XML示例文件如下address-book.xml,代碼如下:
- <?xml version="1.0"?>
- <address-book>
- <person id="1">
- <!--David Sklar-->
- <firstname>David</firstname>
- <lastname>Sklar</lastname>
- <city>New York</city>
- <state>NY</state>
- <email>sklar@php.net</email>
- </person>
- <person id="2">
- <!--Adam Trachtenberg-->
- <firstname>Adam</firstname>
- <lastname>Trachtenberg</lastname>
- <city>San Francisco</city>
- <state>CA</state>
- <email>amt@php.net</email>
- </person>
- </address-book>
通過SimpleXML方式,代碼如下:
- $sx = simplexml_load_file('address-book.xml');
- foreach ($sx->person as $person) {
- $firstname_text_value = $person->firstname;
- $lastname_text_value = $person->lastname;
- print "$firstname_text_value $lastname_text_valuen";
- }
通過DOM擴展,代碼如下:
- $dom = new DOMDocument;
- $dom->load('address-book.xml');
- foreach ($dom->getElementsByTagname('person') as $person) {
- $firstname = $person->getElementsByTagname('firstname');
- $firstname_text_value = $firstname->item(0)->firstChild->nodeValue;
- $lastname = $person->getElementsByTagname('lastname');
- $lastname_text_value = $lastname->item(0)->firstChild->nodeValue;
- print "$firstname_text_value $lastname_text_valuen";
- }
通過XMLReader擴展,代碼如下:
- $reader = new XMLReader();
- $reader->open('card-catalog.xml');
- while ($reader->read()) {
- if ($reader->nodeType == XMLREADER::ELEMENT && $reader->localName == 'author') {
- $reader->read();
- print $reader->value . "n";
- }
- }
在SimpleXML和DOM擴展中都有XPath,代碼如下:
- //SimpleXml示例
- $emails = $s->xpath('/address-book/preson/email');
- //DOM擴展示例
- $xpath = new DOMXPath($dom);
- $email = $xpath->query('/address-book/preson/email');//驗證XML文檔是否合法
在PHP中,DOM擴展支持基于DTD,XML Schema和RelaxNG的驗證,而SimpleXML則只提供了XML Schema驗證.
XML內容為UTF-8格式
如果數據來源為其他格式,需要經過編碼為UTF-8格式,下面是通過iconv庫進行轉換的示例,代碼如下:
$utf_8 = iconv('ISO-8859-1', 'UTF-8', $iso_8859_1);
新聞熱點
疑難解答