我希望将诸如'heloo'之类的变量分配给地址,例如 - > system_settings-> settings-> hostname,然后我写一个函数for.now当我手动编写该地址时,此功能正常工作,将'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-&gt; $ tag_address = $ value;作为字符串,而不是地址。 我该怎么办? TNX
答案 0 :(得分: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');
没有第一个->
。
答案 1 :(得分:0)
使用XPath选择节点,然后更新值。为此,您需要为标记地址使用正确的systax。
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');
}