PHP simplexml使用方法详解

 更新时间:2016年11月25日 16:54  点击:1756
本文章给来大家讲一下关于PHP 下simplexml使用方法,希望通过此文章能提升大家对simplexml操作xml文档的理解,有需要了解的朋友可参考。

PHP XML处理XML代码如下

 代码如下 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited with XML Spy v2007 (http://www.altova.com) -->
<breakfast_menu>
 <food id="1">
  <name>Belgian Waffles</name>
  <price>$5.95</price>
  <description>two of our famous Belgian Waffles with plenty of real maple syrup</description>
  <calories>650</calories>
 </food>
 <food id="2">
  <name>Strawberry Belgian Waffles</name>
  <price>$7.95</price>
  <description>light Belgian waffles covered with strawberries and whipped cream</description>
  <calories>900</calories>
 </food>
 <food id="3">
  <name>Berry-Berry Belgian Waffles</name>
  <price>$8.95</price>
  <description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
  <calories>900</calories>
 </food>
</breakfast_menu>


php解决xml代码

 代码如下 复制代码

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>使用simpleXML处理XML</title>
</head>

<body>
<table border="1" cellpadding="0" cellspacing="0" width="700">
</tbody>
<tr bgcolor="green">
<th width="5%">&nbsp;</th>
<th width="20%">name</th>
<th width="10%">price</th>
<th width="55%">description</th>
<th width="10%">calories</th>
</tr>
<?php
 // 使用simpleXML处理XML

 $xml = simplexml_load_file('./simple.xml');
 //var_dump($xml);
 //echo $xml->getName();
 //var_dump($xml->children());
 $record = '';
 foreach ($xml->children() as $child)
 {
  $record .= '<tr><td>'. $child->attributes(). '</td>';
  foreach ($child->children() as $item)
  {
   //var_dump($child);
   $record .= '<td>'. $item .'</td>';
  }
  $record .= '</tr>';
 }
 echo $record;
?>
</tbody>
</table>
</body>
</html>

将XML转换为数组结构

 代码如下 复制代码

private function change_simple_xml_to_array($obj){
  $i = 0;
  //从根节点下的二层子节点开始遍历
  foreach($obj->children() as $value){
    //如果发生同级、同标签名的情况,则加一维数组;
    if(isset($last_name) && $value->getName()==$last_name){
      //出现同名发现第二个,则推入第二维数组;
      if($i==1) $arr[$last_name]=array($arr[$last_name]);
      //遍历子节点;
      array_push($arr[$last_name],$this->change_simple_xml_to_array($value));
    }else{
      $last_name = $value->getName();
      if(count($value->children())==0) $arr[$last_name] = $value."";
      else $arr[$last_name] = $this->change_simple_xml_to_array($value);
    }
    $i++;
  }
  return $arr;
}

 

 

 

——————XML文档——————

 


<?xml version="1.0" encoding="utf-8"?>
<use>
  <login id="1">
    <user>bddg</user>
    <pas>abcdefg</pas>
    <permission><fdsa>5</fdsa></permission>
    <online_time>2</online_time>
  </login>
  <login id="2">
    <user>baidongdaogu</user>
    <pas>aaa</pas>
    <permission>1</permission>
    <online_time>2</online_time>
  </login>
  <login id="3">
    <user>baidongdaogu</user>
    <pas>aaa</pas>
    <permission>1</permission>
    <online_time>2</online_time>
  </login>
</use>


————转换后的数组————

Array
(
  [login] => Array
    (
      [0] => Array
        (
          [user] => bddg
          [pas] => abcdefg
          [permission] => Array
            (
              [fdsa] => 5
            )

          [online_time] => 2
        )

      [1] => Array
        (
          [user] => baidongdaogu
          [pas] => aaa
          [permission] => 1
          [online_time] => 2
        )

      [2] => Array
        (
          [user] => baidongdaogu
          [pas] => aaa
          [permission] => 1
          [online_time] => 2
        )
    )
)

本文章来给大家介绍在php中生成和获取XML格式数据代码,生成xml我们使用DOMDocument,读取xml我们使用XMLReader即可,下面我分别给大家介绍。

生成XML格式数据

我们假设系统中有一张学生信息表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文件,先连接数据库,获取数据。

 代码如下 复制代码

include_once ("connect.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); 
 
foreach ($arr as $dat) { 
    $b = $doc->createElement("data"); 
 
    $name = $doc->createElement("name"); 
    $name->appendChild($doc->createTextNode($dat['name'])); 
    $b->appendChild($name); 
 
    $sex = $doc->createElement("sex"); 
    $sex->appendChild($doc->createTextNode($dat['sex'])); 
    $b->appendChild($sex); 
 
    $age = $doc->createElement("age"); 
    $age->appendChild($doc->createTextNode($dat['age'])); 
    $b->appendChild($age); 
 
    $r->appendChild($b); 

 
echo $doc->saveXML(); 

我们调用了PHP内置的类DOMDocument来处理与生成xml。最终生成的xml格式请点击这里看效果

 代码如下 复制代码

<?xml version="1.0" encoding="utf-8"?>  
<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 = "importXML/createXML.php";   
$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个子节点存在的。

我们知道php中的simpleXML没办法直接很方便的添加CDATA格式的数据,这样对我们操作时会有一定的问题,下面我来给各位同学介绍php simpleXML添加CDATA格式数据一种办法。

代码

 代码如下 复制代码

<?php
/**
* to show <title lang="en"><![CDATA[Site Title]]></title>   instead of <title lang="en">Site Title</title>
*
*/
class SimpleXMLExtended extends SimpleXMLElement
  {
  public function addCData($cdata_text)
    {
    $node = dom_import_simplexml($this);
    $no   = $node->ownerDocument;
    $node->appendChild($no->createCDATASection($cdata_text));
    }
  }
$xmlFile    = 'config.xml';
// instead of $xml = new SimpleXMLElement('<sites/>');
$xml = new SimpleXMLExtended('<sites/>');
$site = $xml->addChild('site');
// instead of $site->addChild('site', 'Site Title');
$site->title = NULL; // VERY IMPORTANT! We need a node where to append
$site->title->addCData('Site Title');
$site->title->addAttribute('lang', 'en');
$xml->asXML($xmlFile);
?>

下面我先是介绍一个朋友自己写的一个操作xml文档程序,然后再介绍了php中一个自带的解析xml文档的函数功能,有需要的朋友可参考。
 代码如下 复制代码

 

/*
<?xml version="1.0" encoding="UTF-8"?>
<班级>
<学生 number="101">
<名字>孙悟空</名字>
<名字>孙行者</名字>
<年龄>猴精猴精</年龄>
<介绍></介绍>
</学生>
<学生 number="102">
<名字>白骨精</名字>
<年龄>140</年龄>
<介绍>幻化万千</介绍>
</学生>
<学生 number="103">
<名字>猪八戒</名字>
<名字>猪无能</名字>
<年龄>200</年龄>
<介绍>能吃会睡</介绍>
</学生>
</班级>
*/

class xmlDom{
    public $version;
    public $encoding;
    private $xml;
    private $items;
    private $seachNode = '';
    private $seachItem = '';
    private $seachValue = '';
    public $writeBytes = 0;

    function __construct($xmlFile ='', $version ='1.0', $encoding = 'UTF-8'){
        $this->version = $version;
        $this->encoding = $encoding;
        $this->xml = new DOMDocument($version, $encoding);
        if($xmlFile)$this->xml->load($xmlFile);
    }
    function getRootEle($rootTag){
        $this->xmlRoot = $this->xml->getElementsByTagName($rootTag)->item(0);
    }
    function getSeachItem($itemsTag, $seachNode, $seachValue){
        $this->items = $this->xml->getElementsByTagName($itemsTag);
        $this->items->length;
        for($i=0; $i<$this->items->length; $i++){
            $item = $this->items->item($i);//元素
            $node = $item->getElementsByTagName($seachNode);//节点
            for($j = 0; $j< $node->length; $j++){
                $subNode = $node->item($j);
                if($seachValue == $subNode->nodeValue){
                    $this->seachNode = $subNode;
                    $this->seachItem = $item;
                    $this->seachValue = $subNode->nodeValue;
                    break(2);
                }
            }
        }
        return ($this->seachNode) ? true : false;
    }
   
    function update($nodeValue, $nodeTag = '',$append = false, $index = 0){
        if($append){
            if($nodeTag)
                $this->seachItem->getElementsByTagName($nodeTag)->item($index)->nodeValue += $nodeValue;
            else
                $this->seachNode->nodeValue += $nodeValue;
        }else{
            if($nodeTag)
                $this->seachItem->getElementsByTagName($nodeTag)->item($index)->nodeValue = $nodeValue;
            else
                $this->seachNode->nodeValue = $nodeValue;
        }
    }
   
    function save($filename){
        $this->writeBytes = $this->xml->save($filename);
        return ($this->writeBytes) ? true : false;
    }
}

$test = new xmlDom('student.xml');
$test->getSeachItem('学生','年龄','103');//找到 年龄=103 的猪八戒
$test->update('小猪猪', '名字', false, 1); //把猪八戒的第二个名字改成:小猪猪
$test->save('new.xml'); //保存成新文件

上面是使用了dom来操作,下面我们利用php中的SimpleXML来操作xml,也算是很标准的一个操作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来进行创建。

读取 XML数据中的标签
与操作数组类型的变量类似,读取 XML也可以通过类似的方法来完成。例如,如果需要读取上面 XML数据中每一个“ depart”标签下的“name”属性,可以通过使用 foreach函数来完成,如以下代码
所示。

 代码如下 复制代码

<?php $xml = simplexml_load_file(’example.xml’); foreach($xml->depart as $a)
{
echo “$a->name <BR>”;
}
?>

运行结果如下所示。
production support
testing center
//读取 XML文件 //循环读取 XML数据中的每一个 depart标签
//输出其中的 name属性
也可以使用方括号“ []”来直接读取 XML数据中指定的标签。以下代码输出了上面 XML数据中的第一个“depart”标签的“name”属性。

 

 代码如下 复制代码
<?php
$xml = simplexml_load_file(’example.xml’); //读取 XML文件
echo $xml->depart->name[0]; //输出节点
?>

运行结果如下所示。
production support
对于一个标签下的所有子标签,SimpleXML组件提供了 children方法进行读取。例如,对于上面的 XML数据中的“ depart”标签,其下包括两个子标签:“ name”和“employees”。以下代码实现了对第一个“depart”标签下的子标签的读取。

DOMDocument这个功能是我们php中自带的一个功能,下面我来介绍利用DOMDocument生成xml文档,并且也介绍DOMDocument解析xml文件的方法,有需要的朋友可参考。

数组

 代码如下 复制代码

$arr[] = array(

'name' => $row['name'],

'sex' => $row['sex'],

'age' => $row['age']

);

生成php

 代码如下 复制代码

$doc = new DOMDocument('1.0', 'utf-8'); // 声明版本和编码

$doc->formatOutput = true;
$r = $doc->createElement("root");

$doc->appendChild($r);
foreach ($arr as $dat) {

$b = $doc->createElement("data");
$name = $doc->createElement("name");

$name->appendChild($doc->createTextNode($dat['name']));

$b->appendChild($name);
$sex = $doc->createElement("sex");

$sex->appendChild($doc->createTextNode($dat['sex']));

$b->appendChild($sex);

$age = $doc->createElement("age");

$age->appendChild($doc->createTextNode($dat['age']));

$b->appendChild($age);

$r->appendChild($b);

}
echo $doc->saveXML();

这样就生成了一个xml文件了

解析xml文件也是非常的简单了

 代码如下 复制代码

header("Content-type:text/html; Charset=utf-8");

$url = "createXML.php";

$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);

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能

    这篇文章主要介绍了基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • PHP mysql与mysqli事务使用说明 分享

    mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
  • Postman安装与使用详细教程 附postman离线安装包

    这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05