2010-02-15 5 views
1

저는 simplexml과 dom이 함수 들간에 XML을 업데이트하는 방법에 대해 고민하고 있습니다. 내가 물어 본 이유는 내가 작성한 코드가 작동하는 것처럼 보이지만, 내가 글로벌이 아닌 것을 선언 할 필요가없고, 왜 이것이 그렇게하는지 혼란 스럽다. 예를 들어PHP SimpleXML 함수간에 사용하는 DOM

, 난이 (간체) 코드를 가지고 :

<? 

foreach ($filenames as $filename) { 
    $xml = simplexml_load_file($filename); 
    updateXml($xml); 
    $xml->last_update = date('Y-m-d H:i:s'); 
    $xml->asXML($filename); 
} 

function updateXml($xml) { 
    //... 
    if ($data = $xml->xpath('//data/info[product_id="' . $product_data['id'] . '"]')) { 
     $parent = $data[0]->xpath("parent::*"); 
     $data = updateItem($parent[0], $product_data); 
    } else { 
     $product = addItem($xml->products, $product_data['id']); 
     $data = updateItem($product, $product_data); 
    } 
} 

function updateItem($parent, $product_data) { 

    $node = dom_import_simplexml($parent); 
    $dom = $node->ownerDocument; 

    $product = $dom->createElement('product'); 
    $node->appendChild($product); 
    $item = $dom->createElement('id', $product_data['id']); 
    $product->appendChild($item); 
    $item = $dom->createElement('name', $product_data['name']); 
    $product->appendChild($item); 
    $item = $dom->createElement('url'); 
    $product->appendChild($item); 
    $cdata = $dom->createCDATASection($product_data['url']); 
    $item->appendChild($cdata); 
    $item = $dom->createElement('price', $product_data['price']); 
    $product->appendChild($item); 

    return $node; 
} 

?> 

당신이 날은 XML이 글로벌로 선언 할 필요없이 기능 사이에 업데이트되는 방법을 이해하는 데 도움시겠습니까? 나는 작동하는 것에 대해 물어 이상한 것 알고,하지만 난

감사

답변

1

당신은 당신의 각 기능을 통해 개체의 인스턴스의 복사본을 전달하는 :-) 주위에 내 머리를 얻을 필요가있다.

을 선언하는 것과 반대로 각 매개 변수에 대해 동일한 개체 인스턴스를 각 함수에 공유한다고 생각할 수 있습니다.

+0

재미있게 보내 주셔서 감사합니다. 따라서 XML의 한 부분 만 업데이트하면 전체 객체에 적용됩니까? 또한, 최종 기능에서 $ node를 다시 실행해야합니까? 필요합니까? –

+0

'$ filename' 안에서 XML의 한 부분을 업데이트하면 객체에 적용됩니다. 코드를 사용하는 방법에 따라 변수를 반환 할시기가 달라집니다. '$ node'를 사용하여'updateItem'에서'$ node'와 같은'echo'와 같은 것을하고 싶다면 반환되기 때문에'echo'됩니다. –

+0

좋습니다. 그래서 난 그냥 xml, asXML을 사용하여 저장을 수정하려면 updateItem을 사용하려면, 내가 그 기능에서 아무것도 반환하지 않아도됩니까? –

0

$ product (또는 다른 var)에 저장 한 노드 만 전달한다고 생각하면됩니다. 그렇지 않습니다. 선택한 객체 세트에 대해 설정된 일부 매개 변수를 사용하여 원래 객체를 전달합니다.

+0

Ahhh ok, $ xml의 일부와 관련이있는 무언가를 다시 전달하는 한, 나는 괜찮을까요? –