2013-05-27 2 views
0

wana -> system_settings-> settings-> hostname과 같은 주소에 'heloo'와 같은 변수를 할당하고 쓰기 위해 함수를 작성합니다. 수동으로 주소를이 함수는 제대로 작동하고 그 주소에 '안녕하세요'를 할당하지만, 내가 wana 동적으로 주소를 부여 할 때 작동하지 않습니다. 내 기능 :PHP로 주소에 변수를 할당하는 방법

<?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"); 

} 
?> 

내가 명령 줄을 실행할 때 작동하지만 동적 모드에서 작동하지 않는이 라인 $ XML의 $의 tag_address를 식별 -> $ tag_address = $ 값; 문자열이 아닌 주소로 사용됩니다. 어떻게해야합니까? TNX

+0

왜 작동하지 않습니까? 어떤 오류가 있습니까? – Voitcus

+0

내가 수동으로 주소를주고 $ xml-> system_settings-> settings-> hostname = $ value; 그것은 작동하고이 주소에 값을 할당하지만, $ xml -> $ tag_address = $ value와 같이 주소를 동적으로 지정할 때; 그것은 주소를 식별하지 않고 $ tag_address를 문자열로 식별합니다. –

+0

'write_xml ("root-> system_settings-> settings-> hostname", 'Helloooooooo')와 같지 않아야합니까? (최상위 노드 이름으로'루트'변경) – Voitcus

답변

0

해결책이 쉽지 않습니다.

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

가장 올바른 방법은 당신이 당신의 텍스트를 분할하고 수동 체인 객체를 만드는 것이 될 수있다 : 당신이 뭔가를 쓸 수 있도록

가장 쉬운,하지만 최소한의 보안은 eval() 기능을 사용하는 것입니다. 하나의 문자열로 연결된 모든 요소를 ​​참조 할 수는 없지만 한 요소로 단계별로 수행 할 수 있습니다.

$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이 적절하게 변경되어야합니다.

이 예제에서는 의 시작 부분에 ->이 없다고 가정합니다. 그렇다면 explode() 함수에 문제가있을 수 있습니다. 이는 $splitted_text 배열의 첫 번째 요소로 빈 문자열을 생성하기 때문입니다.

그래서 당신이 빈 요소를 제거하거나 첫 ->없이

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

로 호출 적용해야 할 수도 있습니다.

+0

Voitcus,이 문제를 해결하기 위해 제안하는 다른 솔루션이 있습니까?이 방법은 너무 좋지만 xml 파일에 대한 정보를 반복합니다. 가능한 경우 다른 방법을 제안하십시오 .NX –

+0

글쎄, 구조 그 자체는 분명하지 않다. 'write_xml' 함수가 열리고 파일을 조작 한 다음 닫으면 외부에서 액세스 할 수 없습니다. 개인적으로 필자는 XML 객체를 파일에서 반환하고, 다른 하나는 조작 (추가, 삭제 등) 한 후 마지막으로 저장하고 닫는 XML 함수를 반환합니다. 함수가 아니라 객체 메소드 일 수도 있습니다. 그러나 프로그램이 호스트 이름 만 저장하면 쓸모없는 노력이 될 것입니다. 그러나 당신의 문제 자체에 대해, 나는 더 좋은 해결책을 보지 못했다. IMO는 다른 모든 것들은이 둘의 수정 일 것입니다. – Voitcus

+0

자, 코드에서 테스트했습니다. foreach 후에 주소가 있지만 $ node가 인쇄되어 있고 주소가 아닌 $ node가 있습니다. –

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'); 
} 
관련 문제