例子1: 迴圈所有 "artist" 元素 (nodetypes = 1),尋找與 JavaScript 所傳資料向匹配的名字 找到 CD 包含的正確 artist 輸出 album 的資訊
xml檔案:
<CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> <CD> <TITLE>Hide your heart</TITLE> <ARTIST>Bonnie Tyler</ARTIST> <COUNTRY>UK</COUNTRY> <COMPANY>CBS Records</COMPANY> <PRICE>9.90</PRICE> <YEAR>1988</YEAR> </CD> ········· </CATALOG> |
xml檔案分析:
php檔案: 步驟: 迴圈所有 "artist" 元素 (nodetypes = 1),尋找與 JavaScript 所傳資料向匹配的名字 找到 CD 包含的正確 artist 輸出 album 的資訊
<?php$q=$_GET["q"];$xmlDoc = new DOMDocument();$xmlDoc->load("cd_catalog.xml");$x=$xmlDoc->getElementsByTagName('ARTIST'); //通過ARTIST標籤找到ARTIST結點for ($i=0; $i<=$x->length-1; $i++){//Process only element nodesif ($x->item($i)->nodeType==1) //【注釋1】 { if ($x->item($i)->childNodes->item(0)->nodeValue == $q) //【注釋2】 { $y=($x->item($i)->parentNode); } }}$cd=($y->childNodes);for ($i=0;$i<$cd->length;$i++){ //Process only element nodesif ($cd->item($i)->nodeType==1) { echo($cd->item($i)->nodeName); echo(": "); echo($cd->item($i)->childNodes->item(0)->nodeValue); echo("<br />"); } }?> |
【注釋1】 如果節點是元素節點,則nodeType屬性返回的是1;如果是屬性節點,則nodeType屬性返回的是2。通過這方法排除掉非元素節點。 $x擷取到的是ARTIST節點 數組,因為真箇xml檔案有多個ARTIST節點,所以要用item(index)來確定當前是哪個ARTIST節點(按出現順序排列)。 $x->item(0)表示第一個出現的ARTIST標籤。 【注釋2】 第$i+1個ARTIST節點的子節點是文本,所以nodeValue就是對應的常值內容。
例子2: Me.xml
<?xml version="1.0" encoding="utf-8"?> <phplamp> <post> <title id="1">PHP XML處理介紹一</title> <details>詳細內容一</details> </post> <post> <title id="2">PHP XML處理介紹二</title> <details>詳細內容二</details> </post> <post> <title id="3">PHP XML處理介紹三</title> <details>詳細內容三</details> </post> </phplamp> |
php
// 首先要建一個DOMDocument對象 $xml = new DOMDocument(); // 載入Xml檔案 $xml->load("me.xml"); // 擷取所有的post標籤 $postDom = $xml->getElementsByTagName("post"); // 迴圈遍曆post標籤 foreach($postDom as $post){ // 擷取Title標籤Node $title = $post->getElementsByTagName("title"); /** * 要擷取Title標籤的Id屬性要分兩部走 * 1. 擷取title中所有屬性的列表也就是$title->item(0)->attributes * 2. 擷取title中id的屬性,因為其在第一位所以用item(0) * * 小提示: * 若取屬性的值可以用item(*)->nodeValue * 若取屬性的標籤可以用item(*)->nodeName * 若取屬性的類型可以用item(*)->nodeType */ echo "Id: " . $title->item(0)->attributes->item(0)->nodeValue . "<br />"; echo "Title: " . $title->item(0)->nodeValue . "<br />"; echo "Details: " . $post->getElementsByTagName("details")->item(0)->nodeValue . "<br /><br />"; } |
總結: 使用DOMDocument解析xml檔案大概方法是: 1. 首先要建一個DOMDocument對象: $xml = new DOMDocument(); 2.載入xml檔案: $xml->load("xmlfile.xml"); 3.獲得對應的標籤:$xml->getElementsByTagName("A"); 注意: 1>此時擷取到的並不是某一個具體的標籤,而是這一類標籤,相當於該標籤數組,所以要訪問那一個具體的標籤,還要通過 item(index)來擷取到第index+1個標籤。 2>通過$xml->item(insex)可以擷取到某個標籤,比如獲得下面這個A標籤: <A id="ia" name="na" > <B1 id="b1">1 </B1> <B2 id="b2">2</B2> <A> A這個標籤有兩個屬性和兩個直接子節點。 擷取某屬性: $xml->item(insex)->attributes 擷取第一個屬性id: $xml->item(insex)->attributes->item(0); 如果是:echo $xml->item(insex)->attributes->item(0); 則輸出結果是:id 擷取屬性的值:$xml->item(insex)->attributes->item(0)->nodeValue; 如果是:echo $xml->item(insex)->attributes->item(0)->nodeVale; 則輸出結果是:ia 擷取子節點:$xml->item(insex)->childNodes 擷取第一個子節點B1 :$xml->item(insex)->childNodes->item(0); 如果是:echo $xml->item(insex)->childNodes->item(0); 則輸出結果是:B1 擷取屬性的值:$xml->item(insex)->childNodes->item(0)->nodeValue; 如果是:echo $xml->item(insex)->childNodes->item(0)->nodeVale; 則輸出結果是:1 但是item(1)未必就是對應這下一個標籤,所以才有了例子1中的對nodeType的判斷。
DOM item() 方法詳解: http://www.w3school.com.cn/jsref/met_nodelist_item.asp DOM nodeType 屬性 http://www.w3school.com.cn/jsref/prop_node_nodetype.asp