- <?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>