热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP中的XML解析

不管是桌面软件开发,还是WEB应用,XML无处不在!然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理

不管是桌面软件开发,还是WEB应用,XML无处不在!
然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理,包括生成,解析等。假期有空,于是将PHP中的几种XML解析方法总结如下:

以解析Google API 接口提供的天气情况为例,我们取今天的天气及气温。
API地址:http://www.google.com/ig/api?weather=shenzhen

【XML文件内容】




【使用DomDocument解析】

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, '
';
echo '温度:', $temp_c, '
';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档案的节点,可以想像成游标走过整份文件的节点,并抓取需要的内容。

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, "
";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, '
';
echo '温度:', $temp_c, '
';

我们只是需要取第一个condition和第一个temp_c,于是遍历所有的节点,将遇到的第一个condition和第一个temp_c写入变量,最后输出。

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

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, '
';
echo '温度:', $temp_c, '
';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 参数含有指向 values 数组中对应值的指针。最后两个数组参数可由指针传递给函数。
注意: xml_parse_into_struct() 失败返回 0,成功返回 1。这和 FALSE 与 TRUE 不同,使用例如 === 的运算符时要注意。

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'], '
';
echo '温度:', $vals[$index['TEMP_C'][0]]['attributes']['DATA'], '
';

【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 * @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. "
\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, {$humidity} {$wind}
\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}
\r\n";
}header('Content-type: text/html; Charset: utf-8');
print $html;
?>

转自:https://www.cnblogs.com/caicaizi/p/7837286.html

对于非标准的xml数据,如

<records><record><bookrecno>27249</bookrecno><callno><![CDATA[I313.45/102]]></callno></record><record><bookrecno>275276</bookrecno><callno><![CDATA[I313.45/843]]></callno></record><record><bookrecno>18231</bookrecno><callno><![CDATA[I313.45/3]]></callno></record>
</records>

可以使用正则来分部处理

$ret &#61; [];
preg_match_all("/\(.*?)<\/record>/s", $str, $arr);
foreach($arr[1] as $v){$v &#61; str_replace(PHP_EOL, &#39;&#39;, $v);preg_match_all("/\(.*?)<\/bookrecno>/", $v, $bookrecno);preg_match_all("/\\<\!\[CDATA\[(.*?)\]\]><\/callno>/", $v, $callno);$ret[$bookrecno[1][0]] &#61; $callno[1][0];
}print_r($ret);Array
([27249] &#61;> I313.45/102[275276] &#61;> I313.45/843[18231] &#61;> I313.45/3
)


推荐阅读
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
author-avatar
CC_橙_CC
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有