2010-10-14 84 views
3

我试图通过一个cURL数组响应来生成XML文件。然而,我生成的文件似乎都有完全相同的内容 - 我不知道这是正确的方法,还是我应该使用数组,但我似乎无法弄清楚,可以使用一些新鲜的眼睛。基本上,我希望每个$playlist的内容都在它自己的单独文件中。在数组中循环PHP

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); 
} 

感谢任何能帮助到的人!

+1

你总是用cURL做同样的请求。 – Narf 2010-10-14 19:01:42

+1

如果源代码被降低到最低程度仍然存在问题,则问题对社区更有用。 – nalply 2012-08-06 14:51:03

回答

0

这为我在过去的工作:http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/

它的相当不错,在这个URL记录,但让我知道如果你有问题。

$xml = ArrayToXML::toXML($data_array, 'name_of_root_node'); 

这应该让你开始。对于第二个参数,请将其更改为适合您的任何根节点名称。

编辑:添加从上面的链接ArrayToXML类的片段,以减轻链接腐烂的影响。

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(); 
    } 
} 
+0

请勿链接到您在其他地方找到的源代码。 – nalply 2012-08-06 14:51:51

+0

docs here(stackoverflow)表明只有一个链接不好,没有上下文。虽然我承认我的答案可能不是最好的,但我不觉得它违反了任何规则或惯例(没有人说你不能链接到外部资源 - 而且这经常发生)。谨慎澄清? – gregghz 2012-08-06 15:07:59

+0

问题是链接腐烂。你永远不知道这个链接是否还在一年左右的时间内运行。 – nalply 2012-08-06 15:09:54

1

我会使用PHP内置的SimpleXML或DOM功能来生成XML - 这是非常强大的,你只需要在属性名称,值和节点通过。

关于你为什么每次都得到相同的结果,你每次都做同样的CURL请求,所以你会期望得到相同的结果。