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()function を使用することです。これにより、次のように記述できます。

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

最も正しい方法は、テキストを分割し、チェーン オブジェクトを手動で作成することです。1 つの文字列でチェーンされたすべての要素を参照することはできませんが、1 つの要素でこれを段階的に行うことができます。

たとえば、次のようなもの

$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に応じて変更する必要があります。

->この例では、 の先頭にno がないことを前提としてい$tag_addressます。そうである場合explode()、配列の最初の要素として空の文字列が作成されるため、関数に問題があります$splitted_text

したがって、この空の要素を削除するか、次のように呼び出しを適用する必要がある場合があります

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

最初なし->

于 2013-05-27T08:17:01.093 に答える
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');
}
于 2013-05-28T12:43:09.277 に答える