读取并更新匹配值的XML值


read and update XML value for matching value

如果传递的值与父值匹配,我将尝试更新XML文件。基本上每分钟ping一次一系列IP地址,结果被传递给我的php脚本,如下所示:http://ipaddress/presence.php?ip=192.168.0.55&present=1

XML(present.XML):

<?xml version="1.0" encoding="UTF-8"?>
<Presence> 
    <Person IP="192.168.0.55"> 
        <Name>Bob</Name>
        <Present>1</Present>
        <LastSeen>14/09/2014 01:48:43 pm</LastSeen> 
    </Person>
    <Person IP="192.168.0.56"> 
        <Name>John</Name>
        <Present>0</Present>
        <LastSeen>13/09/2014 08:32:19 pm</LastSeen> 
    </Person>
</Presence>

PHP(present.PHP):

<?php
$ip = $_REQUEST['ip'];
$present = $_REQUEST['present'];
// Write latest data to XML file
$Presence = simplexml_load_file('presence.xml');
foreach ($Presence->xpath('//Person') as $Person) {
    if ($Person[@IP] == $ip) {
        $Person->Present = $present;
    }
    else {}
}
?>

上面的代码我希望用URL中传递的值更新<Present>标记。然而什么也没发生,我在日志文件中没有得到任何错误。我在IF语句中确实有$present值,最初是在错误的情况下编写的,这确实引发了一个关于未定义变量的错误,这表明代码与IF语句一样有效。

感谢任何帮助,我看了各种问答;就像Stackoverflow一样,这就是我走到这一步的原因,但我无法理解。一旦我扫清了这个障碍,我就有望添加代码来更新XML中的<LastSeen>标记。

url需要正确格式化(用&替换$):

http://ipaddress/presence.php?ip=192.168.0.55&present=1

编辑确保在修改后保存

$Presence->asXML('presence.xml');

尝试:

foreach ($Presence->Person as $Person) {
    if ($Person->attributes()->IP == $ip) {
        $Person->Present = $present;
    }
}

此外,请确保您实际上得到了一个XML字符串(以您发布的格式),以防您的输入与您期望的不完全一样。