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中使用与Perl兼容的正则表达式
Nov 26 PHP
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
PHP求小于1000的所有水仙花数的代码
Jan 10 PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 PHP
php查看当前Session的ID实例
Mar 16 PHP
php实现的简单日志写入函数
Mar 31 PHP
深入解析PHP中foreach语句控制数组循环的用法
Nov 30 PHP
php快速排序原理与实现方法分析
May 26 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
PHP的PDO预定义常量讲解
Jan 24 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 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 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
python实现人人网登录示例分享
2014/01/19 Python
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
Python内建数据结构详解
2016/02/03 Python
Python三级菜单的实例
2017/09/13 Python
Python和Go语言的区别总结
2019/02/20 Python
python版DDOS攻击脚本
2019/06/12 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
学校运动会报道稿
2014/09/23 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python