欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-04-05 16:48:40
利用 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>