当前位置:首页 > PHP教程 > php应用 > 列表

PHP解析XML的几种方法(附代码)

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-10 09:44:46 浏览: 评论:0 

不管是桌面软件开发,还是WEB应用,XML无处不在!

然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理,包括生成,解析等。假期有空,于是将PHP中的几种XML解析方法总结如下:

以解析Google API 接口提供的天气情况为例,我们取今天的天气及气温。

API地址:http://www.google.com/ig/api?weather=shenzhen

【XML文件内容】

  1. <?xml version="1.0"?>   
  2.  
  3. <xml_api_reply version="1">   
  4.  
  5.     <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >   
  6.  
  7.         <forecast_information>   
  8.  
  9.             <city data="Shenzhen, Guangdong"/>   
  10.  
  11.             <postal_code data="shenzhen"/>   
  12.  
  13.             <latitude_e6 data=""/>   
  14.  
  15.             <longitude_e6 data=""/>   
  16.  
  17.             <forecast_date data="2009-10-05"/>   
  18.  
  19.             <current_date_time data="2009-10-04 05:02:00 +0000"/>   
  20.  
  21.             <unit_system data="US"/>   
  22.  
  23.         </forecast_information>   
  24.  
  25.         <current_conditions>   
  26.  
  27.             <condition data="Sunny"/>   
  28.  
  29.             <temp_f data="88"/>   
  30.  
  31.             <temp_c data="31"/>   
  32.  
  33.             <humidity data="Humidity: 49%"/>   
  34.  
  35.             <icon data="/ig/images/weather/sunny.gif"/>   
  36.  
  37.             <wind_condition data="Wind:  mph"/>   
  38.  
  39.         </current_conditions>   
  40.  
  41.     </weather>   
  42.  
  43. </xml_api_reply> 

【使用DomDocument解析】

  1. <?PHP 
  2.  
  3. header("Content-type:text/html; Charset=utf-8"); 
  4.  
  5. $url = "http://www.google.com/ig/api?weather=shenzhen"
  6.  
  7.    
  8.  
  9. //  加载XML内容 
  10.  
  11. $content = file_get_contents($url); 
  12.  
  13. $content = get_utf8_string($content); 
  14.  
  15. $dom = DOMDocument::loadXML($content); 
  16.  
  17. /* 
  18.  
  19. 此处也可使用如下所示的代码, 
  20.  
  21. $dom = new DOMDocument(); 
  22.  
  23. $dom->load($url); 
  24.  
  25.  */ 
  26.  
  27.    
  28.  
  29. $elements = $dom->getElementsByTagName("current_conditions"); 
  30.  
  31. $element = $elements->item(0); 
  32.  
  33. $condition = get_google_xml_data($element"condition"); 
  34.  
  35. $temp_c = get_google_xml_data($element"temp_c"); 
  36.  
  37. echo '天气:'$condition'<br />'
  38.  
  39. echo '温度:'$temp_c'<br />'
  40.  
  41.    
  42.  
  43. function get_utf8_string($content) {    //  将一些字符转化成utf8格式 
  44.  
  45.     $encoding = mb_detect_encoding($contentarray('ASCII','UTF-8','GB2312','GBK','BIG5')); 
  46.  
  47.     return  mb_convert_encoding($content'utf-8'$encoding); 
  48.  
  49.  
  50.    
  51.  
  52. function get_google_xml_data($element$tagname) { 
  53.  
  54.     $tags = $element->getElementsByTagName($tagname);   //  取得所有的$tagname 
  55.  
  56.    
  57.  
  58.     $tag = $tags->item(0);  //  获取第一个以$tagname命名的标签 
  59.  
  60.     if ($tag->hasAttributes()) {    //  获取data属性 
  61.  
  62.         $attribute = $tag->getAttribute("data"); 
  63.  
  64.         return $attribute
  65.  
  66.     }else { 
  67.  
  68.         return false; 
  69.  
  70.     } 
  71.  
  72.  
  73. ?> 

这只是一个简单的示例,仅包括了loadXML, item, getAttribute,getElementsByTagName等方法,还有一些有用的方法,这个依据你的实际需要。

【XMLReader】

当我们要用php解读xml的内容时,有很多物件提供函式,让我们不用一个一个字元去解析,而只要根据标签和属性名称,就能取出文件中的属性与内容了,相较之下方便许多。其中XMLReader循序地浏览过xml档案的节点,可以想像成游标走过整份文件的节点,并抓取需要的内容。

  1. <?PHP 
  2.  
  3. header("Content-type:text/html; Charset=utf-8"); 
  4.  
  5. $url = "http://www.google.com/ig/api?weather=shenzhen"
  6.  
  7.    
  8.  
  9. //  加载XML内容 
  10.  
  11. $xml = new XMLReader(); 
  12.  
  13. $xml->open($url); 
  14.  
  15.    
  16.  
  17. $condition = ''
  18.  
  19. $temp_c = ''
  20.  
  21. while ($xml->read()) { 
  22.  
  23. //      echo $xml->name, "==>", $xml->depth, "<br>"; 
  24.  
  25.       if (!emptyempty($condition) && !emptyempty($temp_c)) { 
  26.  
  27.           break
  28.  
  29.       } 
  30.  
  31.       if ($xml->name == 'condition' && emptyempty($condition)) {  //  取第一个condition 
  32.  
  33.             $condition = $xml->getAttribute('data'); 
  34.  
  35.       } 
  36.  
  37.    
  38.  
  39.       if ($xml->name == 'temp_c' && emptyempty($temp_c)) {    //  取第一个temp_c 
  40.  
  41.           $temp_c = $xml->getAttribute('data'); 
  42.  
  43.       } 
  44.  
  45.    
  46.  
  47.       $xml->read(); 
  48.  
  49.  
  50.    
  51.  
  52. $xml->close(); 
  53.  
  54. echo '天气:'$condition'<br />'
  55.  
  56. echo '温度:'$temp_c'<br />'
我们只是需要取第一个condition和第一个temp_c,于是遍历所有的节点,将遇到的第一个condition和第一个temp_c写入变量,最后输出。

【DOMXPath】

这种方法需要使用DOMDocument对象创建整个文档的结构,

  1. <?PHP 
  2.  
  3. header("Content-type:text/html; Charset=utf-8"); 
  4.  
  5. $url = "http://www.google.com/ig/api?weather=shenzhen"
  6.  
  7.    
  8.  
  9. //  加载XML内容 
  10.  
  11. $dom = new DOMDocument(); 
  12.  
  13. $dom->load($url); 
  14.  
  15.    
  16.  
  17. $xpath = new DOMXPath($dom); 
  18.  
  19. $element = $xpath->query("/xml_api_reply/weather/current_conditions")->item(0); 
  20.  
  21. $condition = get_google_xml_data($element"condition"); 
  22.  
  23. $temp_c = get_google_xml_data($element"temp_c"); 
  24.  
  25. echo '天气:'$condition'<br />'
  26.  
  27. echo '温度:'$temp_c'<br />'
  28.  
  29.    
  30.  
  31. function get_google_xml_data($element$tagname) { 
  32.  
  33.     $tags = $element->getElementsByTagName($tagname);   //  取得所有的$tagname 
  34.  
  35.    
  36.  
  37.     $tag = $tags->item(0);  //  获取第一个以$tagname命名的标签 
  38.  
  39.     if ($tag->hasAttributes()) {    //  获取data属性 
  40.  
  41.         $attribute = $tag->getAttribute("data"); 
  42.  
  43.         return $attribute
  44.  
  45.     }else { 
  46.  
  47.         return false; 
  48.  
  49.     } 
  50.  
  51.  
  52. ?> 

【xml_parse_into_struct】

说明:int xml_parse_into_struct ( resource parser, string data, array &values [, array &index] )

该函数将 XML 文件解析到两个对应的数组中,index 参数含有指向 values 数组中对应值的指针。最后两个数组参数可由指针传递给函数。

注意: xml_parse_into_struct() 失败返回 0,成功返回 1。这和 FALSE 与 TRUE 不同,使用例如 === 的运算符时要注意。

  1. <?PHP 
  2.  
  3. header("Content-type:text/html; Charset=utf-8"); 
  4.  
  5. $url = "http://www.google.com/ig/api?weather=shenzhen"
  6.  
  7.    
  8.  
  9. //  加载XML内容 
  10.  
  11. $content = file_get_contents($url); 
  12.  
  13. $p = xml_parser_create(); 
  14.  
  15. xml_parse_into_struct($p$content$vals$index); 
  16.  
  17. xml_parser_free($p); 
  18.  
  19.    
  20.  
  21. echo '天气:'$vals[$index['CONDITION'][0]]['attributes']['DATA'], '<br />'
  22.  
  23. echo '温度:'$vals[$index['TEMP_C'][0]]['attributes']['DATA'], '<br />'

【Simplexml】

此方法在PHP5中可用

这个在google的官方文档中有相关的例子,如下:

  1. // Charset: utf-8 
  2.  
  3. /** 
  4.  
  5.   * 用php Simplexml 调用google天气预报api,和g官方的例子不一样 
  6.  
  7.   * google 官方php domxml 获取google天气预报的例子 
  8.  
  9.   * http://www.google.com/tools/toolbar/buttons/intl/zh-CN/apis/howto_guide.html 
  10.  
  11.   * 
  12.  
  13.   * @copyright Copyright (c) 2008 <cmpan(at)qq.com> 
  14.  
  15.   * @license New BSD License 
  16.  
  17.   * @version 2008-11-9 
  18.  
  19.   */ 
  20.  
  21.    
  22.  
  23. // 城市,用城市拼音 
  24.  
  25. $city = emptyempty($_GET['city']) ? 'shenzhen' : $_GET['city']; 
  26.  
  27. $content = file_get_contents("http://www.google.com/ig/api?weather=$city&hl=zh-cn"); 
  28.  
  29. $content || die("No such city's data"); 
  30.  
  31. $content = mb_convert_encoding($content'UTF-8''GBK'); 
  32.  
  33. $xml = simplexml_load_string($content); 
  34.  
  35.    
  36.  
  37. $date = $xml->weather->forecast_information->forecast_date->attributes(); 
  38.  
  39. $html = $date"<br>\r\n"
  40.  
  41.    
  42.  
  43. $current = $xml->weather->current_conditions; 
  44.  
  45.    
  46.  
  47. $condition = $current->condition->attributes(); 
  48.  
  49. $temp_c = $current->temp_c->attributes(); 
  50.  
  51. $humidity = $current->humidity->attributes(); 
  52.  
  53. $icon = $current->icon->attributes(); 
  54.  
  55. $wind = $current->wind_condition->attributes(); 
  56.  
  57.    
  58.  
  59. $condition && $condition = $xml->weather->forecast_conditions->condition->attributes(); 
  60.  
  61. $icon && $icon = $xml->weather->forecast_conditions->icon->attributes(); 
  62.  
  63.    
  64.  
  65. $html.= "当前: {$condition}, {$temp_c}°C,<img src='http://www.google.com/ig{$icon}'/> {$humidity} {$wind} <br />\r\n"
  66.  
  67.    
  68.  
  69. foreach($xml->weather->forecast_conditions as $forecast) { 
  70.  
  71.     $low = $forecast->low->attributes(); 
  72.  
  73.     $high = $forecast->high->attributes(); 
  74.  
  75.     $icon = $forecast->icon->attributes(); 
  76.  
  77.     $condition = $forecast->condition->attributes(); 
  78.  
  79.     $day_of_week = $forecast->day_of_week->attributes(); 
  80.  
  81.     $html.= "{$day_of_week} : {$high} / {$low} °C, {$condition} <img src='http://www.google.com/ig{$icon}' /><br />\r\n"
  82.  
  83.  
  84.    
  85.  
  86. header('Content-type: text/html; Charset: utf-8'); 
  87.  
  88. print $html
  89.  
  90. ?>

Tags: PHP解析XML

分享到: