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 相关文章推荐
smarty静态实验表明,网络上是错的~呵呵
Nov 25 PHP
php下判断数组中是否存在相同的值array_unique
Mar 25 PHP
php disk_free_space 返回目录可用空间
May 10 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
解析thinkphp基本配置 convention.php
Jun 18 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
php文件缓存类汇总
Nov 21 PHP
ioncube_loader_win_5.2.dll的错误解决方法
Jan 04 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 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把数组值转换成键的方法
2015/07/13 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
jQuery 使用个人心得
2009/02/26 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
python中Apriori算法实现讲解
2017/12/10 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
中国旅游网站:同程旅游
2016/09/11 全球购物
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
软件工程毕业生自荐信
2014/07/04 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
python 管理系统实现mysql交互的示例代码
2021/12/06 Python
Python函数对象与闭包函数
2022/04/13 Python