XML dynamisch omzetten naar een array
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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;
(. . .)
?>
(. . .)
$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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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>
<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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Array
(
[auteurs] => Array
(
[0] => Jip van Reijsen
[1] => Sjaak de Bruine
[2] => Kees de Paarse
[3] => Hans Anders
)
[websitenaam] => Rabbit49
)
(
[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)
Gewijzigd op 01/01/1970 01:00:00 door Eric Cartman
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?
Misschien vind je hier iets: http://www.google.nl/search?q=xml2array+php&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:nl:official
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
Code (php)
Bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Eric Cartman
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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 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
Gewijzigd op 01/01/1970 01:00:00 door Pim Vernooij
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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;
}
?>
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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>
<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: