2015-04-07 58 views
1

我正面臨一個Xml問題。可能是一些愚蠢的,但我不能看到它... ...Php xml,用xml對象代替正在使用的節點

這是我在開始創建XML:

<combinations nodeType="combination" api="combinations"> 
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1"> 
     <id><![CDATA[1]]></id> 
    </combination> 
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2"> 
     <id><![CDATA[2]]></id> 
    </combination> 
</combinations> 

因此,對於每一個節點,我做的API調用,然後我想,以取代由節點返回的值,這樣的:

$c_index = 0; 
foreach($combinations->combination as $c){ 
    $new = apiCall($c->id); //load the new content 
    $combinations->combination[$c_index] = $new; 
    $c_index++; 
} 

如果我轉儲$新進的foreach,我得到了一個simplexmlobject這是很好的,但如果我轉儲$ combinations->組合[$ X],我已經得到了很大的字符串空白...

我想獲得:

<combinations nodeType="combination" api="combinations"> 
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1"> 
     <my new tree> 
      .... 
     </my new tree> 
    </combination> 
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2"> 
     <my new tree> 
      .... 
     </my new tree> 
    </combination> 
</combinations> 

我必須缺少一些東西,但是什麼......?這就是問題...

感謝您的幫助!

回答

0

您可以通過使用所謂的的SimpleXMLElement自參考的改變foreach迭代的當前元素$c。通過SimpleXMLElement的神奇性質,數字訪問或數字0(零)的屬性訪問的條目表示元素本身。這可以用來更改的元素值例如:

foreach ($combinations->combination as $c) { 
    $new = apiCall($c->id); //load the new content 
    $c[0] = $new; 
} 

重要的部分是$c[0]這裏。您也可以使用數字編寫$c->{0}以進行媒體資源訪問。示例輸出(可以API調用返回 「apiCall($paramter)」 作爲字符串):

<combinations nodeType="combination" api="combinations"> 
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1">apiCall('1')</combination> 
    <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2">apiCall('2')</combination> 
</combinations> 

在完整示例:

$buffer = <<<XML 
<root xmlns:xlink="ns:1"> 
    <combinations nodeType="combination" api="combinations"> 
     <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/1"> 
      <id><![CDATA[1]]></id> 
     </combination> 
     <combination xlink:href="http://localhost:8888/vmv/ps/api/combinations/2"> 
      <id><![CDATA[2]]></id> 
     </combination> 
    </combinations> 
</root> 
XML; 


function apiCall($string) 
{ 
    return sprintf('apiCall(%s)', var_export((string)$string, true)); 
} 

$xml = simplexml_load_string($buffer); 

$combinations = $xml->combinations; 

foreach ($combinations->combination as $c) { 
    $new = apiCall($c->id); //load the new content 
    $c[0] = $new; 
} 

$combinations->asXML('php://output');