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 相关文章推荐
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
php header函数的常用http头设置
Jun 25 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
php无限级分类实现方法分析
Oct 19 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
浅析PHP开发规范
Feb 05 PHP
PHP的mysqli_stat()函数讲解
Jan 23 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 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
zend framework多模块多布局配置
2011/02/26 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
军训的自我鉴定
2013/12/10 职场文书
英文自荐信
2013/12/19 职场文书
学校岗位设置方案
2014/01/16 职场文书
迅雷Cued工作心得体会
2014/01/27 职场文书
年会搞笑主持词
2014/03/27 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
在pycharm中无法import所安装的库解决方案
2021/05/31 Python