当前位置:首页>

文章详细页

区分XML中的四种节点

分类:PHP


在PHP解析xml文件时,会遇到如下四种节点,如何在if判断里区分它们?   

    正常节点   

    值为空的节点

    注释节点(#comment)

    空白节点(如回车符#text)


========== 情况1
$node->hasChildNodes()
结果:
    √ 正常节点
    × 值为空的节点
    × 注释节点
    × 空白节点
举例:
    "STEP-TYPE": "FLASH_PREJOB",
    "TEXT": "控制器刷写正在执行",
    "INPUT-SAVEVALUE": "YES",
    "RETURN-VALUE": "0",
    "CALL-NUMBER": "3",
    "T-GO": "5",
    "F-GO": "6"


========== 情况2
$node->nodeType != XML_TEXT_NODE && $node->nodeType != XML_COMMENT_NODE
结果:
    √ 正常节点
    √ 值为空的节点
    × 注释节点
    × 空白节点
举例:
    "GUID": "",
    "STEP-TYPE": "FLASH_PREJOB",
    "TEXT": "控制器刷写正在执行",
    "INPUT-SAVEVALUE": "YES",
    "RETURN-VALUE": "0",
    "CALL-NUMBER": "3",
    "T-GO": "5",
    "F-GO": "6"


========== 情况3
$node->nodeType != XML_TEXT_NODE
结果:
    √ 正常节点
    √ 值为空的节点
    √ 注释节点
    × 空白节点
举例:
    "GUID": "",
    "STEP-TYPE": "FLASH_FlashJOB",
    "#comment": " <INPUT-SAVEFILE>:输入之前存储的临时文件。YES为输入,NO为不输入 ",
    "TEXT": "控制器刷写正在执行",
    "INPUT-SAVEFILE": "YES",
    "RETURN-VALUE": "0",
    "T-GO": "7",
    "F-GO": "5"


============================实例

========== xml文件
<PROC GUID="" SHORTNAME="Service_RoutineControlCheckProgrammingPreConditions" LONGNAME="Offline Flash">
    <LOGICNUM>103</LOGICNUM>
    <VEHICLE>M85</VEHICLE>
    <STEPS STPS-REF="" ECU="TCU" ECU-ID="">
    
    <STEP INDEX="0" ID="">
        <GUID></GUID>
        <STEP-TYPE>GET_SYSTIME</STEP-TYPE>   <!-- <STEP-TYPE>:执行模块名  //GET_SYSTIME:获取系统时间 -->
        <TEXT>控制器刷写准备中</TEXT>        <!-- <TEXT>:显示文本内容 -->
        <CLEAR-VALUE>YES</CLEAR-VALUE>       <!--  <CLEAR-VALUE>:清除临时存储的数值。YES为清除,NO为不清除 -->
        <SAVE-VALUE>YES</SAVE-VALUE>  <!-- <SAVE-VALUE>:保存临时存储的数值。YES为保存,用逗号隔开追加 NO为不保存。 -->
    </STEP>
    
    <STEP INDEX="1" ID="">
        <GUID></GUID>
        <STEP-TYPE>GET_DEALER_CODE</STEP-TYPE>   <!-- // GET_DEALER_CODE:获取经销商代码 -->
        <TEXT>控制器刷写准备中</TEXT>
        <CLEAR-VALUE>NO</CLEAR-VALUE>
        <SAVE-VALUE>YES</SAVE-VALUE>
    </STEP>

    <STEP INDEX="2" ID="">
        <GUID></GUID>
        <STEP-TYPE>GET_FALSHLOCALFILE</STEP-TYPE>
        <TEXT>控制器刷写准备中</TEXT>
        <FILE-NUMBER>1</FILE-NUMBER>   <!-- <FILE-NUMBER>:文件的个数 -->
        <CLEAR-FILE>YES</CLEAR-FILE>   <!-- <CLEAR-FILE>:清除临时存储的文件(路径名)。YES为清除,NO为不清除 -->
        <SAVE-FILE>YES</SAVE-FILE>  <!-- <SAVE-FILE>:保存临时存储的文件。YES为保存,用逗号隔开追加  NO为不保存。 -->
    </STEP>

    </STEPS>
</PROC>


========== PHP函数
/*
*  解析XML函数
*  参数:    $filename    xml文件名
*                $ln             在结果中返回的节点名称
*  返回值: $res            数组
*/
function tcuProcess($filename='', $ln=''){
    $res = [];
    if (file_exists($filename)) {
        $xml = new \DOMDocument();
        $xml->load($filename);
        $first =$xml->getElementsByTagName('PROC');//一级元素
        //转换成数组格式
        foreach($first as $fv){
            if($fv != null){
                $longName =  $fv->getattribute('LONGNAME');//一级键名称
                if($ln == $longName){
                    $second = $fv->getElementsByTagName('STEP');//二级元素
                    foreach($second as $sv){
                        if($sv != null){
                            $index =  intval($sv->getattribute('INDEX'));//二级键名称
                            $remp = [];
                            $childs = $sv->childNodes;
                            foreach($childs as $vvv){
                                if($vvv->hasChildNodes()){ //过滤掉值为空的节点、注释节点(#comment)、空白节点(如回车符#text)
                                    $temp[$vvv->nodeName] = $vvv->nodeValue;
                                }
                            }
                            $res[$index] = $temp;
                            unset($temp);
                        }
                    }
                }else{
                    return null;
                }
            }
        }
        return $res;
    } else {
        exit('打开xml文件失败!');
    }
}