[PHP / XML] Via PHP naar XML wegschrijven.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
Ik heb in een XML-bestand een toptien staan (gebruikersnaam, score en tijd van de 10 beste spelers van een spel).

Dit ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<DATA>
<REPORT_DATE>11-Nov-2003</REPORT_DATE>

<RECORD>
<NAME>Naam1</NAME>
<SCORE>10</SCORE>
<TIJD>5:00</TIJD>
</RECORD>

>> en dat dus 10 keer

</DATA>


Ik kan dit via PHP prima uitlezen, ik kom er alleen niet goed uit hoe ik in XML iets moet wegschrijven.
IK ben dus een functie aan het maken die kijkt of iemand in de toptien moet komen, en zo ja, ervoor zorgt dat dit op de juiste plek gebeurd.
Ik heb deze functie wel werkende voor een komma-gescheiden tekst-file.
Maar moet dit nu dus omzetten in XML. En ik kan nergens vinden hoe ik iets dergelijks aan moet pakken!


Zo is de functie momenteel: (voor de tekstfile dus...)

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
//functie om te kijken of de gebruiker in de top tien moet en zo ja, ervoor zorgen dat dit op de juiste plek gebeurd!
 function toevoegen_toptien($gebruiker, $gebruiker_score){
    global $gebruiker;
    global $gebruiker_score;
    $filename="toptien";
    $file= fopen($filename, "r") or die("De gegevens kunnen niet naar de top 10 geschreven worden. Excuses voor het ongemak!");
    while (!feof($file)){
        $line= fgets($file, 1024);
        $entry= explode(",",$line);
 
        for ($i = 9; $i >= 0; $i--) {
            $entry_teller=$i*2;
                //als de gebruikersscore hoger is dan de score in de toptien, dan $plaats de waarde meegeven van de entry[]
                if($gebruiker_score>=$entry[$entry_teller+1]){
                        $plaats=$entry_teller;
                        $hoger="true";
                    } else{
                    
                }
        }
 
        if($hoger){ 
            for($i=0; $i<=($plaats-1); $i++){
                $nummer="entry_new".$i;
                $$nummer= $entry[$i];
            }
 
            $nummer="entry_new".$plaats;
            $$nummer=$gebruiker;
 
            $nummer="entry_new".($plaats+1);
            $$nummer=$gebruiker_score;
        
            for ($i=($plaats+2); $i<=19; $i++){
                $nummer="entry_new".$i;
                $$nummer= $entry[$i-2];
            }
 
            $content= "$entry_new0,$entry_new1,$entry_new2,$entry_new3,$entry_new4,$entry_new5,$entry_new6,$entry_new7,$entry_new8,$entry_new9,$entry_new10,$entry_new11,$entry_new12,$entry_new13,$entry_new14,$entry_new15,$entry_new16,$entry_new17,$entry_new18,$entry_new19";
            $file2= fopen($filename, "w") or die("Wegens een technische storing kunnen er geen gegevens aan de top 10 toegevoegd worden. Excuses voor het ongemak!");
            $finalwrite= fwrite($file2, "$content");
            fclose($file2);         
 
        }
    }
 
    fclose($file);
 
 
 
 }

[ Voor 79% gewijzigd door kazz1980 op 24-11-2003 09:26 ]

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

Verwijderd

Precies op dezelfde manier. Alleen maak je nu een *.xml file aan en zet je bijvoorbeeld ipv alleen een komma achter de naam nu de tags <NAAM> eromheen en een \n voor de leesbaarheid zodat de volgende tag op een nieuwe regel begint... Je past dus je $filename aan en je $content zal er anders uitzien, volgens mij hoef je verder niks bijzonders te doen, het blijft gewoon een ASCII file....

Acties:
  • 0 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 17:33

BoAC

Memento mori

Op php.net zoeken

Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
Verwijderd schreef op 24 november 2003 @ 09:29:
Precies op dezelfde manier. Alleen maak je nu een *.xml file aan en zet je bijvoorbeeld ipv alleen een komma achter de naam nu de tags <NAAM> eromheen en een \n voor de leesbaarheid zodat de volgende tag op een nieuwe regel begint... Je past dus je $filename aan en je $content zal er anders uitzien, volgens mij hoef je verder niks bijzonders te doen, het blijft gewoon een ASCII file....
Ja dit snap ik...
Maar kan ik soms ook 1 van de records vervangen?

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
Dat had ik natuurlijk al lang gedaan...
Alleen dat "dom" kende ik nog niet...en snap ik ook (nog) niet echt....eerlijk gezegd :|

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 17:33

BoAC

Memento mori

Is super handig/eenvoudig. Vergeet alleen niet de betreffende extensie te laden ;)

Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
BoAC schreef op 24 november 2003 @ 09:43:
Is super handig/eenvoudig. Vergeet alleen niet de betreffende extensie te laden ;)
Lijkt inderdaad handig...
alleen voor zover ik het begrijp doet het precies hetzelfde als wat ik in mijn huidige functie doe om het bestand uit te lezen (alleen doe ik het dus wat omslachtiger...)
(Deze functie heb ik niet gepost omdat deze zo lang is en volgens mij niks aan het topic toevoegt...)

Maar over dingen wegschrijven naar XML kan ik nog niks vinden... Die dom-methoden beschrijven (voor zover ik het kan vinden) alleen maar methoden om XML uit te lezen ...

[ Voor 20% gewijzigd door kazz1980 op 24-11-2003 09:50 ]

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

Verwijderd

Ja dat kan (en vast welop verschillende manieren). Ik zou het denk ik op de volgende manier doen: Je leest de file in, die gooi je in een array, je vervangt/verschuift wat records in je array en schrijft de file in z'n geheel opnieuw. Dat is eenvoudiger dan regels opzoeken, splitsen, regels schrijven alles aan elkaar plakken etc..

Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
Verwijderd schreef op 24 november 2003 @ 09:46:
Ja dat kan (en vast welop verschillende manieren). Ik zou het denk ik op de volgende manier doen: Je leest de file in, die gooi je in een array, je vervangt/verschuift wat records in je array en schrijft de file in z'n geheel opnieuw. Dat is eenvoudiger dan regels opzoeken, splitsen, regels schrijven alles aan elkaar plakken etc..
Dat is dus eigenlijk wat ik nu met de tekst-file ook doe.
Maar hoe kan dat met XML?
moet ik het bestand dan gewoon inlezen en laten scheiden door <record> of iets dergelijks? En daarmee dus eigenlijk de boel gewoon als tekst-file behandelen ipv als xml?

[ Voor 8% gewijzigd door kazz1980 op 24-11-2003 09:49 ]

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

kazz1980 schreef op 24 november 2003 @ 09:48:
[...]

Dat is dus eigenlijk wat ik nu met de tekst-file ook doe.
Maar hoe kan dat met XML?
moet ik het bestand dan gewoon inlezen en laten scheiden door <record> of iets dergelijks? En daarmee dus eigenlijk de boel gewoon als tekst-file behandelen ipv als xml?
Een XML bestand IS een tekst bestand.
Het heeft alleen een indeling die aan regels gebonden is.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou dat zelf wel doen, maar ben geen XML die-hard... dus weet niet of er binnen PHP functies zijn die je het leven gemakkelijker mee maken...

Je lees je XML fiile regel voor regel in en als je bij aankomt <record> maak je een nieuwe record aan in je array en bouw je uiteindelijk iets op als
code:
1
2
3
4
5
6
$record[0]["naam"]
$record[0]["score"]
$record[0]["tijd"]
$record[1]["naam"]
$record[1]["score"]
$record[1]["tijd"]


Met wat regular expressions kan je hiervoor een hele mooie functie bouwen denk ik....

Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
DizzyWeb schreef op 24 november 2003 @ 09:53:
[...]


Een XML bestand IS een tekst bestand.
Het heeft alleen een indeling die aan regels gebonden is.
Ja ok...dat weet ik.
Maar gezien het grote aantal functies in php om xml op allerlei manieren uit te lezen leek het me dat er ook wel functies moeten zijn om er simpel in weg te schrijven...

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
Verwijderd schreef op 24 november 2003 @ 09:55:
Ik zou dat zelf wel doen, maar ben geen XML die-hard... dus weet niet of er binnen PHP functies zijn die je het leven gemakkelijker mee maken...

Je lees je XML fiile regel voor regel in en als je bij aankomt <record> maak je een nieuwe record aan in je array en bouw je uiteindelijk iets op als
code:
1
2
3
4
5
6
$record[0]["naam"]
$record[0]["score"]
$record[0]["tijd"]
$record[1]["naam"]
$record[1]["score"]
$record[1]["tijd"]


Met wat regular expressions kan je hiervoor een hele mooie functie bouwen denk ik....
Dit klinkt goed ja...
Ik wist niet dat dit zo mogelijk was.

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 17:33

BoAC

Memento mori

Well: http://nl.php.net/manual/en/ref.domxml.php
offtopic:
Ik hoef toch niet precies uit te leggen wat die functie allemaal doen :? :>

Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
BoAC schreef op 24 november 2003 @ 10:13:

offtopic:
Ik hoef toch niet precies uit te leggen wat die functie allemaal doen :? :>
Nou...als je dat zou willen :P

Ik ga alles nog maar even heel goed bekijken...

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • kazz1980
  • Registratie: Juni 2001
  • Laatst online: 19-08 22:44

kazz1980

Goh... Ik hier?

Topicstarter
Verwijderd schreef op 24 november 2003 @ 09:55:
Ik zou dat zelf wel doen, maar ben geen XML die-hard... dus weet niet of er binnen PHP functies zijn die je het leven gemakkelijker mee maken...

Je lees je XML fiile regel voor regel in en als je bij aankomt <record> maak je een nieuwe record aan in je array en bouw je uiteindelijk iets op als
code:
1
2
3
4
5
6
$record[0]["naam"]
$record[0]["score"]
$record[0]["tijd"]
$record[1]["naam"]
$record[1]["score"]
$record[1]["tijd"]


Met wat regular expressions kan je hiervoor een hele mooie functie bouwen denk ik....
Dit is me gelukt!!
Bedankt!

hier stond iets interessants, maar het is even weg...


Acties:
  • 0 Henk 'm!

  • pgussow
  • Registratie: Maart 2003
  • Laatst online: 18-08 16:13
Dit is natuurlijk volledig GEEN XML wat je dan aan het doen bent. Je bent dan een XML file aan het behandelen als een textfile met een fixed indeling. En dat is natuurlijk niet de bedoeling van XML.
Wat nou als je toevallig 2 tags omgedraaid hebt? Dan werkt jouw gebeuren niet.

Wat de standaard procedure is:
1. Lees alle bytes in
2. Haal ze door een DOM-parser.
3. Blader door de XML die de DOM-methods.

XML is namelijk niets meer dat een tree-structuur. Dus je moet hem ook als tree behandelen en niet als gewone tekst.

edit:

Oh ja, waar je natuurlijk OOK mee uit moet kijken, zijn special characters. Die moet je wel vertalen naar XML-compliant chars.
Want bij bijvoorbeeld <naam>Jan & amp; Joke</naam> is de inhoud van naam 'Jan & Joke'. Want <naam>Jan & Joke</naam> is geen geldige XML...

[ Voor 22% gewijzigd door pgussow op 24-11-2003 12:54 ]


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Dit leek me wel een verhelderen artikel over DOM XML.
http://www.phpbuilder.com/columns/matt20001228.php3

[ Voor 7% gewijzigd door Brakkie op 24-11-2003 14:56 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 08:45
Ik gebruik deze class om xml te lezen, misschien kan je er wat mee.

gebruik

$xml = new xmlparser;
$xmldata = $xml->open("filename");

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
<?
class xmlparser {
  /* Function will attempt to open the xmlloc as a local file, on fail it will attempt to open it as a web link */
  function open($xmlloc)
  {
    if (file_exists($xmlloc))
      $data = implode('', file($xmlloc));
    else {
      trigger_error ("Could not open XML File: $xmlloc", E_USER_WARNING);
      return false;
    }

    $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);

    $i = 0;
    $content = Array();
    $content[strtolower($vals[$i]['tag'])][] = $this->GetChildren($vals, $i);
    return $content;
  }

  function GetChildren($vals, &$i)
  {
    $children = array();       // Contains node data

    /* Loop through children */
    while (++$i < count($vals))
    {
      switch ($vals[$i]['type'])
      {
        /* At end of current branch */
        case 'complete':
          if (isset($children[strtolower($vals[$i]['tag'])]))
          {
            // Create Array from s
            if (!is_array($children[strtolower($vals[$i]['tag'])]))
              $children[strtolower($vals[$i]['tag'])] = Array($children[strtolower($vals[$i]['tag'])], $vals[$i]['value']);
            else
              $children[strtolower($vals[$i]['tag'])][] = $vals[$i]['value'];
          }
          else
          {
            // Add a new child
            $children[strtolower($vals[$i]['tag'])] = @$vals[$i]['value'];
          }
          break;
        /* Node has more children */
        case 'open':
          if (isset($children[strtolower($vals[$i]['tag'])]))
          {
            // Create Array from s
            if (!isset($children[strtolower($vals[$i]['tag'])][0]))
              $children[strtolower($vals[$i]['tag'])] = Array($children[strtolower($vals[$i]['tag'])], $this->GetChildren($vals, $i));
            else
              $children[strtolower($vals[$i]['tag'])][] = $this->GetChildren($vals, $i);
          }
          else
          {
            // Add a new child
            $children[strtolower($vals[$i]['tag'])] = $this->GetChildren($vals, $i);
          }
          break;
        /* End of node, return collected data */
        case 'close':
            return $children;
      }
    }
  }
}
?>
Pagina: 1