Reputation: 10485
I'm trying to loop through a cURL array response to generate XML files. However, my generated files all seem to have exactly the same contents - I don't know if this is the right approach or if I should be using an array, but I can't seem to figure it out and could use some fresh eyes. Basically, I want each $playlist
's contents to be in its own separate file.
for ($i=0; $i<=14; $i++) {
$xml_data = generateXML($i);
$fileName = "bc_manifest_$i.xml";
$fileHandle = fopen($fileName, 'wb') or die("can't open file");
fwrite ($fileHandle, $xml_data);
fclose($fileHandle);
//echo $xml_data;
echo "Successfully created manifest $i<br />";
}
// The holy grail
function generateXML($i) {
$xml_code = array($i);
// Start the beginning of the xml doc and save it to our reoccuring xml_code var
$xml_code[$i] .= '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$xml_code[$i] .= '<publisher-upload-manifest publisher-id="xxxxxxx" preparer="Dave" report-success="TRUE">' . "\n";
// Set options to send to brightcove
// @page_size
$options = array(
'page_size' => '75',
'playlist_ids' => "3690598001,3684920001,8193433701",
'video_fields' => 'referenceId,creationDate'
);
// URL Encode the options to prepare for cURL send
$post_str = '';
foreach($options as $key=>$value) {
$post_str .= $key.'='.urlencode($value).'&';
}
$post_str = substr($post_str, 0, -1);
// Initiate cURL and send request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://api.brightcove.com/services/library?command=find_playlists_by_ids&token=xxxxxxxxxx&' );
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_str);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$obj = curl_exec($ch);
curl_close($ch);
// Decode json response
$result = json_decode($obj);
// Get playlists from the items object
$playlists = $result->{'items'};
//var_dump($playlists);
// For each playlist...
foreach ($playlists as $playlist){
foreach ($playlist->{'videos'} as $video){
// Convert the creation date to something not so robotic..
$creation_date_ms = $video->creationDate;
$creation_date_s = $creation_date_ms / 1000;
$date = date('Ymd',$creation_date_s);
$time = strtotime($date);
//echo $time."<br />";
// and set the reference id for each video.
$ref_id = $video->referenceId;
// Phew! Now, let's first check that there is a reference id for the video. If not, no biggie.
switch ($ref_id) {
case "":
break;
default:
// If so, run the function to create an xml object for that video!
if ($time <= strtotime('20100519')) {
$xml_code[$i] .= reencode_from_existing_source($ref_id);
}
break;
}
}
}
// Finish him.
$xml_code[$i] .= '</publisher-upload-manifest>';
return($xml_code[$i]);
} //endxml
// Creates an xml object for the passed reference id.
function reencode_from_existing_source($ref_id){
$xml_obj = '<reencode-from-existing-source
title-refid="' . $ref_id . '"
encode-to="MP4"
encode-multiple="TRUE"
overwrite-images="FALSE" />' . "\n";
return ($xml_obj);
}
Thanks to anyone who can help!
Upvotes: 3
Views: 923
Reputation: 3965
This has worked for me in the past: http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/
It's reasonably well documented at that url, but let me know if you have questions.
$xml = ArrayToXML::toXML($data_array, 'name_of_root_node');
That should get you started. For the second paramter, change it to whatever root node name works for you.
EDIT: added snippet of ArrayToXML class from the link above in order to mitigate the effects of link rot.
class ArrayToXML
{
/**
* The main function for converting to an XML document.
* Pass in a multi dimensional array and this recrusively loops through and builds up an XML document.
*
* @param array $data
* @param string $rootNodeName - what you want the root node to be - defaultsto data.
* @param SimpleXMLElement $xml - should only be used recursively
* @return string XML
*/
public static function toXml($data, $rootNodeName = 'data', $xml=null)
{
// turn off compatibility mode as simple xml throws a wobbly if you don't.
if (ini_get('zend.ze1_compatibility_mode') == 1)
{
ini_set ('zend.ze1_compatibility_mode', 0);
}
if ($xml == null)
{
$xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName />");
}
// loop through the data passed in.
foreach($data as $key => $value)
{
// no numeric keys in our xml please!
if (is_numeric($key))
{
// make string key...
$key = "unknownNode_". (string) $key;
}
// replace anything not alpha numeric
$key = preg_replace('/[^a-z]/i', '', $key);
// if there is another array found recrusively call this function
if (is_array($value))
{
$node = $xml->addChild($key);
// recrusive call.
ArrayToXML::toXml($value, $rootNodeName, $node);
}
else
{
// add single node.
$value = htmlentities($value);
$xml->addChild($key,$value);
}
}
// pass back as string. or simple xml object if you want!
return $xml->asXML();
}
}
Upvotes: 0
Reputation:
I would use the SimpleXML or DOM functionality built into PHP to generate the XML - it is very robust and you will only need to pass in the attribute names, values and nodes.
With regard to why you are getting the same result every time, you are making the same CURL request every time so you would expect to get the same result.
Upvotes: 1