PHP中使用SimpleXML检查XML文件结构实例

 更新时间:2015年01月07日 09:40:49   投稿:junjie  
这篇文章主要介绍了PHP中使用SimpleXML检查XML文件结构实例,本文讲解使用SimpleXML来检查一个XML文件是否符合规范的方法,需要的朋友可以参考下

利用 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 array_map与array_walk比较案例详解

    php array_map与array_walk比较案例详解

    这篇文章主要介绍了php array_map与array_walk比较案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • PHP获取windows登录用户名的方法

    PHP获取windows登录用户名的方法

    这篇文章主要介绍了PHP获取windows登录用户名的方法,通过NTLM来实现,NTLM 是 Windows NT 早期版本的标准安全协议,需要的朋友可以参考下
    2014-06-06
  • 使用Limit参数优化MySQL查询的方法

    使用Limit参数优化MySQL查询的方法

    我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的。那么在 MySQL 中有那些方式是可以避免全表扫面的呢?除了我们大家很熟悉的通过使用索引列或分区等方式来进行查询的优化之外还有那些呢?
    2008-11-11
  • 使用php判断服务器是否支持Gzip压缩功能

    使用php判断服务器是否支持Gzip压缩功能

    开启Gzip是需要服务器支持的,在这里我们简单的使用php来判断服务器是否支持Gzip功能,具体如下,感兴趣的朋友可以参考下
    2013-09-09
  • php生成百度sitemap站点地图类函数实例

    php生成百度sitemap站点地图类函数实例

    这篇文章主要介绍了php生成百度sitemap站点地图类函数的方法,详细讲述了百度站点sitemap的实现方法与注意事项,在web站点的建设中非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • 浅谈php调用python文件

    浅谈php调用python文件

    这篇文章主要介绍了php调用python文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • php实现查看邮件是否已被阅读的方法

    php实现查看邮件是否已被阅读的方法

    当你在发送邮件时,你或许很想知道该邮件是否被对方已阅读,下面有段不错的代码可以实现此需求,喜欢的朋友可以参考下
    2013-12-12
  • 解析ajax事件的调用顺序

    解析ajax事件的调用顺序

    本篇文章是对ajax事件的调用顺序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP正则删除HTML代码中宽高样式的方法

    PHP正则删除HTML代码中宽高样式的方法

    这篇文章主要介绍了PHP正则删除HTML代码中宽高样式的方法,涉及php针对HTML代码的正则匹配、替换等操作技巧,需要的朋友可以参考下
    2017-06-06
  • 基于PHP实现堆排序原理及实例详解

    基于PHP实现堆排序原理及实例详解

    这篇文章主要介绍了基于PHP实现堆排序原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06

最新评论