文档章节

PHP里xml的解析

Megan_zhou
 Megan_zhou
发布于 2014/06/11 09:31
字数 1133
阅读 88
收藏 3

PHP中的几种XML解析方法总结如下:以解析Google API 接口提供的天气情况为例,取天气及气温。API地址:http://www.google.com/ig/api?weather=shanghai

【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="Shanghai, Shanghai" /> 
                         <postal_code data="shanghai" /> 
                         <latitude_e6 data="" /> 
                         <longitude_e6 data="" /> 
                         <forecast_date data="2010-07-15" /> 
                         <current_date_time data="2010-07-15 20:00:00 +0000" /> 
                         <unit_system data="US" /> 
                     </forecast_information>
                     <current_conditions>
                          <condition data="Light rain" /> 
                          <temp_f data="82" /> 
                          <temp_c data="28" /> 
                          <humidity data="Humidity: 84%" /> 
                          <icon data="/ig/images/weather/mist.gif" /> 
                          <wind_condition data="Wind: SE at 7 mph" /> 
                      </current_conditions>
                      <forecast_conditions>
                          <day_of_week data="Thu" /> 
                          <low data="75" /> 
                          <high data="91" /> 
                          <icon data="/ig/images/weather/chance_of_storm.gif" /> 
                          <condition data="Chance of Storm" /> 
                      </forecast_conditions>
                      <forecast_conditions>
                           <day_of_week data="Fri" /> 
                           <low data="75" /> 
                           <high data="89" /> 
                           <icon data="/ig/images/weather/chance_of_storm.gif" /> 
                           <condition data="Chance of Storm" /> 
                       </forecast_conditions>
                       <forecast_conditions>
                            <day_of_week data="Sat" /> 
                             <low data="80" /> 
                             <high data="91" /> 
                             <icon data="/ig/images/weather/chance_of_storm.gif" /> 
                             <condition data="Chance of Storm" /> 
                         </forecast_conditions>
                         <forecast_conditions>
                              <day_of_week data="Sun" /> 
                              <low data="82" /> 
                              <high data="95" /> 
                              <icon data="/ig/images/weather/chance_of_storm.gif" /> 
                              <condition data="Chance of Storm" /> 
                           </forecast_conditions>
               </weather>
  </xml_api_reply>

【使用DomDocument解析】

 <?PHP
header("Content-type:text/html; Charset=utf-8");
$url = http://www.google.com/ig/api?weather=shanghai;
 
//  加载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
    if ($items->length > 1) {
        return $items;
    }
    $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=shanghai;
 
//  加载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=shanghai;
 
//  加载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
    if ($items->length > 1) {
        return $items;
    }
    $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 参数含有指向 values 数组中对应值的指针。最后两个数组参数可由指针传递给函数。
注意: 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=shanghai;
 
//  加载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的官方文档中有相关的例子,如下:
 
// 城市,用城市拼音
$city = empty($_GET['city']) ? 'shanghai' : $_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;
?>

本文转载自:http://liyi.zheyu.blog.163.com/blog/static/422511912010716105412716/

共有 人打赏支持
Megan_zhou
粉丝 72
博文 116
码字总数 30181
作品 0
浦东
程序员
私信 提问
php simplexml_load_string 字符编码

工作中遇到的一个问题,我们系统是utf-8编码的,对方系统是GBK编码的,双方通信使用xml格式的数据。 使用simplexmlloadstring解析xml字符串的时候遇到两个问题: 1、gbk编码的xml字符串,在没...

wyxinlx
2014/04/07
0
0
php 解析xml 的四种方法

XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument。 1。 XML Expat Parser: XML ...

BearCatYN
2016/01/08
30
0
XML 实体扩展攻击

XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的。这种攻击基于XML Entity Expansion实现,通过在XML的中...

OneAPM蓝海讯通
2016/03/24
13
0
PHP中SimpleXMLElement对象字符编码

最近在使用SimpleXMLElement来生成和解析XML。 由于我们使用PHP开发的这边使用UTF-8编码,而对方使用GBK编码,因此就遇到了中文字符编码问题。 后来发现,XML内部的编码与其头 <?xml versio...

最二冰蓝
2013/12/02
0
0
sqlite使用中出现死锁怎么办

一个小型的php网站,使用sqlite3座数据库,有一个操作是读取xml文件,解析得到数据然后做一些处理循环插入不同的几张表,大部分情况都没问题,但是如果我使用一个循环来批量读取一个文件夹里...

阿采
2016/01/07
683
1

没有更多内容

加载失败,请刷新页面

加载更多

对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
1分钟前
0
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
14分钟前
0
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
24分钟前
7
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
39分钟前
4
0
phper必知必会(二)

  1.说说你对进程,线程以及协程的理解      进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础。进程是程序基本执行的实体。进程与进程之间是独立的,拥有完全独立...

SEOwhywhy
55分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部