首页 > php代码 > PHP使用SimpleXML检查XML文件结构是否合法实例

PHP使用SimpleXML检查XML文件结构是否合法实例

SimpleXML 函数允许您把 XML 转换为对象。通过普通的属性选择器或数组迭代器,可以处理这个对象,就像处理任何其他对象一样。SimpleXML 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。

利用 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.xmln"; 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

测试范例 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>


本文链接:http://www.phprm.com/code/74548.html

收藏随意^^请保留教程地址.

标签:foreach

相关文章

发表留言