PHP中使用SimpleXML检查XML文件结构实例
程序员文章站
2022-05-29 10:49:47
利用 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>
推荐阅读
-
php的SimpleXML方法读写XML接口文件实例解析
-
PHP中使用SimpleXML检查XML文件结构实例
-
php下使用SimpleXML 处理XML 文件
-
php中simplexml_load_string使用实例分享
-
php的SimpleXML方法读写XML接口文件实例解析
-
php中simplexml_load_string使用实例分享_php实例
-
PHP中使用SimpleXML检查XML文件结构实例_PHP
-
php下使用SimpleXML 处理XML 文件_PHP
-
php中simplexml_load_string使用实例分享_PHP
-
too young too simple php下使用SimpleXML 处理XML 文件