php中SimpleXMLElement 对象转换为数组
提供两个参数,第一个参数为 SimpleXMLElement 对象,第二个参数为布尔值,控制最终返回值是否包含根节点。
代码如下 | 复制代码 |
function xmlToArr ($xml, $root = true) { if (!$xml->children()) { : (string) $node } |
例1
代码如下 | 复制代码 |
<?php //Store your html into $html variable. $html="<html> <body> </html>"; $dom = new DOMDocument(); //Evaluate Anchor tag in HTML for ($i = 0; $i < $hrefs->length; $i++) { //remove and set target attribute $newURL=$url.".au"; //remove and set href attribute // save html echo $html; ?> |
例2
代码如下 | 复制代码 |
/*<?xml version="1.0" encoding="UTF-8" standalone="no"?> <学生 number="10"2"> $itemsNodeList = $xmldoc->getElementsbyTagName('学生'); //封装成函数 $data = getNodeVal($xmldoc, '学生', $nodeArr); |
例子:
DOM XML 解析器函数是 PHP 核心的组成部分。无需安装就可以使用这些函数。
XML 文件
将在我们的例子中使用下面的 XML 文件:
代码如下 | 复制代码 |
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> |
加载和输出 XML
我们需要初始化 XML 解析器,加载 XML,并把它输出:
例子
代码如下 | 复制代码 |
<?php print $xmlDoc->saveXML(); |
以上代码的输出:
George John Reminder Don't forget the meeting!假如您在浏览器窗口中查看源代码,会看到下面这些 HTML:
代码如下 | 复制代码 |
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>上 |
面的例子创建了一个 DOMDocument-Object,并把 "note.xml" 中的 XML 载入这个文档对象中。
saveXML() 函数把内部 XML 文档放入一个字符串,这样我们就可以输出它。
例子
代码如下 | 复制代码 |
<?php |
输出结果如下:
代码如下 | 复制代码 |
|
注:如果上面生成XML这步改成$dom->save(‘books.xml’);直接生成一个books.xml文件
下面我们利用simplexml来解析xml文件
SimpleXML 函数允许您把 XML 转换为对象。
通过普通的属性选择器或数组迭代器,可以处理这个对象,就像处理任何其他对象一样。
其中的一些函数需要最新的 PHP 版本。
安装
SimpleXML 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。
代码如下 | 复制代码 |
<?php //使用SimpleXML扩展解析XML文档,解析出来是一个对象,可以通过对象获取它的元素内容 $sx = simplexml_load_file('books.xml'); //获取title标签的内容 $title = $sx->title; //因为有两个author元素,通过循环获取每个author元素内容 $authors = ''; foreach($sx->author as $author) { $authors .= '&' . $author; } $authors = substr($authors, 1); echo $title . ':' . $authors; ?> |
输出结果如下:
Php Book:kaifabu&Younker
PHP:指示支持该函数的最早的 PHP 版本。
SimpleXML函数
__construct() 创建一个新的 SimpleXMLElement 对象。 5
addAttribute() 给 SimpleXML 元素添加一个属性。 5
addChild() 给 SimpleXML 元素添加一个子元素。 5
asXML() 从 SimpleXML 元素获取 XML 字符串。 5
attributes() 获取 SimpleXML 元素的属性。 5
children() 获取指定节点的子。 5
getDocNamespaces() 获取 XML 文档的命名空间。 5
getName() 获取 SimpleXML 元素的名称。 5
getNamespaces() 从 XML 数据获取命名空间。 5
registerXPathNamespace() 为下一次 XPath 查询创建命名空间语境。 5
simplexml_import_dom() 从 DOM 节点获取 SimpleXMLElement 对象。 5
simplexml_load_file() 从 XML 文档获取 SimpleXMLElement 对象。 5
simplexml_load_string() 从 XML 字符串获取 SimpleXMLElement 对象。 5
xpath() 对 XML 数据运行 XPath 查询。 5
1 XML简介
XML是“可扩展性标识语言(eXtensible Markup Language)”的缩写,是一种类似于 HTML的标记性语言。但是与 HTML不同,XML主要用于描述数据和存放数据,而 HTML主要用于显示数据。
XML是一种“元标记”语言,开发者可以根据自己的需要创建标记的名称。例如,下面的 XML代码可以用来描述一条留言。
代码如下 | 复制代码 |
<thread> <title>Welcome</title> <author>Simon</author> <content>Welcome to XML guestbook!!</content> </thread> |
其中,<thread>与</thread>标签标记了这是一段留言。在留言中有标题、作者、内容,完整的表述了一条留言信息。
在一个 XML文件的顶部,通常使用<?xml version=”1.0″?>来标识 XML数据的开始和 XML数据使用标准的版本信息。在浏览器中访问 XML文件可以看到层次分明的 XML数据信息,如图 1所示。
图片:1.jpg
XML的发展非常迅速,近些年来很多软件开发商都开始采用 XML的开发标准进行应用程序的开发。并且,很多新兴技术都架构在 XML数据之上。这意味着 XML将与 HTML一样成为 Web技术不可或缺的一部分。
2 简单的 XML操作
在实际应用中,PHP与 XML的交互操作应用非常广泛。SimpleXML组件是 PHP5新增加的一个简
单的 XML操作组件,与传统的 XML组件相比,SimpleXML组件的使用非常简单。本节将对使用
SimpleXML组件操作 XML的方法做一下详细介绍。
2.1 创建一个 SimpleXML对象
SimpleXML对象是用来临时存储 XML数据的临时变量,对 XML进行的操作都是通过操作 SimpleXML对象来完成的。SimpleXML组件提供了两种创建 SimpleXML对象的方法。第一种方法是使用 simplexml_load_string函数读取一个字符串型变量中的 XML数据来完成创建的,其语法格式如下所示。
simplexml_load_string(string data)
这里的 data变量用于存储 XML数据。以下代码使用 simplexml_load_string函数创建了一个 SimpleXML对象
代码如下 | 复制代码 |
<hr><?php $data = <<<XML //定义 XML数据 <?xml version=’1.0′?> <departs> <depart> <name>production support</name> <employees> <employee> <serial_no>100001</serial_no> <name>Simon</name> <age>24</age> <birthday>1982-11-06</birthday> <salary>5000.00</salary> <bonus>1000.00</bonus> </employee> <employee> <serial_no>100002</serial_no> <name>Elaine</name> <age>24</age> <birthday>1982-01-01</birthday> <salary>6000.00</salary> <bonus>2000.00</bonus> </employee> </employees> </depart> <depart> <name>testing center</name> <employees> <employee> <serial_no>110001</serial_no> <name>Helen</name> <age>23</age> <birthday>1983-07-21</birthday> <salary>5000.00</salary> <bonus>1000.00</bonus> </employee> </employees> </depart> </departs> XML; $xml = simplexml_load_string($data); //创建 SimpleXML对象 print_r($xml); //输出 XML ?><hr> |
在上面的例子中,$data变量存储了一段 XML数据。 simplexml_load_string函数将变量$data转化成 SimpleXML对象。通过 print_r函数的输出可以看出该对象的结构,运行结果如下所示。
代码如下 | 复制代码 |
SimpleXMLElement Object ( [depart] => Array ( [0] => SimpleXMLElement Object ( [name] => production support [employees] => SimpleXMLElement Object ( [employee] => Array ( [0] => SimpleXMLElement Object ( [serial_no] => 100001 [name] => Simon [age] => 24 [birthday] => 1982-11-06 [salary] => 5000.00 [bonus] => 1000.00 ) [1] => SimpleXMLElement Object ( [serial_no] => 100002 [name] => Elaine [age] => 24 [birthday] => 1982-01-01 [salary] => 6000.00 [bonus] => 2000.00 ) ) ) ) [1] => SimpleXMLElement Object ( [name] => testing center [employees] => SimpleXMLElement Object ( [employee] => SimpleXMLElement Object ( [serial_no] => 110001 [name] => Helen [age] => 23 [birthday] => 1983-07-21 [salary] => 5000.00 [bonus] => 1000.00 ) ) ) ) ) |
从输出结果可以看出,SimpleXML对象的结构与 XML数据的格式完全相同。
第二种方法是使用 simplexml_load_flie函数读取一个 XML文件来完成创建的,其语法格式如下所示。
simplexml_load_file(string filename)
这里的 filename变量是用于存储 XML数据文件的文件名及其所在路径。以下代码使用 simplexml_load_file函数来创建了一个 SimpleXML对象。
代码如下 | 复制代码 |
<?php $xml = simplexml_load_file(’example.xml’); //创建 SimpleXML对象 print_r($xml); //输出 XML ?> |
其中,example.xml存储的数据与上面的$data完全相同,运行结果也与上面完全相同。
上面两种方法实现了同样的功能,其区别就在于 XML的数据源不同。如果 XML的数据源在 PHP脚本文件中,则需要使用 simplexml_load_string来进行创建。如果 XML的数据源在一个单独的 XML文件中,则需要使用 simplexml_load_file来进行创建。
2.2 读取 SimpleXML对象中的 XML数据
前面介绍了使用 print_r函数来读取 SimpleXML对象中的数据,其返回结果与数组的结构类似。显然,这种显示方式在实际应用中是不可取的。在这里将介绍其他的几种读取 SimpleXML对象中 XML数据的方法。
本文章来详细的介绍一下关于PHP生成XML格式数据与解析xml数据程序代码,有需要学习的朋友可参考参考。
先看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文档的方法有很多,下面我就不介绍了,大家可参考下面的文档。
相关文章
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
- 这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
- 下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <?php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作
只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30- 这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了C#读取文件所有行到数组的方法,涉及C#针对文件及数组的相关操作技巧,需要的朋友可以参考下...2020-06-25
- 如何将下面的二维数组转为一维数组。复制代码 代码如下:$msg = array( array( 'id'=>'45', 'name'=>'jack' ), array( 'id'=>'34', 'name'=>'mary' ), array( 'id...2014-05-31
- 在php中为我们提供了一个函数var_export 他可以直接将php代码入到一个文件中哦。 代码如下 复制代码 var_export($times,true);后面不加tru...2016-11-25
- 本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
- js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21