<?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(empty($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(empty($_GET['base_file']) || empty($_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(empty($_GET['base_file']) || empty($_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>
0 回應:
張貼留言