[xml->php] data in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb een xml document
test.xml
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="ISO8859-1" ?>

<AANBIEDINGEN>
    <AANBIEDING>
           <NAAM>Kb</NAAM>
       <OMSCHRIJVING>Ook deze sokken worden veel gebruikt voor het dragen in skates. Ze zijn een stuk dunner maar ook erg warm.</OMSCHRIJVING>
       <FOTO>20.JPG</FOTO>
       <PRIJS>14,99</PRIJS>
    </AANBIEDING>
    <AANBIEDING>
        <NAAM>Gsus</NAAM>
        <OMSCHRIJVING>Rokje met tijgerprint en een licht-rose riempje.</OMSCHRIJVING>
        <FOTO>12.JPG</FOTO>
        <PRIJS>179,95</PRIJS>
    </AANBIEDING>
</AANBIEDINGEN>


ik heb nu de volgende php code (test.php)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php

$file = "test.xml";
$map_array = array(
    "BOLD"     => "B",
    "EMPHASIS" => "I",
    "LITERAL"  => "TT"
);

function startElement($parser, $name, $attrs) {
    global $map_array;
    if ($htmltag = $map_array[$name]) {
        print "<$htmltag>";
    }
}

function endElement($parser, $name) {
    global $map_array;
    if ($htmltag = $map_array[$name]) {
        print "</$htmltag>";
    }
}

function characterData($parser, $data) {
    print $data;
    print "<br>";
}

$xml_parser = xml_parser_create();

characterData(city, $data);

// use case-folding so we are sure to find the tag in $map_array
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {

    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

?>


hij geeft nu netjes de output maar hij geeft alle output ik wil alleen een aantal outputs in verschillende variabalen zetten (of in een array) zoals prijs zodat ik hier later mee kan rekenen

weet iemand een oplossing?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nou, dat is heel simpel...

die functies die nu de boel rechtstreeks uitspugen kan je natuurlijk ook zo veranderen dat het in een array komt. Bijvoorbeeld zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// incompleet
$current_values = array();
function startElement()
{
    array_push($current_value(new array('name' => $name, 'args' => $args, 'data' => ''));
}

function characterData()
{
    $current_values[count($current_values)-1]['data'] .= $data;
}

function endElement()
{
   // doe iets met die afgesloten waarde, bijv:
   print_r(array_pop($current_values));
}

Acties:
  • 0 Henk 'm!

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 16-09 10:29

Apache

amateur software devver

Of je gebruikt natuurlijk de php functie om xml naar een array te lezen?

http://be2.php.net/xml_parse_into_struct

If it ain't broken it doesn't have enough features


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Apache schreef op 01 juni 2003 @ 16:23:
Of je gebruikt natuurlijk de php functie om xml naar een array te lezen?

http://be2.php.net/xml_parse_into_struct
Verrek, zo leer ik zelfs wat nieuws :o

Hoewel je met zoiets alsnog je array moet aflopen natuurlijk.

[ Voor 12% gewijzigd door ACM op 01-06-2003 16:26 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 01 June 2003 @ 16:21:
Nou, dat is heel simpel...

die functies die nu de boel rechtstreeks uitspugen kan je natuurlijk ook zo veranderen dat het in een array komt. Bijvoorbeeld zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// incompleet
$current_values = array();
function startElement()
{
    array_push($current_values(new array('name' => $name, 'args' => $args, 'data' => ''));
}

function characterData()
{
    $current_values[count($current_values)-1]['data'] .= $data;
}

function endElement()
{
   // doe iets met die afgesloten waarde, bijv:
   print_r(array_pop($current_values));
}
Bij het gebruik van deze code krijg ik de volgende fout:
Parse error: parse error, unexpected T_ARRAY, expecting T_STRING or T_VARIABLE or '$' in D:\www\sskate\test.php on line 13
kijkend naar de code is regel 13 de volgende
PHP:
1
array_push($current_value(new array('name' => $name, 'args' => $args, 'data' => ''));


Ik wil de waardes graag in een array hebben op de volgende manier
PHP:
1
2
3
4
5
6
7
$array1[naam];
$array1[omschrijving];
$array1[prijs];

$array2[naam];
$array2[omschrijving];
$array2[prijs];


enz..
weet iemand dit op te lossen?

[ Voor 24% gewijzigd door Verwijderd op 01-06-2003 19:04 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

ow daar mist een comma tussen $current_value en new array, maar je mag best zelf wat uitzoeken en proberen de code die je voorgeschoteld krijgt te analyseren en te gebruiken...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 01 June 2003 @ 18:57:
ow daar mist een comma tussen $current_value en new array, maar je mag best zelf wat uitzoeken en proberen de code die je voorgeschoteld krijgt te analyseren en te gebruiken...
kun je iets precieser zijn in de plaats van de komma, waar ik hem ook neerzet tussen die 2 hij blijft foutmeldingen geven

Acties:
  • 0 Henk 'm!

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

kun je iets precieser zijn in de plaats van de komma, waar ik hem ook neerzet tussen die 2 hij blijft foutmeldingen geven
PHP:
1
array_push($current_value, new array('name' => $name, 'args' => $args, 'data' => ''));

[ Voor 107% gewijzigd door Shift op 01-06-2003 20:11 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit maakt geen verschil, de foutmelding blijft ook hetzelfde

Acties:
  • 0 Henk 'm!

  • johnny7
  • Registratie: November 2000
  • Laatst online: 07-11-2023
Misschien $current_values gebruiken i.p.v. $current_value? $current_value zal waarschijnlijk niet bestaan. Misschien handig voor de topicstarter om eerst de code te bekijken, voordat hij meteen hier een reactie neer kwakt. Die array_push functie is wel redelijk basic. Kan hij dan meteen ook opletten dat hij alles goed kopieert uit het voorbeeld van ACM? Dan had ie dat probleempje niet gehad met $current_value.

[ Voor 60% gewijzigd door johnny7 op 01-06-2003 19:32 ]


Acties:
  • 0 Henk 'm!

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Ik kan het wel maken hoe je het wilt maar wat heb ik eraan :D

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

ach, nu ik er nog 5 seconden meer naar kijk zie ik dat er ook nog en ( te veel in staat. Kan je dat zelf niet gewoon uitvogelen?

array_push($current_values, new array('name' => $name, 'args' => $args, 'data' => ''));

dus...

't Is misschien wat lastig dat de code die ik hier uit mijn hoofd inklop niet werkt, maar ik heb geen zin de code zelf te testen. Zeker niet als ik alleen maar een idee illustreer en de code helemaal niet bedoeld of geschikt is voor echt gebruik...

Domweg overnemen, terwijl de eerste regel al zegt dat het incompleet (en blijkbaar ook niet helemaal syntactisch correct) is dan niet de handigste actie.

Want wat doe je zometeen als de code niet werkt, ondanks dat het syntactisch correct is (want ik garandeer je dat het niet werkt als je het domweg copy&paste, al zijn er alleen al te weinig parameters voor de functies opgegeven)? Kom je dan vragen waarom het niet werkt?

Of ga je dan wel proberen de code te begrijpen, zodat je het idee erachter eruit kunt destilleren en hergebruiken voor je eigen probleem... Dat laatste is mijn bedoeling als ik zo'n codevoorbeeld geef, dat eerste niet...

edit:

Ow, het was ook nog met een s erachter, nahja, dat maakt het als illustratie niet minder geschikt...


Ter aanvulling:
Men wil hier best anderen helpen. Sterker nog, ze zouden hier niet rondhangen als ze dat niet wilden :)
Maar het is niet zo dat die mensen dan meer tijd kwijt willen zijn met helpen dan noodzakelijk, zeker niet met het sufste werk van het programmeren: Het debuggen van code.
Jij hebt een probleem, iemand geeft je een tip hoe je dat op kan lossen en eventueel een codevoorbeeld erbij. Zo'n tip is vaak niet 100% volledig, maar doorgaans wel waardevol en bruikbaar, al is het alleen maar dat je eigen denken een andere richting in kan gaan en wellicht je zelfs met een beter idee aan komt zetten dan de gene die je probeerde te helpen.
Zo'n codevoorbeeld is nog veel vaker incorrect, tenzij er bij staat dat het getest is kan je er maar beter van uitgaan dat het enkel als illustratie bedoeld is en niet als direct bruikbare code :)

't Is echter aan jou en alleen aan jou, om te bepalen of de code en tips bruikbaar zijn en hoe dat toepasbaar is in jouw eigen programma ter oplossing van je eigen problemen. Dat dat soms wat werk en tijd kost, sja.. Wees blij dat je dan iig bruikbare tips krijgt, scheelt je iig een hoop gedoe met allerlei dingetjes uitproberen :)

[ Voor 40% gewijzigd door ACM op 01-06-2003 19:40 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
johnny7 schreef op 01 June 2003 @ 19:28:
Misschien $current_values gebruiken i.p.v. $current_value? $current_value zal waarschijnlijk niet bestaan. Misschien handig voor de topicstarter om eerst de code te bekijken, voordat hij meteen hier een reactie neer kwakt. Die array_push functie is wel redelijk basic. Kan hij dan meteen ook opletten dat hij alles goed kopieert uit het voorbeeld van ACM? Dan had ie dat probleempje niet gehad met $current_value.
de s achter $current_value had ik al meteen door. ik heb vrijwel geen ervaring met het gebruiik van arrays vandaar dat ik niet alle fouten er zelf uit heb kunnen halen

verder vind ik het jammer dat sommige mensen direct op hun teentjes getrapt zijn als er iemand een probleem probeert op te lossen.

ik begrijp dat het testen van een stukje code niet gebeurt dit verwacht ik ook zeker niet

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 01 June 2003 @ 19:47:
de s achter $current_value had ik al meteen door. ik heb vrijwel geen ervaring met het gebruiik van arrays vandaar dat ik niet alle fouten er zelf uit heb kunnen halen
Mja, maar hier was er gewoon sprake van een stukje foute aanroep van een functie. Heeft nog niet zo veel met arrays te maken, behalve dat dat toevallig in de naam van de functie stond :)
verder vind ik het jammer dat sommige mensen direct op hun teentjes getrapt zijn als er iemand een probleem probeert op te lossen.

ik begrijp dat het testen van een stukje code niet gebeurt dit verwacht ik ook zeker niet
Ik ben/was niet op mijn teentjes getrapt hoor. Maar vond het wel nodig je er even op te wijzen.

De 'new' moest trouwens ook nog weg voor de array...

In plaats van die array_pop kan je dus hele andere dingen doen. Met deze code, zodra je de functieparameters erbij zet enzo, zou je per record steeds zien wat er aan tekst in stond. Dus zoiets:
naam: kb
omschrijving: ...
foto: ...
prijs: ...
aanbieding:
...
aanbiedingen:

Maar dan in het uitspuugformaat van print_r.

In plaats van domweg de uitkomst van array_pop af te drukken kan je er het een en ander mee uitvoeren.
Zo kan je in de start-element-functie een ander vorm van array aanmaken als je een AANBIEDING tegenkomt, eentje met naam, omschrijving, foto en prijs erin die je eerst allemaal op 0/lege string initializeert.

Zodra je dan een element van type NAAM/OMSCHRIJVING/... je houdt dan met bijvoorbeeld de current_values uit mijn voorbeeld bij waar je precies mee bezig bent. Want ten tijde van de uitvoer van de characterdata-functie weet je dat niet, tenzij je dat dus bijhoudt.

Vervolgens kan je dus bij je end-element-functie de current_values steeds weer bijwerken zodat je weet waar je bent, maar zodra je een AANBIEDING tegenkomt (de afsluiting van je aanbieding dus) kan je een andere actie uitvoeren.

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
32
<?
// incompleet
$current_values = array();
$aanbiedingen = array();
function startElement(...)
{
    // Volgende aanbieding
    if($name == 'AANBIEDING')
      $aanbieding[] = array('NAAM' => '', ... );
    else
       array_push($current_value, array('name' => $name, 'args' => $args, 'data' => ''));
}

function characterData()
{
    $current_values[count($current_values)-1]['data'] .= $data;
}

function endElement()
{
   // doe iets met die afgesloten waarde, bijv:
   // Wijzigen van de inhoud van de huidige aanbieding
    if($name != 'AANBIEDING' ... )
    {
      $aanbieding[count($aanbieding) - 1][$value->name] = $value->data;
      $value = array_pop($current_values);
    }
}


print_r($aanbieding);
?> 


Goed, met zoiets zou je heel erg geholpen kunnen zijn?

[ Voor 7% gewijzigd door ACM op 01-06-2003 20:22 ]


Acties:
  • 0 Henk 'm!

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

Ok, laat ik maar je helpen,

kijk naar de volgende voorbeeld : http://www.helinium.nl/beta/hehe.php

ben je daar blij mee ? Zo ja dan ik kan je de source geven :)

[ Voor 4% gewijzigd door Shift op 01-06-2003 20:26 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Shift schreef op 01 June 2003 @ 20:25:
Ok, laat ik maar je helpen,

kijk naar de volgende voorbeeld : http://www.helinium.nl/beta/hehe.php

ben je daar blij mee ? Zo ja dan ik kan je de source geven :)
Je zou nog wat trim()s mee kunnen geven bij het inlezen van de data ;)

Acties:
  • 0 Henk 'm!

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

ACM schreef op 01 June 2003 @ 20:34:
[...]

Je zou nog wat trim()s mee kunnen geven bij het inlezen van de data ;)
Jah, dat kan wel :) maar trim haalt ook spaties weg dacht ik.

Heyy, inderdaad, met trim aardig opgeschoond

[ Voor 20% gewijzigd door Shift op 01-06-2003 21:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Shift schreef op 01 June 2003 @ 20:25:
Ok, laat ik maar je helpen,

kijk naar de volgende voorbeeld : http://www.helinium.nl/beta/hehe.php

ben je daar blij mee ? Zo ja dan ik kan je de source geven :)
Zou ik de source kunnen krijgen hiervan want dit is precies wat ik zoek

alvast bedankt

Acties:
  • 0 Henk 'm!

  • Shift
  • Registratie: Augustus 2000
  • Laatst online: 16-06 11:48

Shift

[] Dual crazy []

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class AanbiedingParser
{ 
    var $insideitem = false; 
    var $tag = ""; 
    var $naam ="";
    var $omschrijving = ""; 
    var $foto = "";    
    var $prijs = "";
    var $items = array(); 

    function startElement($parser, $tagName, $attrs) 
    { 
        if ($this->insideitem) 
        { 
            $this->tag = $tagName; 
        } elseif ($tagName == "AANBIEDING") { 
               $this->insideitem = true; 
        } 
    } 

    function endElement($parser, $tagName) 
    { 
        if ($tagName == "AANBIEDING")
        { 
            array_push($this->items, array($this->naam, $this->omschrijving, $this->foto, $this->prijs)); 
            $this->naam = "";
            $this->omschrijving = "";
            $this->foto = "";
            $this->prijs = "";         
            $this->insideitem = false; 
        } 
    } 

    function characterData($parser, $data) 
    { 
        if ($this->insideitem)
        { 
            switch ($this->tag)
            { 
                case "NAAM":
                    $this->naam .= trim($data);
                    break;
                case "OMSCHRIJVING": 
                    $this->omschrijving .= trim($data); 
                    break; 
                case "FOTO": 
                    $this->foto .= trim($data); 
                    break; 
                case "PRIJS": 
                    $this->prijs .= trim($data); 
                    break; 
            } 
        } 
    } 

    function getItems () 
    { 
        return $this->items; 
    } 
} 

$xml_parser = xml_parser_create(); 
$aanbieding_parser = new AanbiedingParser(); 
xml_set_object($xml_parser,&$aanbieding_parser); 
xml_set_element_handler($xml_parser, "startElement", "endElement"); 
xml_set_character_data_handler($xml_parser, "characterData"); 
$fp = fopen("test.xml","r") or die("Fout met lezen van data."); 
while ($data = fread($fp, 4096)) 
   xml_parse($xml_parser, $data, feof($fp)) or die(sprintf("XML error: %s at line %d",   
           xml_error_string(xml_get_error_code($xml_parser)),   
           xml_get_current_line_number($xml_parser))); 
fclose($fp); 
xml_parser_free($xml_parser); 

/*
   Onderstaande kan weg
*/
echo "<pre>";
print_r($aanbieding_parser->getItems());
echo "</pre>";

foreach($aanbieding_parser->getItems() AS $key)
{
    foreach($key as $waardens => $waarde)
    {
        switch($waardens)
        {
            case 3:
                $totaal=$totaal+$waarde;
                break;
        }
    }
}

echo "Totaal is : ",$totaal;


De rest mag je zelf doen :) Als er nog wat te doen valt dan 8)

[ Voor 22% gewijzigd door Shift op 01-06-2003 22:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Allemaal bedankt voor de hulp mijn probleem is opgelost het werkt prima
Pagina: 1