Visualizzazione risultati 1 fino 13 di 13

Discussione: [PHP] Gestire file XML con xpath o altro!

  1. #1
    Guest

    Post [PHP] Gestire file XML con xpath o altro!

    Ciao a tutti, facendo una ricerca su internet ho letto che posso gestire un file XML con xpath... io dovrei gestirlo totalmente quindi da eliminare una sezione ad aggiungerla o modificarla e visualizzarla!! Questo è il mio file .xml (molto semplice):
    Codice PHP:
    <?xml version="1.0" ?>

    <pages>
    <page id="1">
    <title><![CDATA[Titoloooo]]></title>
    <text><![CDATA[textttttttttttt]]></text>
    </page>

    <page id="2">
    <title><![CDATA[Titoloooo]]></title>
    <text><![CDATA[textttttttttttt]]></text>
    </page>

    <page id="3">
    <title><![CDATA[Titoloooo]]></title>
    <text><![CDATA[textttttttttttt]]></text>
    </page>

    <page id="4">
    <title><![CDATA[Titoloooo]]></title>
    <text><![CDATA[textttttttttttt]]></text>
    </page>
    </pages>
    Bene, adesso dovrei gestirlo con PHP. Come posso fare??
    Ho provato questo per visualizzare il contenuto di una determinata sezione (page=1) ma non funziona... tutto bianco!!
    Codice PHP:
    if($_GET["page"]) {

    $get = trim(htmlspecialchars($_GET["page"]));

    $file = new SimpleXMLElement("altro/page.xml",NULL,TRUE);

    $title = $file->xpath("/pages/page[id='{$get}']/title");
    print_r($title);

    }
    Sapete aiutarmi? Ve ne sarei grato.... Grazie mille!! =)

  2. #2
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    vai su questa pagina , trovi il manuale:
    http://php.net/manual/en/simplexmlelement.xpath.php

    dovresti fare una cosa del genere:

    Codice PHP:
    <?php

    $xmlStr
    = file_get_contents('data/books.xml');
    $xml = new SimpleXMLElement($xmlStr);
    // seach records by tag value:
    // find all book records with price higher than 40$
    $res = $xml->xpath("book/price[.>'40']/parent::*");
    print_r($res);

    ?>
    Codice:
    ....
       <book id="bk101">
          <author>Gambardella, Matthew</author>
          <title>XML Developer's Guide</title>
          <genre>Computer</genre>
          <price>44.95</price>
       </book>
       <book id="bk102">
          <author>Ralls, Kim</author>
          <title>Midnight Rain</title>
          <genre>Fantasy</genre>
          <price>5.95</price>
       </book>
    ...


    ovviamente sostituisci il file .xml con il tuo e xpath con il tuo....prova
    Ultima modifica di EuroSalute : 27-10-2010 alle ore 15.23.01 Motivo: più info
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  3. #3
    Guest

    Predefinito

    Non è quello che cerco mi dispiace... avevo già letto quella e tante altre pagine sulla guida di PHP xD
    Ma non ho trovato quello che cerco ecco perché sono qui! =)
    ... se avessi letto attentamente stai tranquillo che avresti compreso di sicuro! =D

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Sbagli in partenza.
    Per selezionare in base a un attributo si usa @ davanti al nome dell'attributo: [@id=3]

    Poi devi considerare il fatto che usi CDATA, Xpath ignora ogni suo contenuto e quindi dal costruttore devi impostare l'opzione LIBXML_NOCDATA:

    Codice PHP:
    if($_GET["page"]) {

    $get = (int) $_GET["page"]; // se non è un numero vale 0

    $file = new SimpleXMLElement("altro/page.xml",LIBXML_NOCDATA,TRUE);

    $r = $file->xpath("/pages/page[@id=$get]/title");
    $title = $r[0][0];
    echo
    $title;
    }

  5. #5
    Guest

    Predefinito

    Mmm ok perfetto... adesso però mi servirebbe un codice per limitare i feed!
    Ho provato con questo (ciclo for)... ma non funziona!
    In pratica mostra solo la data.... né titolo né testo!
    Codice PHP:
    $file = new SimpleXMLElement("altro/post.xml",LIBXML_NOCDATA,TRUE);
    $post = $file->xpath("/posts");

    for(
    $i=0;$i<3;$i++) {
    $time = date("d-m-Y H.i a",strftime($post[0]->time));

    echo
    "<h1>{$post[0]->title} <sup>{$time}</sup></h1>\n";
    echo
    "<p>{$post[0]->text}</p>\n";
    }
    Grazie mille!!
    Ultima modifica di sIM : 27-10-2010 alle ore 23.29.17

  6. #6
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Fai un print_r di $post e noterai che:
    Codice:
    Array
    (
        [0] => SimpleXMLElement Object
            (
                [posts] => Array
                    (
                        [0] => primo elemento <posts> e tutti i suoi figli e attributi
                        [1] => secondo elemento <posts> e ""
                    )
            )
    )
    Quindi devi accedere prima a $post['posts'] e successivamente estrarre un elemento per volta:
    Codice PHP:
    $file = new SimpleXMLElement("altro/post.xml",LIBXML_NOCDATA,TRUE);
    $results = $file->xpath("/posts");
    $posts = $results['posts'];


    for(
    $i = 0; $i < 3; $i++) {
    $post = $posts[$i];
    $time = date("d-m-Y H.i a",strftime($post->time));

    echo
    "<h1>{$post->title} <sup>$time</sup></h1>\n";
    echo
    "<p>{$post->text}</p>\n";
    }

  7. #7
    Guest

    Predefinito

    Ok... Grazie mille! =) Adesso mi servirebbe un metodo per fare queste cose:
    - Ordinare gli articoli in base al mese
    - Ordinare i post in ordine decrescente
    - Prelevare il singolo ID ---> RISOLTO!!
    Sono riuscito a fare solo la "base"... ma gli ID non riesco a tirarli fuori né mi viene in mente come ordinarli. Grazie mille!!
    Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: xmlXPathEval: evaluation failed on line 38
    Codice PHP:
    $file = new SimpleXMLElement("altro/post.xml",LIBXML_NOCDATA,TRUE);
    $xpath = $file->xpath("/posts");

    echo
    "<h1>Archivio</h1>\n";
    echo
    "<ul>\n";
    foreach(
    $xpath[0]->post as $post) {
    $time = date("d-m-Y",strftime($post->time));
    echo
    "<li>[{$time}] <a href=\"?post={$post[id]}\">{$post->title}</a></li>\n";
    }
    echo
    "</ul>\n";
    Risolto l'ultimo problema =)... il resto nisba!
    Ultima modifica di sIM : 28-10-2010 alle ore 16.16.17

  8. #8
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Per ordinarli in ordine decresente potresti invertire l'array $xpath[0]->post se nel file xml i posts si trovano in ordine ascendente.

    Per ordinarli in base al mese devi pensarci tu. Puoi estrarli tutti, creare un array vuoto o con gli indici dei mesi, controlli il mese del post e inserisci nell'array il post: $array[$mese][] = $post .
    Dipende da come salvi la data nel file xml.
    Ultima modifica di javascripter : 28-10-2010 alle ore 17.34.51

  9. #9
    Guest

    Predefinito

    Mmm... allora arsort non riesco a farlo funzionare... lo metto in una variabile e poi dopo foreach lo richiamo ovvero foreach($posts....). Poi riguardo ai mesi... dovrei fare così?
    Codice PHP:
    $single = ""; foreach($all as $single) { $single[$single->time] = $single; }
    Così che vengano inseriti $single["id"], $single->text e $single->title... giusto??
    La struttura è <post id="x"><title><time><text>, Grazie mille!!!

  10. #10
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Ma il campo <time> che cosa contiene effettivamente? Il timestamp ?

  11. #11
    Guest

    Predefinito

    Esattamente, generato con time() :)

  12. #12
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Bene, allora puoi fare:

    Codice PHP:
    $array = array();

    foreach(
    $xpath[0]->posts as $post) {
    $array[$post->time] = $post;
    }

    ksort($array); // ora in $array, i posts sono ordinati per la data in ordine crescente
    $array = array_reverse($array, true); // ora in ordine decrescente

  13. #13
    Guest

    Predefinito

    Mmm ... ok però non ho ben capito poi come far creare il mese con l'anno in automatico a PHP.
    Se faccio il foreach lo ripeterà per tutti gli articoli, invece dovrebbe farlo per uno solo....
    Codice PHP:
    $file = new SimpleXMLElement("altro/post.xml",LIBXML_NOCDATA,TRUE);
    $xpath = $file->xpath("/posts");

    $archive = array();

    echo
    "<h1>Archivio</h1>\n\n";
    echo
    "\t\t\t<ul>\n";

    foreach(
    $xpath[0]->post as $single) { $archive[$single->time] = $single; }

    ksort($archive);
    $archive = array_reverse($archive,true);

    foreach(
    $xpath[0]->post as $post) {
    $post = arsort($post["id"]);
    $time = date("d-m-Y",strftime($post->time));

    echo
    "\t\t\t\t<li>[{$time}] <a href=\"?post={$post[id]}\">{$post->title}</a></li>\n";
    }

    echo
    "\t\t\t</ul>\n";

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •