コード例 #1
0
	/**
	 * 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; 
	}
コード例 #2
0
ファイル: XMLTest.php プロジェクト: nnnnathann/piwik
    /**
     * @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);
    }