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

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

代码如下:
/**检查 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
"; 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
代码如下:
Category文字 Title<a href="https://www.f2er.com/tag/wenzi/" target="_blank" class="keywords">文字</a> check_1.xml

<?xml version="1.0" encoding="UTF-8"?>

Category文字 Title<a href="https://www.f2er.com/tag/wenzi/" target="_blank" class="keywords">文字</a> Category文字 Title<a href="https://www.f2er.com/tag/wenzi/" target="_blank" class="keywords">文字</a> Description文字

测试范例 2

base_2.xml
代码如下:
文字" Title="Title文字"/> check_2.xml

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...