利用 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"; 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  测试范例 1base_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>   测试范例 2base_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>