appenchild in parent plaats alle childs in 1 horizontale regel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rene Wennekes

Rene Wennekes

28/02/2013 14:00:10
Quote Anchor link
Als ik via DOM een child toevoeg aan het einde van een xml object (document), is de child mooi getabuleerd. Voeg ik hem echter tot in de juiste parent (zie voorbeeld 1) dan wordt het resultaat in het bestand dat alle childs in 1 horizontale regel komen te staan. Dit vind ik niet mooi. Waarom doet ie het met het 2e voorbeeld wel goed?

<script>
<code>
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
<?php
//Load xml from file
$doc = new DOMDocument();
$doc->load('bestand.xml'); // Bestand in DOM laden
$doc->formatOutput = true;
$doc->preserveWhiteSpace = false;

//Adding data
$doc->getElementsByTagName( "skills" )->item(0)
    ->
appendChild($doc->createElement("skill"))
    ->
appendChild($doc->createElement("skill_description", "Dit is voorbeeld 1"));

$doc->
    ->
appendChild($doc->createElement("skill"))
    ->
appendChild($doc->createElement("skill_description", "Dit is voorbeeld 2"));
?>

</code>
</script>

Qua werking functioneert het script wel.
Wie o wie heeft de oplossing? Bvd.
 
PHP hulp

PHP hulp

03/08/2020 11:15:51
 
Ward van der Put
Moderator

Ward van der Put

28/02/2013 14:09:12
Quote Anchor link
Niet getest, maar ik zie een public bool $formatOutput in de class DOMDocument met de belofte: "Nicely formats output with indentation and extra space."
 
Wouter J

Wouter J

28/02/2013 14:10:19
Quote Anchor link
Ward, en die belofte werkt dus niet wat dat gebruik de TS al (regel 5).

TS, ik ben bang dat je die formatOutput en preservceWhiteSpace op elke child opnieuw moet instellen...
 
Rene Wennekes

Rene Wennekes

28/02/2013 14:20:38
Quote Anchor link
Oh? Ben ik niet tegengekomen op php.net

Maar qua logica, waarom werkt het 2e voorbeeld wel?

Dan zou ie het bij voorbeel 1 toch ook niet moeten doen?

Ff voor de duidelijkheid
Voorbeeld 2 wordt zoiets als
</eindexmlroot>
<skill>
<skill_description>Dit is een test</skill_description>
</skill>
------------
Maar ja niet leuk als een child buiten de root staat.
------------
En voorbeeld 1 wordt zoiets als

<skills>
.
.
<skill><skill_description>voorbeeld</skill_description></skill><skill><skill_description>voorbeeld</skill_description></skill><skill><skill_description>voorbeeld</skill_description></skill></skills>
.
..
</eindexmlroot>

Maar dan 1 lange regel mocht het niet duidelijk overkomen hier.
 
Jan Koehoorn

Jan Koehoorn

28/02/2013 15:29:52
Quote Anchor link
In voorbeeld 2 heb je dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$doc->
    ->appendChild

Lijkt me sterk dat dat goed werkt?
 
Rene Wennekes

Rene Wennekes

28/02/2013 15:36:29
Quote Anchor link
Klopt goed gezien regel 13 heeft geen pijltje.

Even wegdenken dan functioneert het wel
 
Jan Koehoorn

Jan Koehoorn

28/02/2013 16:17:17
Quote Anchor link
Als ik het zo doe, lijkt het te werken:
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
<?php
    error_reporting ( E_ALL );

    $doc = new DOMDocument ( );
    $doc -> formatOutput = true;
    $doc -> preserveWhiteSpace = false;

    $skills = $doc -> createElement ( 'skills' );
    $skills -> appendChild ( $doc -> createElement ( 'skill' ) ) -> appendChild ( $doc -> createElement ( 'skill_description', 'Dit is voorbeeld 1' ) );
    $skills -> appendChild ( $doc -> createElement ( 'skill' ) ) -> appendChild ( $doc -> createElement ( 'skill_description', 'Dit is voorbeeld 2' ) );
    $skills -> appendChild ( $doc -> createElement ( 'skill' ) ) -> appendChild ( $doc -> createElement ( 'skill_description', 'Dit is voorbeeld 3' ) );
    $doc -> appendChild ( $skills );

    $doc -> save ( 'bestand.xml' );
?>
 
Rene Wennekes

Rene Wennekes

28/02/2013 16:58:18
Quote Anchor link
Dat werkt inderdaad net als bij mij voorbeeld2.

Alleen echter komt deze helemaal aan het einde van de xml te staan.

Ik wou hem echter nesten in de <skills> tag.
En dat lukt me wel met die
->getElementsByTagName( "skills" )->item(0)
er tussen.
Alleen krijg ik dan die lange horizontale regel wat ik zo vreemd vind.

Hoe kan ik de toegevoegde data nesten in de juiste tags?
 
Wouter J

Wouter J

28/02/2013 17:25:48
Quote Anchor link
Wat als je nou SimpleXml en DomDocument combineert (heb dat ooit gedaan en werkte perfect):
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
$xml
= new \SimpleXmlElement('bestand.xml', 0, true);

$skills = $xml->skills;
$skills->addChild('skill')->addChild('skill_description', 'Dit is voorbeeld 1');

$doc = new \DomDocument();
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->loadXML($xml->asXML());

echo $dom->saveXML();
?>


Offtopic:
een <skill_description> in je <skill> met alleen een value is niet zo mooi in XML. Alles wat alleen een value bevat wordt als attribuut mee gegeven en iets als een array als element. Tevens hoor je ipv _ een - in XML te gebruiken, dus <skill-description>
 



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.