/**
  * Parses one table entry and returns the table name.
  * 
  * @param \SimpleXml $result The original XML body loaded in XML.
  * 
  * @return string
  */
 private function _parseOneTable($result)
 {
     $query = ".//{$this->_dataServicesMetadataPrefix}:properties/";
     $query .= "{$this->_dataServicesPrefix}:TableName";
     $tableName = $result->xpath($query);
     $table = (string) $tableName[0];
     return $table;
 }
Ejemplo n.º 2
0
 /**
  * Get all data for a record (item or file).
  *
  * @see OaiPmhStaticRepository_Harvest_Document::_getDataForRecord()
  *
  * @param SimpleXml $record
  * @return array The document array.
  */
 protected function _getDataForRecord($record)
 {
     $current = array();
     // Set default values to avoid notices.
     $current['process'] = array();
     $current['specific'] = array();
     $current['metadata'] = array();
     $current['extra'] = array();
     // Process flat Dublin Core.
     $record->registerXPathNamespace('', self::XML_NAMESPACE);
     $record->registerXPathNamespace(self::XML_PREFIX, self::XML_NAMESPACE);
     $record->registerXPathNamespace(self::DC_PREFIX, self::DC_NAMESPACE);
     $record->registerXPathNamespace(self::DCTERMS_PREFIX, self::DCTERMS_NAMESPACE);
     $xpath = 'dc:*|dcterms:*';
     $dcs = $record->xpath($xpath);
     foreach ($dcs as $dc) {
         $name = strtolower($dc->getName());
         if (isset($this->_dcTerms[$name])) {
             $text = $this->_innerXML($dc);
             $current['metadata']['Dublin Core'][$this->_dcTerms[$name]][] = $text;
         }
     }
     // The xml needs the Dublin Core namespaces in some cases.
     if (!empty($dcs)) {
         $recordDom = dom_import_simplexml($record);
         if ($recordDom) {
             $recordDom->setAttribute('xmlns:' . self::DCTERMS_PREFIX, self::DCTERMS_NAMESPACE);
             $recordDom->setAttribute('xmlns:' . self::DC_PREFIX, self::DC_NAMESPACE);
         }
     }
     // Process hierarchical elements.
     $elementSets = $record->elementSet;
     foreach ($elementSets as $elementSet) {
         $elementSetName = trim($this->_getXmlAttribute($elementSet, 'name'));
         // Unmanageable.
         if (strlen($elementSetName) == 0) {
             continue;
         }
         $elements = $elementSet->element;
         foreach ($elements as $element) {
             $elementName = trim($this->_getXmlAttribute($element, 'name'));
             // Unmanageable.
             if (strlen($elementName) == 0) {
                 continue;
             }
             $data = $element->data;
             foreach ($data as $value) {
                 $text = $this->_innerXML($value);
                 $current['metadata'][$elementSetName][$elementName][] = $text;
             }
         }
     }
     // Save all attributes as extra data.
     foreach ($record->attributes() as $name => $data) {
         $current['extra'][$name][] = (string) $data;
     }
     // Process extra data.
     $extra = $record->extra;
     if (!empty($extra)) {
         $extraData = $extra->data;
         foreach ($extraData as $data) {
             $name = trim($this->_getXmlAttribute($data, 'name'));
             if (strlen($name) > 0) {
                 $text = $this->_innerXML($data);
                 $current['extra'][$name][] = $text;
             }
         }
     }
     // Normalize special data, keeping original order.
     // Filling data during loop is unpredictable.
     $extraLower = array();
     foreach ($current['extra'] as $field => $data) {
         $lowerField = $this->_spaceFromUppercase($field);
         if (isset($this->_specialData[$lowerField])) {
             // Multiple values are allowed (for example tags). Keep order.
             if ($this->_specialData[$lowerField]) {
                 // Manage the tags exception (may be "tags" or "tag").
                 if ($lowerField == 'tag') {
                     $lowerField = 'tags';
                 }
                 $extraLower[$lowerField] = empty($extraLower[$lowerField]) ? $data : array_merge($extraLower[$lowerField], $data);
             } else {
                 $extraLower[$lowerField] = is_array($data) ? array_pop($data) : $data;
             }
             unset($current['extra'][$field]);
         }
     }
     if ($extraLower) {
         $current['extra'] = array_merge($current['extra'], $extraLower);
     }
     // Exceptions.
     // Normalize "path" (exception: can be "file" or "path").
     if (isset($current['extra']['file'])) {
         $current['specific']['path'] = $current['extra']['file'];
         unset($current['extra']['file']);
     }
     // Normalize true extra data.
     if (!empty($current['extra'])) {
         $extraData = array_diff_key($current['extra'], $this->_specialData);
         if ($extraData) {
             // Step 1: set single value as string, else let it as array.
             $value = null;
             foreach ($extraData as $name => &$value) {
                 if (is_array($value)) {
                     // Normalize empty value.
                     if (count($value) == 0) {
                         $value = '';
                     } elseif (count($value) == 1) {
                         $value = reset($value);
                     }
                 }
             }
             // Required, because $value is a generic reference used just before.
             unset($value);
             // Step 2: Normalize extra data names like geolocation[latitude]
             // (array notation). They will be imported via a pseudo post.
             $extra = array();
             foreach ($extraData as $key => $value) {
                 $array = $this->_convertArrayNotation($key);
                 $array = $this->_nestArray($array, $value);
                 $value = reset($array);
                 $name = key($array);
                 $extra[] = array($name => $value);
             }
             $finalExtraData = array();
             foreach ($extra as $data) {
                 $finalExtraData = array_merge_recursive($finalExtraData, $data);
             }
             $specialData = array_intersect_key($current['extra'], $this->_specialData);
             $current['extra'] = array_merge($finalExtraData, $specialData);
         }
     }
     // Avoid useless metadata.
     unset($current['extra']['xmlns:' . self::DC_PREFIX]);
     unset($current['extra']['xmlns:' . self::DCTERMS_PREFIX]);
     return $current;
 }