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 相关文章推荐
PHP5/ZendEngine2的改进
Oct 09 PHP
针对初学PHP者的疑难问答(2)
Oct 09 PHP
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
PHP Memcached应用实现代码
Feb 08 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
有关phpmailer的详细介绍及使用方法
Jan 28 PHP
Yii学习总结之安装配置
Feb 22 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
PHP钩子实现方法解析
May 21 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 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实现mysql数据库备份类
2008/03/20 PHP
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python动态监控日志内容的示例
2014/02/16 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
python将图片文件转换成base64编码的方法
2015/03/14 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
python实现斗地主分牌洗牌
2020/06/22 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
法律意见书范文
2015/05/20 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
Python中time与datetime模块使用方法详解
2022/03/31 Python