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 相关文章推荐
PHPMailer 中文使用说明小结
Jan 22 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 PHP
详解PHP中array_rand函数的使用方法
Sep 11 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
php ajax confirm 删除实例详解
Mar 06 PHP
PHP 对象继承原理与简单用法示例
Apr 21 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
js静态作用域的功能。
2006/12/25 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
javascript正则表达式总结
2016/02/29 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
原生js开发的日历插件
2017/02/04 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python变量不能以数字打头详解
2016/07/06 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
英语专业个人求职自荐信
2013/09/21 职场文书
综合办公室主任职责
2013/12/16 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
python实现简单的聊天小程序
2021/07/07 Python
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB