php中simplexml_load_file()函数用法详细
表面看到的不一定是真的,file_get_contents或者curl远程抓一下,看其是否是一个有效的XML
特殊字符是会引起simplexml_load_file解析XML失败的,函数会报错
定义和用法
simplexml_load_file() 函数把 XML 文档载入对象中。
如果失败,则返回 false。
语法
simplexml_load_file(file,class,options,ns,is_prefix)参数 描述
file 必需。规定要使用的 XML 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 Libxml 参数。
ns 可选。
is_prefix 可选。
实例
例子 1. Interpret an XML document
代码如下 | 复制代码 |
<?php if (file_exists('test.xml')) { var_dump($xml); This script will display, on success: SimpleXMLElement Object |
At this point, you can go about using $xml->title and any other elements.
第一家比较诡异,看源代码及IE页面,毛问题没有,函数就是报错。后来想了个办法,file_get_contents一下,发现丫的在XML数据前面和后面分别有一串数字。于是XML无法顺利解析,这个分析起来还好些,而另一个就堪称头疼了。
XML格式如下:
代码如下 | 复制代码 |
<Result value="true" message="Success!"> |
初步分析是由于 里面NickName乱码导致,于是试验另一地址:
代码如下 | 复制代码 |
<Result value="true" message="Success!"> |
毛问题没有,很显然是这个NickName乱码造成的。于是开始了漫长且无奈的沟通,不过人家合作方不认为自己的文件格式有问题
返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。
simplexml_load_file解析xml详细实例
xml文档格式如下
代码如下 | 复制代码 |
<?xml version="1.0" encoding="utf-8"?> <list> <company>武汉xxx公司</company> <user> <name>张三</name> <age sex="未知">a</age> <height>1</height> </user> <user> <name>李四</name> <age sex="女">b</age> <height>2</height> </user> <user> <name>王五</name> <age sex="男">c</age> <height>3</height> </user> <town parent="0" id="1">台北</town> <town parent="1" id="2">板桥</town> <town parent="0" id="3">桃园</town> </list> |
php解析代码
*/
代码如下 | 复制代码 |
header("content-type:text/html; charset=utf-8"); //设置编码 echo "<br>循环读取:<br>"; echo "<br>循环读取:<br>"; |
/*
定义和用法
simplexml_load_file() 函数把 xml 文档载入对象中。
如果失败,则返回 false。
语法
simplexml_load_file(file,class,options,ns,is_prefix)参数 描述
file 必需。规定要使用的 xml 文档。
class 可选。规定新对象的 class。
options 可选。规定附加的 libxml 参数。
ns 可选。
is_prefix 可选。
先看xml文档
代码如下 | 复制代码 |
<?xml version="1.0" encoding="utf-8"?> |
那么我们用php如何生成xml格式数据呢
方法1:使用纯粹的PHP代码生成字符串,并把这个字符串写入一个以XML为后缀的文件。这是最原始的生成XML的方法,不过有效!
PHP代码如下:
代码如下 | 复制代码 |
<?PHP $data_array = array( array( 'title' => 'title1', 'content' => 'content1', 'pubdate' => '2009-10-11', ), array( 'title' => 'title2', 'content' => 'content2', 'pubdate' => '2009-11-11', ) ); $title_size = 1; $xml = "<?xml version="1.0" encoding="utf-8"?>n"; $xml .= "<article>n"; foreach ($data_array as $data) { $xml .= create_item($data['title'], $title_size, $data['content'], $data['pubdate']); } $xml .= "</article>n"; echo $xml; // 创建XML单项 function create_item($title_data, $title_size, $content_data, $pubdate_data) { $item = "<item>n"; $item .= "<title size="" . $title_size . "">" . $title_data . "</title>n"; $item .= "<content>" . $content_data . "</content>n"; $item .= " <pubdate>" . $pubdate_data . "</pubdate>n"; $item .= "</item>n"; return $item; } ?> |
【DomDocument】
方法2:使用DomDocument生成XML文件
创建节点使用createElement方法,
创建文本内容使用createTextNode方法,
添加子节点使用appendChild方法,
创建属性使用createAttribute方法
代码如下 | 复制代码 |
<?PHP |
下面我们以学生信息表student,需要提供给第三方调用,并有id,name,sex,age分别记录学生的姓名、性别、年龄等信息。
代码如下 | 复制代码 |
CREATE TABLE `student` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, `sex` varchar(10) NOT NULL, `age` smallint(3) NOT NULL default ’0′, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
首先,建立createXML.php文件,先连接数据库,获取数据。
代码如下 | 复制代码 |
$sql = "select * from student"; $result = mysql_query($sql) or die("Invalid query: " . mysql_error()); while ($row = mysql_fetch_array($result)) { $arr[] = array( ‘name’ => $row['name'], ‘sex’ => $row['sex'], ‘age’ => $row['age'] ); } |
这个时候,数据就保存在$arr中,你可以使用print_r打印下数据测试。
接着,建立xml,循环数组,将数据写入到xml对应的节点中。
代码如下 | 复制代码 |
$doc = new DOMDocument(’1.0′, ‘utf-8′); // 声明版本和编码 $doc->formatOutput = true;
$r = $doc->createElement("root"); $doc->appendChild($r); $b = $doc->createElement("data"); $name->appendChild($doc->createTextNode($dat['name'])); $b->appendChild($name); $sex->appendChild($doc->createTextNode($dat['sex'])); $b->appendChild($sex); $age = $doc->createElement("age"); $age->appendChild($doc->createTextNode($dat['age'])); $b->appendChild($age); } echo $doc->saveXML(); |
我们调用了PHP内置的类DOMDocument来处理与生成xml。最终生成的xml格式
代码如下 | 复制代码 |
<root> <data> <name>李王皓</name> <sex>男</sex> <age>21</age> </data> … </root> |
获取XML格式数据
现在我们假设要从第三方获取学生信息,数据格式是XML,我们需要使用PHP解析XML,然后将解析后的数据显示或者写入本地数据库。而这里关键的一步是解析XML。
PHP有很多中方法可以解析XML,其中PHP提供了内置的XMLReader类可以循序地浏览过xml档案的节点,你可以想像成游标走过整份文件的节点,并抓取需要的内容。使用XMLReader是高效的,尤其是读取非常大的xml数据,相对其他方法,使用XMLReader消耗内存非常少。
代码如下 | 复制代码 |
header("Content-type:text/html; Charset=utf-8″); $url = "你的xml路么"; $reader = new XMLReader(); //实例化XMLReader $reader->open($url); //获取xml $i=1; while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { //判断node类型 $m = $i%3; if($m==1) $name = $reader->value; //读取node值 if($m==2) $sex = $reader->value; if($m==0){ $age = $reader->value; $arr[] = array( ‘name’ => $name, ‘sex’ => $sex, ‘age’ => $age ); } $i++; } } //print_r($arr); |
为了将数据name,sex和age分开,我们使用$i%3来判断取模,因为在获取的xml中,节点data下的信息是以3个子节点存在的。
生成与读取xml文档的方法有很多,下面我就不介绍了,大家可参考下面的文档。
文章从最基础的什么是xml到最终于用实例告诉你如何利用php来读,写,删除,编辑xml文档,是一篇不错的xml讲解文档,有需要的同学可以收藏本文章。什么是XML?
XML(eXtensible Markup Language)是国际标准化组织的标准通用标记语言SGML的子集。由以下规范组成:
可扩展样式语言(eXtensible Sytle Language , XSL)
XML链接语言(XML Linking Language,包括Xpath、Xlink和Xpointer)
XML名称空间(XML Namespace)
在PHP5之前的版本对XML的处理存在很多的问题,例如XML工具之间只具有简单的关联、每个工具不能一起协同工作等,PHP5中的新XML扩展具有下列特点:
能够像一个整体一样协调工作
是一个标准化的XML库:libxml2
完全遵循W3C规范
更有效地处理数据
是你工作中合适的XML工具
HTML和XML区别与联系?
HTML和XML都是SGML的子集,所以他们有很大的相似性。下面是XML相对于HTML具有的独特性:
可扩展性,用以定义需要的新标记。这对于今天的web是很有意义的
结构,用于表示任意复杂程度的数据。从某种意义上说是一个小型的关系数据库
校验,用以检查数据的结构正确性。通过DTD约束可以达到这一目的。
媒体无关性,以多种格式发布内容。网页、手机显示的wml、其他媒体终端的显示等
厂商和平台中立
数据的表示与内容分离(这是与html本质区别,但现在流行的DIV+CSS设计思路与这种近似)
XML的元素区分大小写
任何元素都需要有结束标记
XML只有一个根元素
属性必须加上引号
一个完整的XML长什么样子?
代码如下 | 复制代码 |
<?xml version="1.0"?> <shows> <show> <name>Simpsons</name> <channel>FOX</channel> <start>8:00 PM</start> <duration>30</duration> </show> <show> <name>Law & Order</name> <channel>NBC</channel> <start>8:00 PM</start> <duration>60</duration> </show> </shows> |
形式良好的XML文档须具备下列特征:
每一个元素有一个开始和结束标记
文档有且只有一个根元素,其他的所有元素都是它的子元素
正确的格式化空元素
标记的大小写匹配
正确的嵌套
属性值必须用引号
实体在引用之前必须声明
实体不能循环指向自身
通过DOM生成XML
代码如下 | 复制代码 |
// 创建一个新的文档$dom = new DOMDocument('1.0'); $trachtenberg = $book->appendChild($dom->createElement('author')); |
// 输出完美格式化的XML文档$dom->formatOutput = true;
echo $dom->saveXML();输出内容如下:
代码如下 | 复制代码 |
<?xml version="1.0"?> <book?> <cover="soft">PHP Cookbook</title> </book> |
用PHP解析已经存在的XML文件
常用有三种方式来解析XML文件
对于简单文件采用SimpleXML
对于复杂的XML文件采用DOM扩展来实现
对于大型XML文件采用XMLReader扩展来实现
XML示例文件如下(address-book.xml):
代码如下 | 复制代码 |
<?xml version="1.0"?> <person id="2"> |
通过SimpleXML方式:
代码如下 | 复制代码 |
$sx = simplexml_load_file('address-book.xml'); foreach ($sx->person as $person) { print "$firstname_text_value $lastname_text_valuen"; |
}通过DOM扩展:
代码如下 | 复制代码 |
$dom = new DOMDocument; foreach ($dom->getElementsByTagname('person') as $person) { $lastname = $person->getElementsByTagname('lastname'); print "$firstname_text_value $lastname_text_valuen"; |
通过XMLReader扩展:
代码如下 | 复制代码 |
$reader = new XMLReader(); while ($reader->read()) { |
用XPath来查询信息http://www.111cn.net
在SimpleXML和DOM扩展中都有XPath
代码如下 | 复制代码 |
//SimpleXml示例 |
//DOM扩展示例
代码如下 | 复制代码 |
$xpath = new DOMXPath($dom); $email = $xpath->query('/address-book/preson/email');验证XML文档是否合法 |
在PHP中,DOM扩展支持基于DTD,XML Schema和RelaxNG的验证,而SimpleXML则只提供了XML Schema验证。
XML内容为UTF-8格式
如果数据来源为其他格式,需要经过编码为UTF-8格式,下面是通过iconv库进行转换的示例
代码如下 | 复制代码 |
$utf_8 = iconv('ISO-8859-1', 'UTF-8', $iso_8859_1); |
代码如下 | 复制代码 |
<?php |
正则解析
代码如下 | 复制代码 |
<?php $xml = ""; $f = fopen( 'books.xml', 'r' ); while( $data = fread( $f, 4096 ) ) { $xml .= $data; } fclose( $f ); preg_match_all( "//<book/>(.*?)/<//book/>/s", $xml, $bookblocks ); foreach( $bookblocks[1] as $block ) { preg_match_all( "//<author/>(.*?)/<//author/>/", $block, $author ); preg_match_all( "//<title/>(.*?)/<//title/>/", $block, $title ); preg_match_all( "//<publisher/>(.*?)/<//publisher/>/", $block, $publisher ); echo( $title[1][0]." - ".$author[1][0]." - ". $publisher[1][0]."/n" ); } ?> |
books.xml文件如下
代码如下 | 复制代码 |
<books> <book> <author>Jack Herrington</author> <title>PHP Hacks</title> <publisher>O'Reilly</publisher> </book> <book> <author>Jack Herrington</author> <title>Podcasting Hacks</title> <publisher>O'Reilly</publisher> </book> </books> |
下面就给大家举一个小小的例子用parser函数来读取xml数据:
代码如下 | 复制代码 |
<?php
fclose($filehandler);
function characterData($parser_instance, $xml_data) //读取数据时的函数 function endElement($parser_instance, $element_name) //结束标签事件的函数 ?> |
xml文件代码如下:
代码如下 | 复制代码 |
<?xml version="1.0"?> |
parser是php内置的一个用来处理xml的解析器,它的工作由三个事件组成:起始标签、 读取数据、结束标签。
也就是说在对xml进行处理的时候每当遇到起始标签、数据和结束标签的时候函数会做相应的动作来完成对xml数据的转换。
前面的mysql.php 是封装的mysql数据库功能,单例模式,所以取对象是静态方法 mysql::getObject(); 代码很简单代码如下 | 复制代码 |
include 'mysql.php';
$xml->openUri('hello.xml'); // or 'php://output' $xml->setIndentString(' '); // <rss version="2.0"> // for item $xml->endDocument(); |
openUri('') 方法的参数可以是一个文件,那么xml数据就写入到这个文件
或者 php://output 输出到缓冲区,然后 flush方法输出到页面
相关文章
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
这篇文章主要介绍了基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
SQL Server中row_number函数的常见用法示例详解
这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08- 分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21- 下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25