Hallo,

Voor een Content Management Systeem ben ik bezig met een klasse die de configuratie op zich neemt.

Nu laadt die klasse de configuratie vanuit een XML-bestand en stopt dat in de eigenschap $gegevens in de vorm van een array:

XML gegevens statisch laden
<?php

(. . .)
		
		$dom = new domDocument();
	  $dom->load($xmlpad);
	  	
	  $i = 0;
	  
	  foreach ($dom->getElementsByTagName('auteur') as $a) {
	     
	  	$this->gegevens['auteurs'][$i] = $a->firstChild->nodeValue;
	  	$i++;
	    	
	  }
	    
	  $b = $dom->getElementsByTagName('websitenaam');
	  
	  $this->gegevens['websitenaam'] = $b->item(0)->nodeValue;
	  
	  $c = $dom->getElementsByTagName('opslagmethode');
	  
	  $this->gegevens['opslagmethode'] = $c->item(0)->nodeValue;
	  
	  $d = $dom->getElementsByTagName('thema');
	  
	  $this->gegevens['thema'] = $c->item(0)->nodeValue;

(. . .)

?>


Het bijbehorende XML-bestand
<?xml version="1.0" encoding="ISO-8859-1" ?>

<configuratie>
	
	<websitenaam>Rabbit49</websitenaam>
	
	<auteurs>
		<auteur>Jip van Reijsen</auteur>
		<auteur>Sjaak de Bruine</auteur>
		<auteur>Kees de Paarse</auteur>
		<auteur>Hans Anders</auteur>
	</auteurs>
	
	<technisch>
		<opslagmethode>XML</opslagmethode>
		<thema>Standaard</thema>
	</technisch>
	
</configuratie>


De uitvoer van de klasse:
Array
(
    [auteurs] => Array
        (
            [0] => Jip van Reijsen
            [1] => Sjaak de Bruine
            [2] => Kees de Paarse
            [3] => Hans Anders
        )

    [websitenaam] => Rabbit49
)


Maar iets in mij zegt nu dat dit een stuk handiger kan. Dynamischer. Alleen zegt dat iets in mij niet hoe ik dat moet doen.

Dus, mijn vraag: Hoe zet ik XML-gegevens dynamisch
om in een array?

Edit: Typo :c)
De reden waarom dit statisch is lijkt mij te ontgaan. Ik denk dat ik dan ook niet compleet begrijp met wat je bedoeld met dynamisch omzetten?
Inderdaad Webmakerij. Ik zal de links even gaan bekijken. Bedankt.

Edit: Omdat de meesten het fijn vinden om dan ook te weten welke oplossing het is geworden: Een instantie van het object SimpleXMLElement als waarde toewijzen aan de eigenschap $gegevens.

De aanzienlijk kortere klasse die dynamisch laad
<?php

class configuratie {
	
	public $gegevens;
	
	
	public function __construct($xmlpad) {
		
		$this->gegevens = new SimpleXMLElement($xmlpad, null, true);
	  	    
	  echo '<pre>';
	  print_r($this->gegevens);
	  echo '</pre>';
	}
}

?>


Bedankt!
Ik maak op deze manier een array van mijn xml:

<?php

class Xml {

public function convert($xml) {
if (get_class($xml) == 'SimpleXMLElement') {
$attributes = $xml->attributes();
foreach($attributes as $k=>$v) {
if ($v) $a[$k] = (string) $v;
}
$x = $xml;
$xml = get_object_vars($xml);
}
if (is_array($xml)) {
if (count($xml) == 0) return (string) $x; // for CDATA
foreach($xml as $key=>$value) {
$r[$key] = self::convert($value);
}
if (isset($a)) $r['@'] = $a; // Attributes
return $r;
}
return (string) $xml;
}
}

$xmlArray = Xml::convert( simplexml_load_file( "pad/naar/xml/bestand" ) );

?>

*class bestaat uit nog wat meer methods, dit is slechts een simpel voorbeeld =]

edit: typo's
Ik gebruik voor het inlezen van XML-settings bestanden de volgende code:


<?php

function fileToArray($filename)
{
	$data = file_get_contents($filename);
	$array = array();

	$matches = array();
	preg_match_all("/<item>\s*<key>((\n|.)*?)<\/key>\s*<value>((\n|.)*?)<\/value>\s*<\/item>/i", $data, $matches);

	for($i = 0; $i < sizeof($matches[1]); $i++)
	{
		// Asign keys to values
		$array[$matches[1][$i]] = $matches[3][$i];
	}

	ksort($array);
	return $array;
}

?>


Mijn setting bestanden zien er standaard zo uit:


<data>

	<item>
		<key>Setting 1</key>
		<value>Value 1</value>
	</item>


	<item>
		<key>Setting 3</key>
		<value>Value 3</value>
	</item>

	<item>
		<key>Setting 2</key>
		<value>Value 2</value>
	</item>

</data>


Een aanroep met fileToArray(XML_FILE_NAME) resulteert in de array:


Array([Setting 1] => "Value 1", [Setting 2] => "Value 2"[Setting 3] => "Value 3")

Reageren