不管是桌面軟體開發,還是WEB應用,XML無所不在!
然而在平時的工作中,只是使用一些已經封裝好的類別對XML對於處理,包括生成,解析等。假期有空,於是將PHP中的幾種XML解析方法總結如下:
#以解析Google API 介面提供的天氣狀況為例,我們取今天的天氣及氣溫。
API位址:http://www.google.com/ig/api?weather=shenzhen
#【XML檔案內容】
<?xml version="1.0"?> <xml_api_reply version="1"> <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" > <forecast_information> <city data="Shenzhen, Guangdong"/> <postal_code data="shenzhen"/> <latitude_e6 data=""/> <longitude_e6 data=""/> <forecast_date data="2009-10-05"/> <current_date_time data="2009-10-04 05:02:00 +0000"/> <unit_system data="US"/> </forecast_information> <current_conditions> <condition data="Sunny"/> <temp_f data="88"/> <temp_c data="31"/> <humidity data="Humidity: 49%"/> <icon data="/ig/images/weather/sunny.gif"/> <wind_condition data="Wind: mph"/> </current_conditions> </weather> </xml_api_reply>
【使用DomDocument解析】
<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $content = file_get_contents($url); $content = get_utf8_string($content); $dom = DOMDocument::loadXML($content); /* 此处也可使用如下所示的代码, $dom = new DOMDocument(); $dom->load($url); */ $elements = $dom->getElementsByTagName("current_conditions"); $element = $elements->item(0); $condition = get_google_xml_data($element, "condition"); $temp_c = get_google_xml_data($element, "temp_c"); echo '天气:', $condition, '<br />'; echo '温度:', $temp_c, '<br />'; function get_utf8_string($content) { // 将一些字符转化成utf8格式 $encoding = mb_detect_encoding($content, array('ASCII','UTF-8','GB2312','GBK','BIG5')); return mb_convert_encoding($content, 'utf-8', $encoding); } function get_google_xml_data($element, $tagname) { $tags = $element->getElementsByTagName($tagname); // 取得所有的$tagname $tag = $tags->item(0); // 获取第一个以$tagname命名的标签 if ($tag->hasAttributes()) { // 获取data属性 $attribute = $tag->getAttribute("data"); return $attribute; }else { return false; } } ?>
這只是一個簡單的範例,只包含了loadXML, item, getAttribute,getElementsByTagName等方法,還有一些有用的方法,這個依據你的實際需要。
【XMLReader】
當我們要用php解讀xml的內容時,有很多物件提供函式,讓我們不用一個一個字元去解析,而只要根據標籤和屬性名稱,就能取出檔案中的屬性與內容了,相較之下方便許多。其中XMLReader會循序瀏覽過xml檔案的節點,可以想像成遊標走過整個文件的節點,並抓取所需的內容。
<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $xml = new XMLReader(); $xml->open($url); $condition = ''; $temp_c = ''; while ($xml->read()) { // echo $xml->name, "==>", $xml->depth, "<br>"; if (!empty($condition) && !empty($temp_c)) { break; } if ($xml->name == 'condition' && empty($condition)) { // 取第一个condition $condition = $xml->getAttribute('data'); } if ($xml->name == 'temp_c' && empty($temp_c)) { // 取第一个temp_c $temp_c = $xml->getAttribute('data'); } $xml->read(); } $xml->close(); echo '天气:', $condition, '<br />'; echo '温度:', $temp_c, '<br />';
我們只是需要取第一個condition和第一個temp_c,於是遍歷所有的節點,將遇到的第一個condition和第一個temp_c寫入變量,最後輸出。
【DOMXPath】
##這種方法需要使用DOMDocument物件建立整個文件的結構,<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $dom = new DOMDocument(); $dom->load($url); $xpath = new DOMXPath($dom); $element = $xpath->query("/xml_api_reply/weather/current_conditions")->item(0); $condition = get_google_xml_data($element, "condition"); $temp_c = get_google_xml_data($element, "temp_c"); echo '天气:', $condition, '<br />'; echo '温度:', $temp_c, '<br />'; function get_google_xml_data($element, $tagname) { $tags = $element->getElementsByTagName($tagname); // 取得所有的$tagname $tag = $tags->item(0); // 获取第一个以$tagname命名的标签 if ($tag->hasAttributes()) { // 获取data属性 $attribute = $tag->getAttribute("data"); return $attribute; }else { return false; } } ?>
【xml_parse_into_struct】
說明:int xml_parse_into_struct ( resource parser, string data, array &values [, array &index] ) 此函數將XML 檔案解析到兩個對應的陣列中,index 參數含有指向性數組中對應值的指標。最後兩個數組參數可由指標傳遞給函數。 注意: xml_parse_into_struct() 失敗回傳 0,成功回傳 1。這和 FALSE 與 TRUE 不同,使用例如 === 的運算子時要注意。<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $content = file_get_contents($url); $p = xml_parser_create(); xml_parse_into_struct($p, $content, $vals, $index); xml_parser_free($p); echo '天气:', $vals[$index['CONDITION'][0]]['attributes']['DATA'], '<br />'; echo '温度:', $vals[$index['TEMP_C'][0]]['attributes']['DATA'], '<br />';
【Simplexml】
此方法在PHP5中可用 這個在google的官方文件中有相關的例子,如下:// Charset: utf-8 /** * 用php Simplexml 调用google天气预报api,和g官方的例子不一样 * google 官方php domxml 获取google天气预报的例子 * http://www.google.com/tools/toolbar/buttons/intl/zh-CN/apis/howto_guide.html * * @copyright Copyright (c) 2008 <cmpan(at)qq.com> * @license New BSD License * @version 2008-11-9 */ // 城市,用城市拼音 $city = empty($_GET['city']) ? 'shenzhen' : $_GET['city']; $content = file_get_contents("http://www.google.com/ig/api?weather=$city&hl=zh-cn"); $content || die("No such city's data"); $content = mb_convert_encoding($content, 'UTF-8', 'GBK'); $xml = simplexml_load_string($content); $date = $xml->weather->forecast_information->forecast_date->attributes(); $html = $date. "<br>\r\n"; $current = $xml->weather->current_conditions; $condition = $current->condition->attributes(); $temp_c = $current->temp_c->attributes(); $humidity = $current->humidity->attributes(); $icon = $current->icon->attributes(); $wind = $current->wind_condition->attributes(); $condition && $condition = $xml->weather->forecast_conditions->condition->attributes(); $icon && $icon = $xml->weather->forecast_conditions->icon->attributes(); $html.= "当前: {$condition}, {$temp_c}°C,<img src='http://www.google.com/ig{$icon}'/> {$humidity} {$wind} <br />\r\n"; foreach($xml->weather->forecast_conditions as $forecast) { $low = $forecast->low->attributes(); $high = $forecast->high->attributes(); $icon = $forecast->icon->attributes(); $condition = $forecast->condition->attributes(); $day_of_week = $forecast->day_of_week->attributes(); $html.= "{$day_of_week} : {$high} / {$low} °C, {$condition} <img src='http://www.google.com/ig{$icon}' /><br />\r\n"; } header('Content-type: text/html; Charset: utf-8'); print $html; ?>
以上是PHP解析XML的幾種方法(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!