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 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
php 保留字列表
Oct 04 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
php实现插入排序
Mar 29 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
Yii2使用自带的UploadedFile实现的文件上传
Jun 20 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
js 蒙版进度条(结合图片)
2010/03/10 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
详解Python中break语句的用法
2015/05/14 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
招聘专员岗位职责
2014/03/07 职场文书
大学新生军训方案
2014/05/03 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
工作试用期自我评价
2015/03/10 职场文书
物业接待员岗位职责
2015/04/15 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
Java 数组的使用
2022/05/11 Java/Android
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers