Toon posts:

[XML/PHP] Correct parsen in array

Pagina: 1
Acties:

Verwijderd

Topicstarter
Oke, hier komt het: Een paar dagen wat door te hebben gelezen over XML besloot ik zelf ook maar eens wat te gaan maken. Mijn idee was om te beginnen met een simpel gastenboek met PHP/XML. Ik wil dus een simpele structuur met de data in een XML-file. Ik heb gekozen voor de volgende xml file:
guestbook.xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE TurboTracker SYSTEM "guestbook.dtd">
<guestbook>
    <posting>
        <id>324</id>
        <username>Willy Spruijt</username>
        <useremail>willy@p4n.nl</useremail>
        <subject>Dit is het onderwerp</subject>
        <message>Dit is het bericht</message>
    </posting>
    <posting>
        <id>326</id>
        <username>Kabouter Plop</username>
        <useremail>kabouter@plop.nl</useremail>
        <subject>Onderwerpje</subject>
        <message>Dit is het bericht met xml te creeeren</message>
    </posting>
</guestbook>

Guestbook.dtd:
code:
1
2
3
4
5
6
7
<!ELEMENT guestbook (posting+)>
<!ELEMENT posting (id, username, useremail, subject, message)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT useremail (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT message (#PCDATA)>

Dan gebruik ik de volgende code om te parsen(php):
code:
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
<?php
$file = "guestbook.xml";

// Call this at the beginning of every element
function startElement($parser, $name, $attrs) {
    if (($name != "GUESTBOOK") and ($name != "POSTING"))
    {
    $name = strtolower($name);
    $name = ucfirst($name);
    print "$name:  ";
    }
}

// Call this at the end of every element
function endElement($parser, $name) {
    print "\n";
}

// Call this whenever there is character data
function characterData($parser, $value) {
    $value = trim($value);
    if ($value != "")
    {
    print "$value<BR>";
    }
}

// Define the parser
$simpleparser = xml_parser_create();
xml_set_element_handler($simpleparser, "startElement", "endElement");
xml_set_character_data_handler($simpleparser, "characterData");

// Open the XML file for reading
if (!($fp = fopen($file, "r"))) {
  die("could not open XML input");
}

// Parse it
while($data = fread($fp, filesize($file))) {
if (!xml_parse($simpleparser, $data, feof($fp))) {
  die(xml_error_string(xml_get_error_code($simpleparser)));
  }
}

// Free memory
xml_parser_free($simpleparser);
?>

Allemaal mooi en aardig, en ik krijg het volgende als output:


Id: 324
Username: Willy Spruijt
Useremail: willy@p4n.nl
Subject: Dit is het onderwerp
Message: Dit is het bericht
Id: 326
Username: Kabouter Plop
Useremail: kabouter@plop.nl
Subject: Onderwerpje
Message: Dit is het bericht met xml te creeeren

Tot nu toe allemaal goed. Als ik wil kan ik hier mooi een gastenboekje van maken. Het wegschrijven van de xml is op zich ook geen probleem. Maar nu het probleem: Ik wil dat het laatste bericht bovenaan in het gastenboek komt. Ik dacht dit te kunnen doen met een aantal arrays, zoals subject, message. Dan kan ik de id als index voor de array nemen, en zo goed sorteren. Maar dit lukt dus niet. Ik krijg de waardes niet goed in een array :( Iemand een idee hoe je data uit een xml bestand in een array krijgt?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Op zich niet echt een oplossing voor je probleem (je bent trouwens al wel leuk bezig geweest :) ), maar wel een heel goed alternatief:

Als je je gastenboek naar (X)HTML wilt omzetten roept dat om het gebruik van XSLT :) . Met XSLT kan je je xml-gastenboek omzetten naar allerlei vormen, waaronder ook XHTML en HTML. XSLT biedt ook sorterings mogelijkheden. Omdat XSLT speciaal bedoelt is voor dergelijke transformaties krijg je hele prettig en eenvoudige code.

Als je liever zelf gaat parsen en converteren zou ik kiezen voor een OO aanpak waarbij je een klasse hebt voor een posting in je gastenboek. Elke posting wordt dan een instantie van die klasse. Dit kan je daarna vrij eenvoudig sorteren op id :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Oke, thanx..
Ik zal me er eens verder in gaan verdiepen :)

Verwijderd

Topicstarter
Oke, het is me al voor een heel groot deel gelukt, alleen stuit ik nu op het volgende probleem: in de xsl-template gebruik ik
code:
1
<xsl:for-each select="posting" order-by="id">

Werkt perfect, alleen nu wil ik hem ipv oplopend aflopend laten sorteren. Dit lukt me echt niet. Iemand een idee?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Volgens mij is dat oude Working Draft stuff... Tegenwoordig is er een apart sort element waarmee je veel meer kan doen (onder andere een 'order' attribuut, die jij nodig hebt ;) ).

Je kunt in de XSLT Tutorial en Reference op http://www.zvon.org vinden hoe dat werkt... Ook op http://www.xfront.com staat een hele goede tutorial :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Inderdaad klopt, maar bij die nieuwe tag krijg ik een melding over een verouderde parser of iets dergelijks :?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
sKiLL4: Inderdaad klopt, maar bij die nieuwe tag krijg ik een melding over een verouderde parser of iets dergelijks :?
Nieuwe engine installeren denk ik :) . Zowel Sabletron als MSXML als Xalan voldoen aan de recommendation. Working draft werk is denk ik niet erg zinvol...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1