/** * Render a multidimensional array to XML * * @static * @param $array can contain scalar, arrays, Piwik_DataTable and Piwik_DataTable_Array * @param int $level * @return string */ public static function convertMultiDimensionalArrayToXml($array, $level = 0) { $xml=""; foreach ($array as $key=>$value) { if(is_numeric($key)) { $key = "row"; } $key = str_replace(' ', '_', $key); $marginLeft = str_repeat("\t", $level + 1); switch(true) { // Case dimension is a PHP array case (is_array($value)): if(empty($value)) { $xml .= $marginLeft . "<$key/>\n"; } else { $xml.= $marginLeft . "<$key>\n". self::convertMultiDimensionalArrayToXml($value, $level + 1). "\n". $marginLeft . "</$key>\n"; } break; // Case dimension is a Piwik_DataTable_Array or a Piwik_DataTable case ($value instanceof Piwik_DataTable_Array || $value instanceof Piwik_DataTable): if($value->getRowsCount() == 0) { $xml .= $marginLeft . "<$key/>\n"; } else { $XMLRenderer = new Piwik_DataTable_Renderer_Xml(); $XMLRenderer->setTable($value); $renderedReport = $XMLRenderer->render(); $renderedReport = preg_replace("/<\?xml.*\?>\n/", "", $renderedReport); $markupToRemove = $value instanceof Piwik_DataTable_Array ? "results" : "result"; $renderedReport = preg_replace("/\n?<\/?". $markupToRemove .">\n?/", "", $renderedReport); // Add one level of margin to each line $renderedReport = $marginLeft . preg_replace("/\n/", "\n" . $marginLeft, $renderedReport); $xml.= $marginLeft . "<$key>\n"; $xml.= $renderedReport; $xml.= "\n" . $marginLeft . "</$key>\n"; } break; // Case scalar default: $xml.= $marginLeft . "<$key>".Piwik_DataTable_Renderer::formatValueXml($value)."</$key>\n"; break; } } return $xml; }
/** * @group Core * @group DataTable * @group DataTable_Renderer * @group DataTable_Renderer_XML */ public function testXMLArrayIsMadeOfArrayTest3() { $dataTable = $this->_getDataTableArray_containsDataTableArray_simpleOneRow(); $render = new Piwik_DataTable_Renderer_Xml(); $render->setTable($dataTable); $expected = '<?xml version="1.0" encoding="utf-8" ?> <results> <result parentArrayKey="idSite"> <result testKey="row1">14</result> <result testKey="row2">15</result> <result testKey="row3" /> </result> </results>'; $rendered = $render->render(); $this->assertEquals($expected, $rendered); }