[PHP] XML File in Array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bop
  • Registratie: Juni 2001
  • Laatst online: 19-08-2024

bop

VisualWeb

Topicstarter
Ik heb met een code van PHP.net mijn XML file in een Array kunnen zettten:
http://www.vilog.nl/whoei.xml:
code:
1
2
3
4
5
6
7
 <PAYMENTRESULT TRANSACTIONID="1012868">
 <PAYMENTMETHODBRANDID>VISA</PAYMENTMETHODBRANDID>
 <ORDERNUMBER>8</ORDERNUMBER>
 <RESULTCODE>1000</RESULTCODE>
 <REMARK></REMARK>
 <TASECRETCODE>Qf1bPF3pC6puriWLwmK</TASECRETCODE>
 </PAYMENTRESULT>


De array ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      tree["TRANSACTIONID"]=="1012868" 
                tree["tag"]=="PAYMENTMETHODBRANDID" 
                tree["attributes"]=="" 
                tree["value"]=="VISA" 
                    tree["tag"]=="ORDERNUMBER" 
                    tree["attributes"]=="" 
                    tree["value"]=="8" 
                        tree["tag"]=="RESULTCODE" 
                        tree["attributes"]=="" 
                        tree["value"]=="1000" 
                            tree["tag"]=="REMARK" 
                            tree["attributes"]=="" 
                            tree["value"]=="" 
                                tree["tag"]=="TASECRETCODE" 
                                tree["attributes"]=="" 
                                tree["value"]=="Qf1bPF3pC6puriWLwmK"


Nou is het de bedoeling dat ik de waardes(VALUE), en de TAG namen bij elkaar krijgt, dus dat ik vijf verschillende combo's kan echo-en, en zo in de DB kan zetten, daar waar ze horen

Voorbeeld;
Bij TASECRETCODE hoor Qf1bPF3pC6puriWLwmK

Nou heb ik al een tijd lopen kutten, en ook veel gezocht, en gevraagd, maar het lukt me echt niet, het lijkt wel of ze Array niet geset is, maar dat is ie wel. Het zal wel heel simpel zijn, maar weet iemand hoe ik dit voor elkaar krijg?

De array en de broncode zijn te vinden op:
http://www.vilog.nl/test.php

doe niet aan signatures.. uhhh, arghhh


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Waarom ben je het wiel opnieuw aan't uitvinden?

ZOek eens naar de Xpath functies van php ;)

Stop uploading passwords to Github!


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Papa Eend:
Waarom ben je het wiel opnieuw aan't uitvinden?

ZOek eens naar de Xpath functies van php ;)
afaik heeft PHP nog geen XPath implementatie, en ben je in de war met expat, de implementatie van (sax) XML parsers die PHP biedt :) Zie de manual :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

drm schreef op 13 november 2003 @ 11:01:
[...]
afaik heeft PHP nog geen XPath implementatie, en ben je in de war met expat, de implementatie van (sax) XML parsers die PHP biedt :) Zie de manual :)
Klopt, er zijn nog geen native functies, maar er is wel een xpath class die z'n werk perfect doet :)

http://sourceforge.net/projects/phpxpath/

Stop uploading passwords to Github!


  • mr.inno
  • Registratie: April 2003
  • Laatst online: 14-09 18:19
Papa Eend schreef op 13 november 2003 @ 10:57:
Waarom ben je het wiel opnieuw aan't uitvinden?

ZOek eens naar de Xpath functies van php ;)
ach zelf wat aan kloten is ook zo leuk.. soms zit ik er 1 hele dag op en aan einde van de dag ga ik es naar manual en kom ik er achter dat het al bestaat. (idd had ik dus ook bij xml)

inno


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Papa EendKlopt, er zijn nog geen native functies, maar er is wel een xpath class die z'n werk perfect doet :)

http://sourceforge.net/projects/phpxpath/
Die raad ik iedereen ten zeerste af (bij deze ;)). Dat is een log ding wat je absoluut niet in een website moet gebruiken die meerdere keren per uur opgevraagd wordt. Het is leuk om eens wat kennis mee op te doen maar hij is allesbehalve efficient :) Als je een sourcebestand krijgt van 247 kB (!!) moet je sowieso al vragen gaan stellen, als je het mij vraagt, maar goed... da's wel een beetje subjectief :) Uit ervaring zeg ik iig: niet (in productie) gebruiken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
drm schreef op 13 november 2003 @ 23:08:
[...]
Die raad ik iedereen ten zeerste af (bij deze ;)). Dat is een log ding wat je absoluut niet in een website moet gebruiken die meerdere keren per uur opgevraagd wordt. Het is leuk om eens wat kennis mee op te doen maar hij is allesbehalve efficient :) Als je een sourcebestand krijgt van 247 kB (!!) moet je sowieso al vragen gaan stellen, als je het mij vraagt, maar goed... da's wel een beetje subjectief :) Uit ervaring zeg ik iig: niet (in productie) gebruiken.
wat raad je aan als alternatief, totdat php5 een beetje ingeburgerd is?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

voor php4 gewoon expat. zie http://www.php.net/ref.xml

Je kunt er voorlopig genoeg mee, en alles wat je mist kun je er zo goed als eenvoudig bijschrijven.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • sjokki
  • Registratie: Juli 2002
  • Niet online
In de DOMXML-extensie zitten wel xpath-functies. Op http://www.informit.com/i...2%7D/content/articlex.asp staat een artikel waarin deze functies gebruikt worden.

[ Voor 8% gewijzigd door sjokki op 14-11-2003 04:24 ]


Acties:
  • 0 Henk 'm!

  • bop
  • Registratie: Juni 2001
  • Laatst online: 19-08-2024

bop

VisualWeb

Topicstarter
Ik weet niet of het iemand nog interesseerd, maar zo heb ik et uitendelijk gedaan"

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
function GetChildren($vals, &$i) 
{ 
  $children = array();     // Contains node data
  
  /* Node has CDATA before it's children */
  if (isset($vals[$i]['value'])) 
    $children['VALUE'] = $vals[$i]['value']; 
  
  /* Loop through children */
  while (++$i < count($vals))
  { 
    switch ($vals[$i]['type']) 
    { 
      /* Node has CDATA after one of it's children 
        (Add to cdata found before if this is the case) */
      case 'cdata': 
        if (isset($children['VALUE']))
          $children['VALUE'] .= $vals[$i]['value']; 
        else
          $children['VALUE'] = $vals[$i]['value']; 
        break;
      /* At end of current branch */ 
      case 'complete': 
        if (isset($vals[$i]['attributes'])) {
          $children[$vals[$i]['tag']][]['ATTRIBUTES'] = $vals[$i]['attributes'];
          $index = count($children[$vals[$i]['tag']])-1;

          if (isset($vals[$i]['value'])) 
            $children[$vals[$i]['tag']][$index]['VALUE'] = $vals[$i]['value']; 
          else
            $children[$vals[$i]['tag']][$index]['VALUE'] = ''; 
        } else {
          if (isset($vals[$i]['value'])) 
            $children[$vals[$i]['tag']][]['VALUE'] = $vals[$i]['value']; 
          else
            $children[$vals[$i]['tag']][]['VALUE'] = ''; 
        }
        break; 
      /* Node has more children */
      case 'open': 
        if (isset($vals[$i]['attributes'])) {
          $children[$vals[$i]['tag']][]['ATTRIBUTES'] = $vals[$i]['attributes'];
          $index = count($children[$vals[$i]['tag']])-1;
          $children[$vals[$i]['tag']][$index] = array_merge($children[$vals[$i]['tag']][$index],GetChildren($vals, $i));
        } else {
          $children[$vals[$i]['tag']][] = GetChildren($vals, $i);
        }
        break; 
      /* End of node, return collected data */
      case 'close': 
        return $children; 
    } 
  } 
} 

/* Function will attempt to open the xmlloc as a local file, on fail it will attempt to open it as a web link */
function GetXMLTree($xmlloc) 
{ 
  if (file_exists($xmlloc))
    $data = implode('', file($xmlloc)); 
  else {
    $fp = fopen($xmlloc,'r');
    $data = fread($fp, 100000000);
    fclose($fp);
  }

  $parser = xml_parser_create('ISO-8859-1');
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); 
  xml_parse_into_struct($parser, $data, $vals, $index); 
  xml_parser_free($parser); 

  $tree = array(); 
  $i = 0; 
  
  if (isset($vals[$i]['attributes'])) {
    $tree[$vals[$i]['tag']][]['ATTRIBUTES'] = $vals[$i]['attributes']; 
    $index = count($tree[$vals[$i]['tag']])-1;
    $tree[$vals[$i]['tag']][$index] =  array_merge($tree[$vals[$i]['tag']][$index], GetChildren($vals, $i));
  }
  else
    $tree[$vals[$i]['tag']][] = GetChildren($vals, $i); 
  
  return $tree; 
} 


if($HTTP_RAW_POST_DATA) {
    $temp_filename = "/home/usr/public_httml/tmp/" . mt_rand(10,1000000);
    $fp = fopen($temp_filename, "w+");
    fwrite($fp,$HTTP_RAW_POST_DATA);
    
    $tree = GetXMLTree($temp_filename);
}


Door dan nog een ander script te gebruiken wat de gehel tree laat zien en hoe je em echo-ed
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Used to display detailed information about an array */
function printa($obj) {
  global $__level_deep;
  if (!isset($__level_deep)) $__level_deep = array();

  if (is_object($obj))
    print '[obj]';
  elseif (is_array($obj)) {
    foreach(array_keys($obj) as $keys) {
      array_push($__level_deep, "[".$keys."]");
      printa($obj[$keys]);
      array_pop($__level_deep);
    }
  }
  else print implode(" ",$__level_deep)." = $obj";
}


Dan kom je erachter dat je ze bijvoorbeeld zo kan aanroepen:

PHP:
1
$PAYMENT = $tree['PAYMENTRESULT'][0]['PAYMENTMETHODBRANDID'][0]['VALUE'];


wat een array ;x
Maar goed, als iemand nog een keer TWYP gaat gebruiken ofzo, en een payment module nodig heeft.. mail me dan maar :)

doe niet aan signatures.. uhhh, arghhh


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
drm schreef op 13 november 2003 @ 23:31:
voor php4 gewoon expat. zie http://www.php.net/ref.xml

Je kunt er voorlopig genoeg mee, en alles wat je mist kun je er zo goed als eenvoudig bijschrijven.
Ja maar met expat kun je geen XML documenten manipuleren? En die DOMXML extensie ben ik niet zo over te spreken, daar wacht ik wel mee tot PHP5 een beetje ingeburgerd is. XSLT (Sablotron) is natuurlijk ook een fraaie manier om XML mee te genereren, mits je een brondocument hebt (en waar komt dat brondocument dan vandaan als dat dynamisch is).

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Genoil:
Ja maar met expat kun je geen XML documenten manipuleren?
die lib biedt niet precies die functionaliteit, nee, maar je kunt xml ermee uitlezen en hoe je xml weg moet schrijven weet je zelf ook wel, zo lastig is dat niet ;)

Dus dat is geen onoverkomelijk gemis :) Let wel: ik zeg niet dat expat ideaal is, bij lange na niet, maar ik zeg wel dat het, voor wat PHP je biedt, op dit moment imho de beste oplossing is.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
drm schreef op 14 november 2003 @ 13:14:
[...]
die lib biedt niet precies die functionaliteit, nee, maar je kunt xml ermee uitlezen en hoe je xml weg moet schrijven weet je zelf ook wel, zo lastig is dat niet ;)

Dus dat is geen onoverkomelijk gemis :) Let wel: ik zeg niet dat expat ideaal is, bij lange na niet, maar ik zeg wel dat het, voor wat PHP je biedt, op dit moment imho de beste oplossing is.
ok maar als ik dus een bestaand xml document wil gaan manipuleren mbv expat, dan moet ik dus zelf een soort van DOM implementatie schrijven, zodat ik het document in de vorm van geneste objecten kan manipuleren, en die vervolgens terugserializen naar een XML file. wat is dan nog het verschil met de PhpXPath library?

Kijk, als ik nou bv een MySQL resultset wil omvormen in XML, dan is dat proces dusdanig lineair dat ik geen DOM nodig heb. Maar da's wat anders wanneer XML niet (alleen) als tussenlaag wordt gebruikt, maar als eenvoudige 'database'.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

ok maar als ik dus een bestaand xml document wil gaan manipuleren mbv expat, dan moet ik dus zelf een soort van DOM implementatie schrijven, zodat ik het document in de vorm van geneste objecten kan manipuleren, en die vervolgens terugserializen naar een XML file. wat is dan nog het verschil met de PhpXPath library?
Schrijf zelf maar eens iets in die trant en vergelijk het eens met de source van XPath. Believe you me, het kan honderd keer efficienter. En niet zo zeer omdat XPath nou zo slecht is, maar gewoon omdat het volzit met allerlei crap die je 99 van 100 keer niet nodig hebt.

't Is puur mijn ervaring ermee, en als je denkt dat je er andere ervaringen mee gaat krijgen hou ik je echt niet tegen :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
drm schreef op 14 november 2003 @ 13:42:
[...]
Schrijf zelf maar eens iets in die trant en vergelijk het eens met de source van XPath. Believe you me, het kan honderd keer efficienter. En niet zo zeer omdat XPath nou zo slecht is, maar gewoon omdat het volzit met allerlei crap die je 99 van 100 keer niet nodig hebt.

't Is puur mijn ervaring ermee, en als je denkt dat je er andere ervaringen mee gaat krijgen hou ik je echt niet tegen :)
Ok ik geloof je op je woord. En ik ben het helemaal met je eens dat het kreng een beetje aan de slome kant is :). Zelf iets schrijven vind ik, met PHP5 in aantocht, zonde van de tijd :).

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Genoil schreef op 14 november 2003 @ 13:08:
[...]


Ja maar met expat kun je geen XML documenten manipuleren?
Dit kan met de PEAR class XML_Tree
Pagina: 1