`
haohappy2
  • 浏览: 326352 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

how to parase XML using PHP

阅读更多

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;
?>

分享到:
评论

相关推荐

    [XML.How.to.Program].XML.How.to.Program.pdf

    [XML.How.to.Program].XML.How.to.Program.pdf

    How to Optimize Software Applications Using Intel IPP

    Intel® Integrated Performance Primitives How to Optimize Software Applications Using Intel® IPP by Stewart Taylor

    xml how to prgram

    在"XML How to Program"这本书中,你将深入学习如何使用XML进行编程。 XML的基本结构包括元素、属性、文本内容、注释、处理指令等。元素是XML文档的核心,它们以尖括号包围,如 `&lt;element&gt;`。每个元素可以有零个或...

    XML How to Program-Java.zip_XML java_java how to program_java xm

    "XML How to Program - Java.zip"可能是一个包含关于如何使用Java处理XML的教程或参考材料。 Java API for XML Processing (JAXP) 是Java平台的标准部分,它提供了处理XML的基本工具。JAXP允许开发者进行XML解析、...

    How to Create a Database in Python using SQL Lite 3 epub

    How to Create a Database in Python using SQL Lite 3 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    How to build XMLA using SQL Server 2000.doc

    XML for Analysis (XMLA) 是一种基于XML的协议,用于与多维数据源进行通信,如数据仓库和OLAP (在线分析处理) 服务器。XMLA允许客户端应用程序通过HTTP、HTTPS或TCP/IP等网络协议与服务器进行交互,执行查询、更新、...

    Exploiting Software - How to Break Code.rar

    Exploiting Software - How to Break Code.rar

    how to listen 测音软件 训练金耳朵

    软件为测试听音软件 可以自定义语音、训练自己的耳朵可以分辨音频的细微差别

    How To Read A Book.pdf

    How to read a book efficiently. Part one The dimensions of reading Part two The third level of reading Part three Approaches to different kinds of reading Part four The ultimate goals of reading

    How To Use Adobe Photoshop CS2

    &lt;br&gt;Convert files Work with tone and color Edit images using tools, paths and layers Build web files Master the basics of Photoshop with the visual examples and easy-to-follow ...

    How_to_write_and_publish_a_scientific_paper

    How to write and publish a scientific paper ContentsChapter 1 What Is Scientific Writing? Chapter 2 Origins of Scientific Writing Chapter 3 What Is a Scientific Paper? Chapter 4 How to Prepare the ...

    C How to Program(8th) 无水印pdf

    C How to Program(8th) 英文无水印pdf 第8版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...

    Introduction To Computing Using Python

    Perkovic's Introduction to Programming Using Python provides an imperative-first introduction to Python focusing on computer applications and the process of developing them. The text helps develop ...

    Introduction to Deep Learning Using R(Apress,2017)

    Understand deep learning, the nuances of its ... This book also is also of use for those who wish to learn how to appropriately deploy these algorithms in applications where they would be most useful.

    opencvsharp-20个例子

    Sample01: How to create a simple 2D image and show it using OpenCV Window. Sample02: How to load and display images. Sample03: How to create a gray-scale image. Sample04: How to apply different ...

    OpenCVSharp 最新4.0 的19个例子

    Sample01: How to create a simple 2D image and show it using OpenCV Window. Sample02: How to load and display images. Sample03: How to create a gray-scale image. Sample04: How to apply different ...

    xml_programming_in_java.rar_XML java_java programming_xml how to

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。Java编程语言提供了强大的支持来处理XML,使得开发者可以方便地在Java应用程序中解析、生成、修改和...

    Beginning XML with C# 2008: From Novice to Professional

    With this book, you’ll learn everything you need to know from the basics of reading and writing XML data to using the DOM, from LINQ and SQL Server integration to SOAP and web services. What you’...

Global site tag (gtag.js) - Google Analytics