PHP中使用SimpleXML检查XML文件结构实例


Posted in PHP onJanuary 07, 2015

利用 SimpleXML 去检查 XML 结构是否符合规格,为了让这个程序可以多用途,采用了一个基准文件的作为结构准则,依据里面定义的节点跟属性,去检查文件是否符合基本要求的格式。

<?php    

    

/**检查 XML 文件结构   

* @param string $baseFilePath 基准结构文件   

* @param string $checkFilePath 待检查文件   

* @return bool 当结构与基准文件相符合时则传递 true,否则是 false   

* */    

function checkXmlFileStructure($baseFilePath,$checkFilePath){    

   /*开启 Base File*/    

   if(!file_exists($baseFilePath)){ return false; }    

   $base = simplexml_load_file($baseFilePath);    

   if($base===false){ return false; }    

    

   /*开启 Check File*/    

   if(!file_exists($checkFilePath)){ return false; }    

   $check = simplexml_load_file($checkFilePath);    

   if($check===false){ return false; }    

    

   /*比较起始点的名称*/    

   if($base->getName() != $check->getName()){ return false; }    

    

   /*比较结构*/    

   return checkXmlStructure($base,$check);    

}    

    

/**检查 XML 结构   

* @param SimpleXMLElement $base 基准结构对象   

* @param SimpleXMLElement $check 待检查 XML 对象   

* @return bool 当结构与基准对象相符合时则传递 true,否则是 false   

* */    

function checkXmlStructure($base,$check){    

   /*检查属性*/    

   foreach ($base->attributes() as $name => $baseAttr){    

       /*必要的属性不存在*/    

       if(!isset($check->attributes()->$name)){ return false; }    

   }    

    

   /*当没有子节点时,则检查对象也不能有子节点*/    

   if(count($base->children())==0){    

       return (count($check->children())==0);    

   }    

    

   /*将检查对象的子节点分群*/    

   $checkChilds = array();    

   foreach($check->children() as $name => $child){    

       $checkChilds[$name][] = $child;    

   }    

    

   /*检查子节点*/    

   $checked = array();    

   foreach($base->children() as $name => $baseChild){    

       /*跳过已经检查的子节点*/    

       if(in_array($name, $checked)){ continue; }    

       $checked[] = $name;    

    

       /*检查必要的子节点是否存在*/    

       if(emptyempty($checkChilds[$name])){ return false; }    

    

       foreach ($checkChilds[$name] as $child){    

           /*递回检查子节点*/    

           if( !checkXmlStructure($baseChild, $child) ){ return false; }    

       }    

   }    

    

   return true;    

}    

    

    

/*==============================================================================*/    

    

if(isset($_SERVER['argv'])){    

   parse_str(preg_replace('/&[\-]+/','&',join('&',$_SERVER['argv'])), $_GET);    

    

   if(emptyempty($_GET['base_file']) || emptyempty($_GET['check_file'])){    

       echo "Run: ".basename(__FILE__)." base_file=base.xml check_file=check.xml\n"; exit(1);    

   }    

    

   exit( checkXmlFileStructure($_GET['base_file'],$_GET['check_file']) ? 0 : 1);    

    

}else{    

   if(emptyempty($_GET['base_file']) || emptyempty($_GET['check_file'])){    

       echo "Run: ".basename(__FILE__)."?base_file=base.xml&check_file=check.xml<br />"; exit;    

   }    

    

   echo( checkXmlFileStructure($_GET['base_file'],$_GET['check_file']) ? '1' : '0');    

}  

使用方式(shell)

php check_xml_file_structure.php base_file=base.xml check_file=check.xml    

    

if [ "j$?" != "j0" ]; then    

   echo "Run Error"    

fi 

测试范例 1
base_1.xml
<?xml version="1.0" encoding="UTF-8"?>    

<items>    

   <item>    

       <Category>Category文字</Category>    

       <Title>Title文字</Title>    

   </item>    

</items>  

check_1.xml

 

<?xml version="1.0" encoding="UTF-8"?>    

<items>    

   <item>    

       <Category>Category文字</Category>    

       <Title>Title文字</Title>    

   </item>    

   <item>    

       <Category>Category文字</Category>    

       <Title>Title文字</Title>    

       <Description>Description文字</Description>    

   </item>    

</items>  

测试范例 2
base_2.xml
<?xml version="1.0" encoding="UTF-8"?>    

<items>    

   <item category="Category文字" Title="Title文字"/>    

</items>   

check_2.xml

<?xml version="1.0" encoding="UTF-8"?>    

<items>    

   <item category="Category文字" Title="Title文字" Description="Description文字" />    

   <item category="Category文字" Title="Title文字" />    

   <item category="Category文字" Title="Title文字" Description="Description文字" />    

</items>
PHP 相关文章推荐
PHP脚本中include文件出错解决方法
Nov 20 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
php实例分享之mysql数据备份
May 19 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
标准版Eclipse搭建PHP环境的详细步骤
Nov 18 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
php实现将数据做成json的格式给前端使用
Aug 21 PHP
php中$_POST与php://input的区别实例分析
Jan 07 #PHP
php静态文件返回304技巧分享
Jan 06 #PHP
php判断当前用户已在别处登录的方法
Jan 06 #PHP
php实现utf-8转unicode函数分享
Jan 06 #PHP
windows中为php安装mongodb与memcache
Jan 06 #PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 #PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 #PHP
You might like
php生成略缩图代码
2012/07/16 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
php常用数学函数汇总
2014/11/21 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
JavaScript自定义超时API代码实例
2020/04/30 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
跟老齐学Python之编写类之三子类
2014/10/11 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python绘制直方图和密度图的实例
2019/07/08 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
协议书范本
2014/04/23 职场文书
辛亥革命观后感
2015/06/02 职场文书
创业计划书之面包店
2019/09/12 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
深入探讨opencv图像矫正算法实战
2021/05/21 Python