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>