0

我想将诸如'heloo'之类的变量分配给诸如-> system_settings->settings->hostname之类的地址,然后我编写了一个函数。现在,当我手动编写该地址时,该函数可以正常工作并将“hello”分配给那个地址,但是,当我想动态地给出地址时,它不起作用。我的功能:

<?php
write_xml("->system_settings->settings->hostname",'Helloooooooo');
function write_xml($tag_address,$value) {

    $xml = simplexml_load_file("test.xml")
                 or die("Error: Cannot create object");
    //  $xml->system_settings->settings->hostname = $value;
    $xml->$tag_address=$value;
    $xml->asXML("test.xml");

}
?>

当我运行命令行时它可以工作但在动态模式下它不起作用并在此行中标识 $tag_address $xml->$tag_address=$value; 作为字符串,而不是地址。我应该怎么办?TNX

4

2 回答 2

0

解决方案并不那么容易。

最简单但最不安全的方法是使用eval()函数,这样您就可以编写如下内容:

eval('$xml'.$tag_address.' = $value;'); // note ' as quotation marks

最正确的方法是拆分文本并手动创建链接对象。您不能只引用一个字符串中的所有链接元素,但您可以使用一个元素逐步完成此操作。

例如像

$splitted_text = explode('->', $tag_address);
$node = $xml;
foreach($splitted_text as $object)
  $node = &$node -> {$object};
// at the moment $node = $xml->system_settings->settings->hostname
$node = $value;
$xml->asXML("test.xml");

应该管用。我还没有测试过它,但想法是在每次迭代中你准备$node变量更深入地进入$xml变量。最后你只修改$node, 但由于对象只是引用,所以$xml应该相应地改变。

此示例假定->的开头没有$tag_address。如果是,则函数会有问题,explode()因为这会创建空字符串作为$splitted_text数组的第一个元素。

因此,您可能需要删除此空元素或将调用应用为

 write_xml("system_settings->settings->hostname",'Helloooooooo');

没有第一个->

于 2013-05-27T08:17:01.093 回答
0

使用 XPath 选择节点,然后更新值。为此,您需要为您的标签地址设置正确的系统税。

write_xml("system_settings/settings/hostname", 'Helloooooooo');

function write_xml($tag_address, $value)
{
    $xml         = simplexml_load_file('test.xml') or die("Error: Cannot create object");
    $nodes       = $xml->xpath($tag_address);
    $nodes[0][0] = $value;
    $xml->asXML('test.xml');
}
于 2013-05-28T12:43:09.277 回答