unset()不适用于XML

时间:2014-03-16 03:28:54

标签: php xml debugging simplexml unset

目前我正在使用unset()删除simpleXML中的父节点,并将其写回XML文件

我尝试过这段代码并且它已经工作了一段时间,在清理完我的代码之后我找不到它为什么不能突然工作,

我采取的调试方法:可以访问文件,我可以进入循环和if语句,文件被保存(notepad ++要求我重新加载),但<systemInfo></systemInfo>没有被删除

以下是我的示例代码:

        $userorig = $_POST['user'];
        $userinfos = simplexml_load_file('userInfo.xml'); // Opens the user XML file

        foreach ($userinfos->userinfo->account as $account) 
        {       
            // Checks if the user in this iteration of the loop is the same as $userorig (the user i want to find)
            if($account->user == $userorig)
            {
                echo "hello";
                $rootSystem = $account->systemInfo;
                unset($rootSystem);
            }
        }
        $userinfos->saveXML('userInfo.xml');

我的XML文件:

<userinfos>
  <userinfo>
   <account>
     <user>TIGERBOY-PC</user>
     <toDump>2014-03-15 03:20:44</toDump>
     <toDumpDone>0</toDumpDone>
     <initialCheck>0</initialCheck>
     <lastChecked>2014-03-16 07:12:17</lastChecked>
     <alert>1</alert>
     <systemInfo>
          ... (many nodes and sub nodes here) ...
     </systemInfo>
   </account>
  </userinfo>
</userinfos>

2 个答案:

答案 0 :(得分:1)

不是迭代整个xml,而是使用xpath来选择节点:

$userorig = $_POST['user'];
$userinfos = simplexml_load_file('userInfo.xml'); // Opens the user XML file

$deletethisuser = $userinfos->xpath("/userinfos/userinfo/account[user = '$userorig']/systemInfo")[0];
unset($deletethisuser[0]);

<强>注释:

[0]行中的xpath...需要PHP&gt; = 5.4,如果您使用的是较低版本,请更新或转到:

$deletethisuser = $userinfos->xpath("/userinfos/userinfo/account[user = '$userorig']/systemInfo");
unset($deletethisuser[0][0]);

建议阅读:hakre在这个帖子中的回答:Remove a child with a specific attribute, in SimpleXML for PHP

答案 1 :(得分:-1)

它再次起作用,对不起,我不知道它为什么有效,我继续在多个实例上运行它,现在它可以工作,程序有奇怪的行为,但尝试了大约15次尝试,它完成了它的工作