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 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
php 常用类整理
Dec 23 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
python中xrange和range的区别
2014/05/13 Python
python实现查询苹果手机维修进度
2015/03/16 Python
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python使用matplotlib画饼状图
2018/09/25 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
九州传奇上机题
2014/07/10 面试题
新驾驶员个人自我评价
2014/01/03 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
个人汇报材料范文
2014/12/30 职场文书
捐助感谢信
2015/01/22 职场文书
工程款申请报告
2015/05/15 职场文书