Avatar billede lequet Nybegynder
14. maj 2002 - 05:37 Der er 9 kommentarer og
1 løsning

Udtræk af XML Data

Godmorgen :) Hvis jeg har en XML fil som denne :

<?xml version="1.0" ?>

<hello>
  <what>world</what>
  <ehh>Hmm</ehh>
</hello>

Hvordan kan jeg i PHP så udtrække data fra de forskellige tags.... altså

echo xml_get_data("what") ; // udskriver "world"

JaJa, ovenstående er jo ikke rigtigt :) Men håber det kan illustrere hvad jeg søger :)

Kan det lade sig gøre, og i så fald, how :)
Avatar billede limemedia Nybegynder
14. maj 2002 - 05:46 #1
Hep,

Her er et eksempel på hvordan du gør - det er lidt *stort* men det virker genialt.

---
<?php
    function xml_get_tree($xml) {
        $parser = xml_parser_create();
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, $xml, $vals, $index);
        xml_parser_free($parser);
   
        return array('tag' => $vals[0]['tag'], 'attributes' => isset($vals[0]['attributes']) ? $vals[0]['attributes'] : null, 'children' => xml_get_children($vals, $i = 0));
    }

    function xml_get_children($vals, &$i) {
        $children = array();
       
        if (isset($vals[$i]['value'])) $children[] = $vals[$i]['value'];
       
        $valssize = count($vals);
        while (++$i < $valssize) {
            switch ($vals[$i]['type']) {
                case 'cdata':
                    $children[] = $vals[$i]['value'];
                    break;
       
                case 'complete':
                    $children[] = array('tag' => $vals[$i]['tag'], 'attributes' => isset($vals[$i]['attributes']) ?    $vals[$i]['attributes'] : null,    'value' => isset($vals[$i]['value']) ? $vals[$i]['value'] : null);
                    break;

                case 'open':
                    $children[] = array('tag' => $vals[$i]['tag'], 'attributes' => isset($vals[$i]['attributes']) ? $vals[$i]['attributes'] : null,    'children'  => xml_get_children($vals, $i));
                    break;

                case 'close':
                    return $children;
            }
        }
    }

    function xml_condense_tree($tree) {
        foreach ($tree['children'] as $index => $node) {
            if (isset($node['children'])) {
                $tree['children'][$index] = xml_condense_tree($node);
            } elseif (isset($node['value']) and !$node['attributes']) {
                $tree['values'][$node['tag']] = $node['value'];
                unset($tree['children'][$index]);
            }
        }
   
        if (!$tree['children']) unset($tree['children']);
        return $tree;
    }

    $xml = '<?xml version="1.0" ?>'."\n";
    $xml .= '<hello>'."\n";
    $xml .= '    <what>world</what>'."\n";
    $xml .= '    <ehh>Hmm</ehh>'."\n";
    $xml .= '</hello>'."\n";

    $xmltree = xml_get_tree($xml); 
    $xmltree = xml_condense_tree($xmltree);
   
#    echo "<pre>";
#    var_dump($xmltree);
#    echo "</pre>";

    echo $xmltree["values"]["what"];
?>
---

Hvis du vil "følge med" hvad der egentlig sker i $xmltree, kan du fjerne de tre # tegn, det giver lidt debug information


/ Lars
Avatar billede limemedia Nybegynder
14. maj 2002 - 05:47 #2
under 9 minutter ? damn I'm good *griner*
Avatar billede lequet Nybegynder
14. maj 2002 - 05:48 #3
Takker :) Havde heller aldrig forventet at det kunne skrives med en linie, der skal jo være bare en anelse udfordring :)

Kigger lige på det
Avatar billede lequet Nybegynder
14. maj 2002 - 05:51 #4
OK, det virker jo fint nok :) Men er det helt med vilje at XML koden er hard-codet ind i scriptet? Kan man ikke bare åbne filen med fopen() og indlæse det der nu står i den?
Avatar billede limemedia Nybegynder
14. maj 2002 - 05:52 #5
hvis nu du ligger de tre funktioner i en includefil - dem skal du ikke rette i, skal du kun refere til $xmltree - det er utroligt fleksibelt. Men ved store XML filer skal man dog engang imellem holde tungen ret lige i munden
Avatar billede limemedia Nybegynder
14. maj 2002 - 05:53 #6
hvordan du får data i $xml er underordnet - on du henter fra fil, database eller hvad du kan finde på er underordnet, blot det er en stor streng (ikke et array) så er det underordnet.
Avatar billede lequet Nybegynder
14. maj 2002 - 05:55 #7
OK :) Takker mange gange, så er det bare at gå igang :)

Generelt skal man da holde tungen ret lige i munden, når det handler om XML, skulle jeg mene :) Så det går nok
Avatar billede limemedia Nybegynder
14. maj 2002 - 05:56 #8
np
Avatar billede angelenglen Nybegynder
27. august 2004 - 12:04 #9
hvordan ville ovenstående se ud, hvis jeg skulle trække data ind fra eksempelvis "test.xml" istedet for at hardcode det ind?

den fil jeg gerne vil læse ind, kan ses her:
http://www.thespirit.dk/nordic/5816321.xml
Avatar billede angelenglen Nybegynder
27. august 2004 - 12:05 #10
ps: jeg skal naturligvis gerne give points for svaret!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester