public function testArrayOfMultipleComplexObjectsToXml() { // Create objects $object1 = $this->createComplexObject(1); $object2 = $this->createComplexObject(2); $object3 = $this->createComplexObject(3); // Create aray of objects $data = array($object1, $object2, $object3); // Convert to XML, with root of 'root' and tag wrappers of 'item' $actual_xml = TypeConverter::toXml($data); // Compose expected XML structure $expected_xml = $this->getXmlDeclaration() . '<root>' . '<item><id>1</id><name>Object 1</name><foo><bar>string</bar><baz>' . '<item><id>1.1</id><name>Object 1.1</name></item>' . '<item><id>1.2</id><name>Object 1.2</name></item>' . '<item><id>1.3</id><name>Object 1.3</name></item>' . '</baz></foo></article>' . '<item><id>2</id><name>Object 2</name><foo><bar>string</bar><baz>' . '<item><id>2.1</id><name>Object 2.1</name></item>' . '<item><id>2.2</id><name>Object 2.2</name></item>' . '<item><id>2.3</id><name>Object 2.3</name></item>' . '</baz></foo></article>' . '<item><id>3</id><name>Object 3</name><foo><bar>string</bar><baz>' . '<item><id>3.1</id><name>Object 3.1</name></item>' . '<item><id>3.2</id><name>Object 3.2</name></item>' . '<item><id>3.3</id><name>Object 3.3</name></item>' . '</baz></foo></item>' . '</root>'; // Now check with single string tag. // Convert to XML, with root of 'root' and tag wrappers of 'item' $actual_xml = TypeConverter::toXml($data, 'root', 'article'); // Compose expected XML structure $expected_xml = $this->getXmlDeclaration() . '<root>' . '<article><id>1</id><name>Object 1</name><foo><bar>string</bar><baz>' . '<article><id>1.1</id><name>Object 1.1</name></article>' . '<article><id>1.2</id><name>Object 1.2</name></article>' . '<article><id>1.3</id><name>Object 1.3</name></article>' . '</baz></foo></article>' . '<article><id>2</id><name>Object 2</name><foo><bar>string</bar><baz>' . '<article><id>2.1</id><name>Object 2.1</name></article>' . '<article><id>2.2</id><name>Object 2.2</name></article>' . '<article><id>2.3</id><name>Object 2.3</name></article>' . '</baz></foo></article>' . '<article><id>3</id><name>Object 3</name><foo><bar>string</bar><baz>' . '<article><id>3.1</id><name>Object 3.1</name></article>' . '<article><id>3.2</id><name>Object 3.2</name></article>' . '<article><id>3.3</id><name>Object 3.3</name></article>' . '</baz></foo></article>' . '</root>'; $this->assertXMLStringEqualsXmlString($expected_xml, $actual_xml); // Now check with array of tags. // Convert to XML, with root of 'root' and tag wrappers of 'item' $actual_xml = TypeConverter::toXml($data, 'root', array('outer', 'inner')); // Compose expected XML structure $expected_xml = $this->getXmlDeclaration() . '<root>' . '<outer><id>1</id><name>Object 1</name><foo><bar>string</bar><baz>' . '<inner><id>1.1</id><name>Object 1.1</name></inner>' . '<inner><id>1.2</id><name>Object 1.2</name></inner>' . '<inner><id>1.3</id><name>Object 1.3</name></inner>' . '</baz></foo></outer>' . '<outer><id>2</id><name>Object 2</name><foo><bar>string</bar><baz>' . '<inner><id>2.1</id><name>Object 2.1</name></inner>' . '<inner><id>2.2</id><name>Object 2.2</name></inner>' . '<inner><id>2.3</id><name>Object 2.3</name></inner>' . '</baz></foo></outer>' . '<outer><id>3</id><name>Object 3</name><foo><bar>string</bar><baz>' . '<inner><id>3.1</id><name>Object 3.1</name></inner>' . '<inner><id>3.2</id><name>Object 3.2</name></inner>' . '<inner><id>3.3</id><name>Object 3.3</name></inner>' . '</baz></foo></outer>' . '</root>'; $this->assertXMLStringEqualsXmlString($expected_xml, $actual_xml); }
/** * Format the response into the right content type. * * @access private * @param string $type * @return mixed */ private function __format($type) { $response = array('success' => $this->_success, 'data' => $this->_data); if (!empty($this->_code)) { $response['code'] = $this->_code; } switch (strtolower($type)) { case 'json': $format = TypeConverter::toJson($response); break; case 'xml': $format = TypeConverter::toXml($response); break; case 'html': case 'text': default: $format = (string) $this->_data; break; } return $format; }
/** * Processes the feed and rebuilds an array based on the feeds type (RSS, RDF, Atom). * * @access protected * @param CakeResponse $response * @param array $query * @param string $source * @return boolean */ protected function _process($response, $query, $source) { $feed = TypeConverter::toArray($response->body()); $clean = array(); if (!empty($query['root']) && !empty($feed[$query['feed']['root']])) { $items = $feed[$query['feed']['root']]; } else { // Rss if (isset($feed['channel']) && isset($feed['channel']['item'])) { $items = $feed['channel']['item']; // Rdf } else { if (isset($feed['item'])) { $items = $feed['item']; // Atom } else { if (isset($feed['entry'])) { $items = $feed['entry']; // Xml } else { $items = $feed; } } } } if (empty($items) || !is_array($items)) { return $clean; } // Gather elements $elements = array('title', 'guid' => array('guid', 'id'), 'date' => array('date', 'pubDate', 'published', 'updated'), 'link' => array('link', 'origLink'), 'image' => array('image', 'thumbnail'), 'author' => array('author', 'writer', 'editor', 'user'), 'source' => array('source'), 'description' => array('description', 'desc', 'summary', 'content', 'text')); if (is_array($query['fields'])) { $elements = array_merge_recursive($elements, $query['fields']); } // Loop the feed foreach ($items as $item) { $data = array(); foreach ($elements as $element => $keys) { if (is_numeric($element)) { $element = $keys; $keys = array($keys); } if (isset($keys['attributes'])) { $attributes = $keys['attributes']; unset($keys['attributes']); } else { $attributes = array('value', 'href', 'src', 'name', 'label'); } if (isset($keys['keys'])) { $keys = $keys['keys']; } foreach ($keys as $key) { if (isset($item[$key]) && empty($data[$element])) { $value = $this->_extract($item[$key], $attributes); if (!empty($value)) { $data[$element] = $value; break; } } } } if (empty($data['link'])) { trigger_error(sprintf('Feed %s does not have a valid link element.', $source), E_USER_NOTICE); continue; } if (empty($data['source']) && $source) { $data['source'] = (string) $source; } $sort = null; if (isset($data[$query['feed']['sort']])) { $sort = $data[$query['feed']['sort']]; } if (!$sort) { if ($query['feed']['sort'] == 'date' && isset($data['date'])) { $sort = strtotime($data['date']); } else { $sort = microtime(); } } if (!empty($data)) { $clean[$sort] = $data; } } return $clean; }