/** * 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; }
/** * 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; }