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

PHP中使用SimpleXML检查XML文件结构实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-05 21:16:37 浏览: 评论:0 

这篇文章主要介绍了PHP中使用SimpleXML检查XML文件结构实例,本文讲解使用SimpleXML来检查一个XML文件是否符合规范的方法,需要的朋友可以参考下

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

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

测试范例 2

base_2.xml 代码如下:

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

Tags: SimpleXML XML文件结构

分享到: