tekstbestanden (XML) samenvoegen via keuzemenu in PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Guido van Harten

Guido van Harten

21/11/2015 19:26:51
Quote Anchor link
Ik wil een script maken waarin de gebruikers een aantal XML-bestanden kunnen aanvinken. Die bestanden moeten vervolgens aan elkaar worden geplakt tot één (groot) XML-bestand en ter download worden aangeboden. Deze download kan dan vervolgens worden gebruikt in een volgend programma.
Hoe pak ik dit aan? Wie kan mij op weg helpen?

De code die ik nu heb bevat slechts het keuzemenu waarmee verder nog niets gebeurt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<form action="bundels.php" method="get">
<table><td>
  <input type="checkbox" name="bundel" value="awn">Alles wordt nieuw<br>
  <input type="checkbox" name="bundel" value="bs">Berijmde Schriftgedeelten - in gebruik in de Christelijke Gereformeerde Kerken in Nederland<br>
  <input type="checkbox" name="bundel" value="marnix">Bundel van Marnix van Sint Aldegonde<br>
  <input type="checkbox" name="bundel" value="bouma">Bundels van Hans Bouma - Liefde (101-140); Zingende (201-259); Zolang (301-327)<br>
  <input type="checkbox" name="bundel" value="jongerius">bundels van Henk Jongerius<br>
  <input type="checkbox" name="bundel" value="plas">Bundels van Michel van der Plas<br>
  <input type="checkbox" name="bundel" value="dnp">De Nieuwe Psalmberijming<br>
  <input type="checkbox" name="bundel" value="datheen">De Psalmberijming van Petrus Datheen<br>
  <input type="checkbox" name="bundel" value="eg1933">Enige gezangen - 1933<br>
  <input type="checkbox" name="bundel" value="el">Evangelische Liedbundel<br>
  <input type="checkbox" name="bundel" value="eva">Eva's lied<br>
  <input type="checkbox" name="bundel" value="gk-gez">Gereformeerd Kerkboek - Gezangen<br>
  <input type="checkbox" name="bundel" value="gk-ps">Gereformeerd Kerkboek - Psalmen<br>
  <input type="checkbox" name="bundel" value="geroepen">Geroepen om te zingen<br>
  <input type="checkbox" name="bundel" value="gvl">Gezangen voor de liturgie<br>
  <input type="checkbox" name="bundel" value="hoop">Hoop van alle volken<br>
  <input type="checkbox" name="bundel" value="iona">Iona<br>
    <td>
  <input type="checkbox" name="bundel" value="jdh">Johannes de Heer<br>
  <input type="checkbox" name="bundel" value="levensliederen">Levensliederen (David Heek en Ren Barkema)<br>
  <input type="checkbox" name="bundel" value="liedboek">Liedboek - zingen en bidden in huis en kerk (<i>in bewerking</i>)<br>
  <input type="checkbox" name="bundel" value="lvdk">Liedboek voor de Kerken<br>
  <input type="checkbox" name="bundel" value="lit-leusden">Liturgie-onderdelen Leusden<br>
  <input type="checkbox" name="bundel" value="opw">Opwekking<br>
  <input type="checkbox" name="bundel" value="ohb">Oude Hervormde Bundel<br>
  <input type="checkbox" name="bundel" value="praise">Praiseliederen<br>
  <input type="checkbox" name="bundel" value="psalmen-1773">Psalmberijming 1773<br>
  <input type="checkbox" name="bundel" value="pvn">Psalmen voor Nu<br>
  <input type="checkbox" name="bundel" value="randstad">Randstadbundel<br>
  <input type="checkbox" name="bundel" value="dienstboek">Teksten uit het Dienstboek<br>
  <input type="checkbox" name="bundel" value="wesley">wesley hymns<br>
  <input type="checkbox" name="bundel" value="wzm">Wie Zingt Mee<br>
  <input type="checkbox" name="bundel" value="zad">Zing alle dagen<br>
  <input type="checkbox" name="bundel" value="zgz">Zingende gezegend<br>
  <input type="checkbox" name="bundel" value="zj">Zingt jubilate<br>
  <input type="checkbox" name="bundel" value="zolang">Zolang er mensen zijn<br>
</table>
  <input type="submit" value="Submit">
</form>
 
PHP hulp

PHP hulp

16/04/2024 12:38:15
 
Eddy E

Eddy E

22/11/2015 14:49:27
Quote Anchor link
Zoiets:
Ik ga er dan van uit dat xml_map/zgz.xml het bestand is voor Zingende Gezegende.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
foreach($_POST['bundel'] as $selected)
 {

 $xml[] = file_get_contents("xml_map/".$selected.".xml");
 }


// maak dit bestand een xml-bestand
header("Content-type: text/xml");
echo "<?xml version='1.0' encoding='UTF-8'?>";
echo implode(PHP_EOL, $xml);


?>




Ps, veel typewerk gehad?
Welke website is/wordt dit? Kan ik dan wel goed gebruiken namelijk ;)
 
Guido van Harten

Guido van Harten

22/11/2015 19:12:34
Quote Anchor link
Dankjewel.
De samen te stellen XML-file bevat in mijn geval een "header" (laat ik het maar zo noemen):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?xml version="1.0" encoding="utf-8"?>
<PresentationsBundles xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Bundles>


Dat dacht ik in bovenstaande code van Eddy (regel 8/9) te "vertalen" naar:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?xml version="1.0" encoding="utf-8"?>\n<PresentationsBundles xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n  <Bundles>\n


Verder moet het totale bestand dan eindigen met:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
  </Bundles>
</PresentationsBundles>


Ik neem aan dat ik dat ook in een echo-regel kan zetten op regel 11?

Kortom, nog best wel wat vragen hoe ik zo'n XML-bestand dan moet opbouwen.

Hoe pak ik dit verder aan?

Vriendelijke groet,
Guido
Gewijzigd op 22/11/2015 19:13:35 door Guido van Harten
 
Eddy E

Eddy E

22/11/2015 19:16:27
Quote Anchor link
Zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
foreach($_POST['bundel'] as $selected)
 {

 $xml[] = file_get_contents("xml_map/".$selected.".xml");
 }


// maak dit bestand een xml-bestand voor de browser + opslaan als.. ==> iets.xml
header("Content-type: text/xml");

// maak bestand XML-codering voor verwerken van browser
echo '<?xml version="1.0" encoding="utf-8"?>
    <PresentationsBundles xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Bundles>'
;

// hier geimporteerde spul
echo implode(PHP_EOL, $xml);

echo '  </Bundles>
</PresentationsBundles>'
;

?>
 
- Ariën  -
Beheerder

- Ariën -

22/11/2015 19:21:01
Quote Anchor link
Met Simplexml heb je meer grip op de opbouw van een XML-bestand.
 
Guido van Harten

Guido van Harten

22/11/2015 20:54:33
Quote Anchor link
Eddy E op 22/11/2015 19:16:27:
Zoiets:

...


Eddy, het is me niet duidelijk wat je bedoelt met de opmerkingen in je scriptje op de regels 7, 10 en 15.

Wat ik nu heb, staat online op http://phphulp.vanharten.net/bundels1.php.

De codes:
bundels1.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<form action="bundels2.xml" method="get">
<table><td>
  <input type="checkbox" name="bundel" value="dnp">De Nieuwe Psalmberijming<br>
  <input type="checkbox" name="bundel" value="lit-leusden">Liturgie-onderdelen Leusden<br>
  <input type="checkbox" name="bundel" value="psalmen-1773">Psalmberijming 1773<br>
</table>
  <input type="submit" value="Submit">
</form>


bundels2.xml:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
foreach($_POST['bundel'] as $selected)
 {

 $xml[] = file_get_contents($selected.".xml");
 }


// maak dit bestand een xml-bestand voor de browser + opslaan als.. ==> iets.xml
header("Content-type: text/xml");

// maak bestand XML-codering voor verwerken van browser
echo '<?xml version="1.0" encoding="utf-8"?>
    <PresentationsBundles xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Bundles>'
;

// hier geimporteerde spul
echo implode(PHP_EOL, $xml);

echo '  </Bundles>
</PresentationsBundles>'
;
?>


Vriendelijke groet,
Guido
 
Martin -

Martin -

22/11/2015 22:34:56
Quote Anchor link
Eddy E op 22/11/2015 19:16:27:
Zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
foreach($_POST['bundel'] as $selected)
 {

 $xml[] = file_get_contents("xml_map/".$selected.".xml");
 }

?>

Kijk nog even goed naar situaties waarbij dit wordt meegestuurd als bundel: ../.htaccess\0
Gewijzigd op 22/11/2015 22:35:36 door Martin -
 
Guido van Harten

Guido van Harten

23/11/2015 09:53:07
Quote Anchor link
Martin, dankjewel, maar deze opmerking is voor mij abacadabra. Is deze opmerking voor mij bestemd of voor een van de personen die reageerden? Kun je je opmerking nader toelichten?

Vriendelijke groet,
Guido
 
Ivo P

Ivo P

23/11/2015 10:05:56
Quote Anchor link
MArtin probeert aan te geven dat een controle op z'n plek is, of de gevraagde bundel wel in de betreffende map staat en er geen poging gedaan wordt om andere files uit te lezen.

Bijvoorbeeld een htaccess file, script of systeem bestand.

met name zou je kunnen controleren of $selected niets anders dan letters of cijfers bevat.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if(preg_match('~^[a-z0-9]+$~i', $selected) {
   $xml[] = ...;
}

?>


of evt. of er geen / in de string staat.
 
Guido van Harten

Guido van Harten

23/11/2015 10:24:43
Quote Anchor link
Ok, duidelijk!
Om het mezelf niet al te moeilijk te maken (het hoeft geen waterdicht programma te worden, als het maar functioneel is), denk ik dat ik de "-" uit de values verwijder (zie eerste posting, regels, 14, 15, 25 en 29).

Vriendelijke groet,
Guido
 
Ivo P

Ivo P

23/11/2015 10:37:20
Quote Anchor link
de - kan op zich geen kwaad. Die zou ook in de regex kunnen.

Belangrijker is dat het niet mogelijk is om een bestand in een andere map op te vragen.

Ofwel omdat je controleert of er geen / of . of andere rariteit in je $selected zit
Ofwel omdat je eerst een lijst ophaalt van de bestanden die je hebt (met glob()) en dan alleen de text toevoegt aan je xml als de betreffende file jou bekend is.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.