当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-09 11:28:40 浏览: 评论:0 

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

利用 SimpleXML 去检查 XML 结构是否符合规格,为了让这个程序可以多用途,采用了一个基准文件的作为结构准则,依据里面定义的节点跟属性,去检查文件是否符合基本要求的格式,代码如下:

  1. <?php     
  2. /**检查 XML 文件结构    
  3. * @param string $baseFilePath 基准结构文件    
  4. * @param string $checkFilePath 待检查文件    
  5. * @return bool 当结构与基准文件相符合时则传递 true,否则是 false    
  6. * */     
  7. function checkXmlFileStructure($baseFilePath,$checkFilePath){     
  8.    /*开启 Base File*/     
  9.    if(!file_exists($baseFilePath)){ return false; }     
  10.    $base = simplexml_load_file($baseFilePath);     
  11.    if($base===false){ return false; }     
  12.      
  13.    /*开启 Check File*/     
  14.    if(!file_exists($checkFilePath)){ return false; }     
  15.    $check = simplexml_load_file($checkFilePath);     
  16.    if($check===false){ return false; }     
  17.      
  18.    /*比较起始点的名称*/     
  19.    if($base->getName() != $check->getName()){ return false; }     
  20.      
  21.    /*比较结构*/     
  22.    return checkXmlStructure($base,$check);     
  23. }     
  24.      
  25. /**检查 XML 结构    
  26. * @param SimpleXMLElement $base 基准结构对象    
  27. * @param SimpleXMLElement $check 待检查 XML 对象    
  28. * @return bool 当结构与基准对象相符合时则传递 true,否则是 false    
  29. * */     
  30. function checkXmlStructure($base,$check){     
  31.    /*检查属性*/     
  32.    foreach ($base->attributes() as $name => $baseAttr){     
  33.        /*必要的属性不存在*/     
  34.        if(!isset($check->attributes()->$name)){ return false; }     
  35.    }     
  36.      
  37.    /*当没有子节点时,则检查对象也不能有子节点*/     
  38.    if(count($base->children())==0){     
  39.        return (count($check->children())==0);     
  40.    }     
  41.      
  42.    /*将检查对象的子节点分群*/     
  43.    $checkChilds = array();     
  44.    foreach($check->children() as $name => $child){     
  45.        $checkChilds[$name][] = $child;     
  46.    }     
  47.      
  48.    /*检查子节点*/     
  49.    $checked = array();     
  50.    foreach($base->children() as $name => $baseChild){     
  51.        /*跳过已经检查的子节点*/     
  52.        if(in_array($name, $checked)){ continue; }     
  53.        $checked[] = $name;     
  54.      
  55.        /*检查必要的子节点是否存在*/     
  56.        if(emptyempty($checkChilds[$name])){ return false; }     
  57.      
  58.        foreach ($checkChilds[$name] as $child){     
  59.            /*递回检查子节点*/     
  60.            if( !checkXmlStructure($baseChild, $child) ){ return false; }     
  61.        }   //开源软件:phpfensi.com 
  62.    }     
  63.      
  64.    return true;     
  65. }     
  66.      
  67.      
  68. /*==============================================================================*/     
  69.      
  70. if(isset($_SERVER['argv'])){     
  71.    parse_str(preg_replace('/&[-]+/','&',join('&',$_SERVER['argv'])), $_GET);     
  72.      
  73.    if(emptyempty($_GET['base_file']) || emptyempty($_GET['check_file'])){     
  74.        echo "Run: ".basename(__FILE__)." base_file=base.xml check_file=check.xmln"; exit(1);     
  75.    }     
  76.      
  77.    exit( checkXmlFileStructure($_GET['base_file'],$_GET['check_file']) ? 0 : 1);     
  78.      
  79. }else{     
  80.    if(emptyempty($_GET['base_file']) || emptyempty($_GET['check_file'])){     
  81.        echo "Run: ".basename(__FILE__)."?base_file=base.xml&check_file=check.xml<br />"; exit;     
  82.    }     
  83.      
  84.    echo( checkXmlFileStructure($_GET['base_file'],$_GET['check_file']) ? '1' : '0');     

使用方式(shell),代码如下:

  1. php check_xml_file_structure.php base_file=base.xml check_file=check.xml     
  2.      
  3. if [ "j$?" != "j0" ]; then     
  4.    echo "Run Error"     
  5. fi 

测试范例 1 base_1.xml 代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <items> 
  3.    <item> 
  4.        <Category>Category文字</Category> 
  5.        <Title>Title文字</Title> 
  6.    </item> 
  7. </items> 

check_1.xml 代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>     
  2. <items>     
  3.    <item>     
  4.        <Category>Category文字</Category>     
  5.        <Title>Title文字</Title>     
  6.    </item>     
  7.    <item>     
  8.        <Category>Category文字</Category>     
  9.        <Title>Title文字</Title>     
  10.        <Description>Description文字</Description>     
  11.    </item>     
  12. </items> 

测试范例 2 base_2.xml 代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>     
  2. <items>     
  3.    <item category="Category文字" Title="Title文字"/>     
  4. </items> 

check_2.xml 代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <items>  
  3.    <item category="Category文字" Title="Title文字" Description="Description文字" />     
  4.    <item category="Category文字" Title="Title文字" />     
  5.    <item category="Category文字" Title="Title文字" Description="Description文字" />     
  6. </items>

Tags: SimpleXML XML文件结构

分享到: