• User

    Aggiungere Nodo Xml

    Salve ragazzi, ho provato a cercare, sarà uno dei tanti aiuti strachiesti, ma non riesco a capire come aggiungere un nodo ad un semplice xml.

    Ho provato in questo modo, dividendo i file .php, e richiamandoli all'occorrenza, ma la stringa viene scritta nell'xml in modo sbagliato, non tenendo conto del tag di chiusura dell'xml, non andando a capo, nonostante il "\n" finale.

    Mi aiutate a capire come ragionare?

    [PHP]include("stampa.php");
    $nome = paolo;
    $stringa= "<elemento nome="$nome"></elemento>\n";
    $stampa = stampa($stringa);
    [/PHP]

    [PHP]<?php
    function stampa($stringa){
    if (!$fileXml = fopen("app.000.xml","a")){
    echo "Non posso aprire il file";
    } else {
    fputs($fileXml,$stringa);
    fclose($fileXml);
    }
    }
    ?>[/PHP]


  • User

    Niente, non riesco.
    Utilizzo php4 il Dom non mi va, e non posso avere il simpleXml.

    Io riesco a scrivere, ma non dove dico io! I nodi vengono aggiunti uno sotto l'altro, come deve essere, ma poi non capisco come scrivere il tag di chiusura dell'xml!

    [PHP]<?xml version="1.0" encoding="UTF-8"?>
    <menu>
    <elemento nome="operatoriPhp.png" url="../archivio/operatoriPhp.png" peso="36.51 KB" tipo="png" data="03-07-10" ora="23:08"></elemento>
    <elemento nome="operatoriPhp.png" url="../archivio/operatoriPhp.png" peso="36.51 KB" tipo="png" data="03-07-10" ora="23:08"></elemento>[/PHP]

    Come aggiungo il tag di chiusura ? Sto odiando google! :arrabbiato:

    Mi aiutate? Non so più cosa cercare.


  • User

    Ok, ho attivato il php 5, vediamo se così riesco! 😄


  • User

    Con SimpleXML attivo, riesco a creare uno nuovo child ed aggiungere i vari attributi, il problema è che i vari child, vengono stampati di fila, creando una lunga riga, e non tante righe una sull'altra.

    Con questo codice:

    [PHP]<?php
    $stringa= "<elemento nome="nome" url="cartella/nome" peso="peso" tipo="estensione" data="data" ora="ora"></elemento>\n";

    $xml = simplexml_load_file("simple.xml");

    $nuovoElemento = $xml->addChild("elemento");
    $nuovoElemento->addAttribute("nome", "domenico.jpg");
    $nuovoElemento->addAttribute("url", "../archivio/domenico.jpg");
    $nuovoElemento->addAttribute("peso", "35.01 MB");
    $nuovoElemento->addAttribute("tipo", "jpg");
    $nuovoElemento->addAttribute("ora", "20.00");

    echo "<pre>".htmlentities($xml->asXML())."</pre>";

    $f = fopen("simple.xml", "w");
    fwrite($f, $xml->asXML());
    fclose($f);

    ?>[/PHP]

    Ottengo questo:

    [PHP]<?xml version="1.0"?>
    <menu>
    <elemento peso="35.01 MB" tipo="jpg" ora="20.00"/><elemento nome="domenico.jpg" url="../archivio/domenico.jpg" peso="35.01 MB" tipo="jpg" ora="20.00"/><elemento nome="domenico.jpg" url="../archivio/domenico.jpg" peso="35.01 MB" tipo="jpg" ora="20.00"/><elemento nome="domenico.jpg" url="../archivio/domenico.jpg" peso="35.01 MB" tipo="jpg" ora="20.00"/></menu>[/PHP]

    Evidentemente sbagliato.
    Ma non era più semplice passargli la variabile stringa, in questo caso inutilizzata, invece di fare tutto quel casino?

    Per quanto mi farete parlare da solo a tarda notte? Dai ragazzi aiutatemi! :bho:


  • User

    Ciao, io ho usato questo per aggiungere automaticamente link a un sitemap, forse ti puo aiutare:
    [PHP]function sitemap($link)
    {
    $sitemap_xml = 'sitemap.xml';
    $array_xml = file($sitemap_xml);
    $ultima_linie = array_pop($array_xml);
    $array_xml[] = '<url>'.PHP_EOL.'<loc>'.$link.'</loc>'.PHP_EOL.'</url>'.PHP_EOL;
    $array_xml[] = $ultima_linie;
    file_put_contents($sitemap_xml, implode($array_xml));
    }
    function sitemap_insert($data) {
    $sitemap = 'link';
    $sitemap = str_replace('%20', ' ', $sitemap);
    $sitemap = str_replace('&', '&', $sitemap);
    sitemap($sitemap);
    }[/PHP]
    Come puoi vedere invece di \n ho usato PHP_EOL


  • User

    Ciao, ti ringrazio, ma in questo modo annulli completamente il simpleXml, a me interessa saperlo usare.

    Aiuti?


  • User

    niente???


  • User

    Con questo xml:

    [PHP]<root>
    <elemento nome="foto1.png" url="../archivio/foto1.png"/>
    <elemento nome="foto2.png" url="../archivio/foto2.png"/>
    <elemento nome="foto3.png" url="../archivio/foto3.png"/>
    </root>[/PHP]

    E questo ciclo in php:

    [PHP]<?php

    $url="bad.xml";
    $xml = simplexml_load_file($url);

    foreach ($xml->children() as $child) {
    echo $child["nome"]."<br>";
    echo $child["url"]."<br>";
    }

    ?>[/PHP]

    Ottengo questo:

    [PHP]foto1.png
    ../archivio/foto1.png
    foto2.png
    ../archivio/foto2.png
    foto3.png
    ../archivio/foto3.png [/PHP]

    Quindi riesco a leggere i vari attributi dei child, ma se volessi accedere direttamente ad uno di questi senza bisogno del ciclo, come dovrei fare?

    Chiaritemi le idee su come leggere e scrivere tramite simpleXml, non ci sto capendo nulla! :bho:


  • User

    Penso che il modo giusto è questo.
    w3schools.com/php/func_simplexml_children.asp
    Come l'hai fatto tu sopra, cosa ti cambia se la fai con cicli o senza?


  • User

    ti ringrazio boghy, se l'unico in tanti forum che si degna di rispondermi... cosa diavolo li aprono a fare i forum se poi non vengono seguiti.. bah..

    dici che è quello il modo giusto? Mi sembra strano che non si possa accedere ad un singolo attributo direttamente.. non so più cosa cercare :-S

    nel frattempo è uscito un problema diverso..
    Questo codice mi da un errore, quando inserisco l'addChild in una funzione che passa una variabile (la stringa per l'xml), se lo tolgo dalla funzione e lo uso "sfuso" invece non crea problemi -.-

    [PHP]<?php

    $stringa = "prova stringa";
    $xml = simplexml_load_file("bad.xml");

    function prova($var){
    $nuovoElemento = $xml->addChild($var);

    $f = fopen("bad.xml", "w");
    fwrite($f, $xml->asXML());
    fclose($f);
    }

    prova($stringa);

    ?>[/PHP]

    [PHP]Fatal error: Call to a member function addChild() on a non-object in /web/htdocs/www .miosito.com/home/app/crea.php on line 7 [/PHP]


  • User

    @boghy91 said:

    Penso che il modo giusto è questo.
    w3schools.com/php/func_simplexml_children.asp
    Come l'hai fatto tu sopra, cosa ti cambia se la fai con cicli o senza?

    Primo problema risolto! Mi hanno detto che questo è il modo giusto per richiamare un singolo attributo, magari serve a qualche altro imbranato come me:

    [PHP]$url = $xml->elemento[2]["url"];
    echo $url;[/PHP]