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截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
php去掉URL网址中带有PHPSESSID的配置方法
Jul 08 PHP
php判断一个数组是否为有序的方法
Mar 27 PHP
php检测文本的编码
Jul 26 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
PHP7基于curl实现的上传图片功能
May 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弹出对话框实现重定向代码
2014/01/23 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
vue .sync修饰符的使用详解
2018/06/15 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
token 机制和实现方式
2020/12/15 Javascript
Python 正则表达式入门(中级篇)
2016/12/07 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
大学生毕业自我鉴定范文
2014/02/03 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android