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 相关文章推荐
第一节--面向对象编程
Nov 16 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
Jul 25 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
php将html转为图片的实现方法
May 19 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
PHP 文件上传限制问题
Sep 01 PHP
PHP isset empty函数相关面试题及解析
Dec 11 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
PHP读取MySQL数据代码
2008/06/05 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
跟老齐学Python之有点简约的元组
2014/09/24 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Python 监测文件是否更新的方法
2019/06/10 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
淘宝中秋节活动方案
2014/01/31 职场文书
20年同学聚会感言
2014/02/03 职场文书
市场营销工作计划书
2014/05/06 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL