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:

<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>
Zoiets:
Ik ga er dan van uit dat xml_map/zgz.xml het bestand is voor Zingende Gezegende.

<?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 ;)
Dankjewel.
De samen te stellen XML-file bevat in mijn geval een "header" (laat ik het maar zo noemen):

<?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:

<?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:

  </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
Zoiets:


<?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>';

?>
Met Simplexml heb je meer grip op de opbouw van een XML-bestand.
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
<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:
<?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
Eddy E op 22/11/2015 19:16:27

Zoiets:


<?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
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
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.
<?php
if(preg_match('~^[a-z0-9]+$~i', $selected) {
$xml[] = ...;
}
?>

of evt. of er geen / in de string staat.
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
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.

Reageren