PHP中使用SimpleXML检查XML文件结构实例
利用SimpleXML去检查XML结构是否符合规格,为了让这个程序可以多用途,采用了一个基准文件的作为结构准则,依据里面定义的节点跟属性,去检查文件是否符合基本要求的格式。
<?php
/**检查XML文件结构
*@paramstring$baseFilePath基准结构文件
*@paramstring$checkFilePath待检查文件
*@returnbool当结构与基准文件相符合时则传递true,否则是false
**/
functioncheckXmlFileStructure($baseFilePath,$checkFilePath){
/*开启BaseFile*/
if(!file_exists($baseFilePath)){returnfalse;}
$base=simplexml_load_file($baseFilePath);
if($base===false){returnfalse;}
/*开启CheckFile*/
if(!file_exists($checkFilePath)){returnfalse;}
$check=simplexml_load_file($checkFilePath);
if($check===false){returnfalse;}
/*比较起始点的名称*/
if($base->getName()!=$check->getName()){returnfalse;}
/*比较结构*/
returncheckXmlStructure($base,$check);
}
/**检查XML结构
*@paramSimpleXMLElement$base基准结构对象
*@paramSimpleXMLElement$check待检查XML对象
*@returnbool当结构与基准对象相符合时则传递true,否则是false
**/
functioncheckXmlStructure($base,$check){
/*检查属性*/
foreach($base->attributes()as$name=>$baseAttr){
/*必要的属性不存在*/
if(!isset($check->attributes()->$name)){returnfalse;}
}
/*当没有子节点时,则检查对象也不能有子节点*/
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])){returnfalse;}
foreach($checkChilds[$name]as$child){
/*递回检查子节点*/
if(!checkXmlStructure($baseChild,$child)){returnfalse;}
}
}
returntrue;
}
/*==============================================================================*/
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.xmlcheck_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)
phpcheck_xml_file_structure.phpbase_file=base.xmlcheck_file=check.xml if["j$?"!="j0"];then echo"RunError" fi
测试范例1
base_1.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<items>
<item>
<Category>Category文字</Category>
<Title>Title文字</Title>
</item>
</items>
check_1.xml
<?xmlversion="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
<?xmlversion="1.0"encoding="UTF-8"?> <items> <itemcategory="Category文字"Title="Title文字"/> </items> check_2.xml <?xmlversion="1.0"encoding="UTF-8"?> <items> <itemcategory="Category文字"Title="Title文字"Description="Description文字"/> <itemcategory="Category文字"Title="Title文字"/> <itemcategory="Category文字"Title="Title文字"Description="Description文字"/> </items>