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

  利用 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.xml\n"; 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>