Time to start writing the readIMSManifestFile() function. Let’s create the basic structure.
function readIMSManifestFile($manifestfile) { // PREPARATIONS // READ THE RESOURCES LIST // READ THE ITEMS LIST // PROCESS THE ITEMS LIST TO FIND SCOS // RETURN RESULTS }
The first section is pretty straightforward since I can build on the code that I created previously.
// PREPARATIONS // load the imsmanifest.xml file $xmlfile = new DomDocument; $xmlfile->preserveWhiteSpace = FALSE; $xmlfile->load($manifestfile); // adlcp namespace $manifest = $xmlfile->getElementsByTagName('manifest'); $adlcp = $manifest->item(0)->getAttribute('xmlns:adlcp');
I start by loading the manifest file into a variable, and I read the XML namespace definitions that I need.
Now I move on to reading the resources list. Here’s my initial code.
// READ THE RESOURCES LIST // array to store the results $resourceData = array(); // get the list of resource element $resourceList = $xmlfile->getElementsByTagName('resource'); $r = 0; foreach ($resourceList as $rtemp) { // decode the resource attributes $identifier = $resourceList->item($r)->getAttribute('identifier'); $resourceData[$identifier]['type'] = $resourceList->item($r)->getAttribute('type'); $resourceData[$identifier]['scormtype'] = $resourceList->item($r)->getAttribute('adlcp:scormtype'); $resourceData[$identifier]['href'] = $resourceList->item($r)->getAttribute('href'); // list of files $fileList = $resourceList->item($r)->getElementsByTagName('file'); $f = 0; foreach ($fileList as $ftemp) { $resourceData[$identifier]['files'][$f] = $fileList->item($f)->getAttribute('href'); $f++; } $r++; }
Pretty much as I did before, but this time I’m storing the data that I read in the $resourceData array. Let’s look at the XML file that I’m reading to see if I’m capturing all of the data. Here’s a typical <resource> element.
Whoops … whereas the IMS manifest file that I was reading previously had a single resource which contained multiple files, this manifest file consists of multiple <resource> elements which appear to be linked together by <dependency> elements. So I’m going to have to take a step backward and look at the SCORM 1.2 CAM specification again in far more detail.