XML dynamisch omzetten naar een array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Eric Cartman

Eric Cartman

02/08/2006 19:35:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>


De uitvoer van de klasse:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
)


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
 
PHP hulp

PHP hulp

26/04/2024 06:29:10
 
Arend a

Arend a

02/08/2006 21:15:00
Quote Anchor link
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?
 

02/08/2006 21:18:00
Quote Anchor link
Volgens mij wil Jip dat alles automatisch word omgezet en dat hij niet meer dit soort dingen hoeft te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$this->gegevens['websitenaam'] = $b->item(0)->nodeValue;


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
 
Eric Cartman

Eric Cartman

02/08/2006 22:14:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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!
Gewijzigd op 01/01/1970 01:00:00 door Eric Cartman
 
Pim Vernooij

Pim Vernooij

03/08/2006 01:12:00
Quote Anchor link
Ik maak op deze manier een array van mijn xml:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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
Gewijzigd op 01/01/1970 01:00:00 door Pim Vernooij
 
Martijn Wieringa

Martijn Wieringa

03/08/2006 11:19:00
Quote Anchor link
Ik gebruik voor het inlezen van XML-settings bestanden de volgende code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}


?>


Mijn setting bestanden zien er standaard zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Array([Setting 1] => "Value 1", [Setting 2] => "Value 2"[Setting 3] => "Value 3")
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.