首页 > php开发 > PHP使用SimpleXML检查XML文件结构是否合法实例

PHP使用SimpleXML检查XML文件结构是否合法实例

SimpleXML 函数允许您把 XML 转换为对象,通过普通的属性选择器或数组迭代器,可以处理这个对象,就像处理任何其他对象一样,SimpleXML 函数是 PHP 核心的组成部分,无需安装即可使用这些函数.

利用 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.xmln"; 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>


教程链接:http://www.phprm.com/develop/fs9084.html

随意转载~但请保留教程地址★

标签:simplexml xml文件结构

相关文章

发表留言