Gå til innhold

IronWire

Medlemmer
  • Innlegg

    235
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av IronWire

  1. Den PHP-koden virket ikke helt riktig heller.

    Hentet ut denne koden bra manualen og endret litt:

    <?php
    
    // Load the XML source
    $xml = new DOMDocument;
    $xml->load('articles.xml');
    
    $xsl = new DOMDocument;
    $xsl->load('articles-rss.xsl');
    
    // Configure the transformer
    $proc = new XSLTProcessor;
    $proc->importStyleSheet($xsl); // attach the xsl rules
    
    echo $proc->transformToXML($xml);
    ?>
    

     

    Så ikke noen feil i XSL'n i farta, men jeg kan jo ha oversett noe, selv om jeg er ganske sikker på at PHP da ville spyttet ut masse feilmeldinger.

    Det du kan gjøre er å putte inn "<?xml-stylesheet type="text/xsl" href="articles-rss.xsl"?>" i toppen av XML-fila (etter <?xml version="1.0" ...?>)

    Også åpner du fila i nettleseren din, da skal du få fram resultatet av XSL-transformasjonen.

     

    Angående RSS-versjoner så er 0.97 sikkert gammelt og jeg brukte det mest fordi det var det første eksempelet jeg fant, men det er fullt brukandes, hvertfall så lenge man ikke trenger mer funksjonalitet (jeg vet ikke forskjellen mellom 0.97, 1.0 og 2.0).

    Så at du hadde prøvd å skrive om til RDF, noe som ikke er en ny RSS-versjon men en ganske annen teknologi.

    7348958[/snapback]

     

    Ok, her er det noe som ikke er riktig på min side..

     

    Jeg har nå prøvd å bruke EditiX til å transformere articles.xml med articles.xsl til feed.rss og det funker fint. Feedet validerer til og med!

     

    Men, når jeg prøver å få til denne transformeringen med php, får jeg bare en helt hvit side... Konklusjoen må vel da være at feilen ligger enten i php koden, eller i php innstalasjonen min, men jeg får altså den samme feilen både med MAMP og på en server...

     

    Jeg har både prøvd din kode og andre...

  2. Den smarteste måten er nok å lage en XSL fil for å transformere XML-datafilen til RSS.

    Da trengs det bare 3-4 linjer med PHP-kode.

    XSL kan du lese om på W3schools.com, dette er en veldig smart teknologi som er på full fart inn i alle områder innenfor programvare og er bare å lære seg først som sist.

    Kort fortalt brukes den til å transformere et XML-format til annet format, normalt XML-basert format, men du kan også bruke det til å lage PDF av artiklene dine,

    7344015[/snapback]

     

    XSLT er vanskelige greier... Jeg hadde tenkt å bruke rss 1.0, da jeg hører at 0.9 er ganske utdatert. For å gjøre jobben enda litt vanskeligere tenkte jeg også å bruke dublin core. :hmm:

     

    Jeg så på xslt eksempelet ditt, og prøvde å utvide dette til å passe mine behov, men det var lettere sagt en gjort.

     

    Så her har du ne å bryne deg på... :p

    Klikk for å se/fjerne innholdet nedenfor
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
    <rdf:RDF  
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns="http://purl.org/rss/1.0/"
    >
    <channel rdf:about="http://huin.uib.no/~rsa057/cms/index.php?feed=rss10">
       <title>WriteRoom</title>
       <link>http://huin.uib.no/~rsa057/cms/</link>
       <description>a cms demonstration...</description>
       <dc:publisher>Institutt for humansistisk informatikk</dc:publisher>
       <dc:creator>Robin Sandborg</dc:creator>
       <dc:rights>Copyright © 2006 Robin Sandborg.</dc:rights>
       <dc:date>2006-11-20T12:00+00:00</dc:date>
    
       <items>
         <rdf:Seq>
           <rdf:li resource="http://huin.uib.no/~rsa057/cms/logo.gif" />
         </rdf:Seq>
       </items>
     </channel>
    
      <xsl:for-each select="//article">
     <item rdf:about="http://huin.uib.no/~rsa057/cms/index.php">
       <title><xsl:value-of select="title"/></title> 
       <link>http://huin.uib.no/~rsa057/cms/index.php</link>
       <dc:description>
         A WR article... this really should be dynamic!
       </dc:description>
       <dc:publisher>Institutt for humansistisk informatikk</dc:publisher>
       <dc:creator><xsl:value-of select="author"/></dc:creator>
       <dc:rights>Copyright © 2006 Robin Sandborg.</dc:rights>
       <dc:date>2006-11-20T12:00+00:00</dc:date>
     </item>
      </xsl:for-each>
    
    </rdf:RDF>
    </xsl:template>
    </xsl:stylesheet>
    

     

    XSLT modulen for php er litt mer fortåelig, men siden jeg ikke får dette helt til viser jeg koden jeg bruker for å transformere:

     

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

     

    function transRSS() {

    global $xml;

    $dom = dom_import_simplexml($xml);

    $xsl = new DomDocument();

    $xsl->load("articles.xsl");

    $proc = new XsltProcessor();

    $xsl = $proc->importStylesheet($xsl);

    $proc->setParameter(null, "articles", "Articles");

     

    $newdom = $proc->transformToDoc($dom);

    print $newdom->saveXML();

    }

     

    Når jeg kjører dette får jeg bare en helt tom side, noe som ser ut til å tyde på at det er i xslt dokumentet det er noe galt...

  3. Har du elementer med samme navnet i samme parentnode så vil disse kunne  skilles fra hverandre på den måten at SimpleXMLElement har alle elementene i en array. Det første elementet blir nr 0 og neste blir nummer 1 osv osv.

     

    <articles>

      <article></article> == $simplexml->articles->article[0]

      <article></article> == $simplexml->articles->article[1]

      <article></article> == $simplexml->articles->article[2]

    </articles>

    7325940[/snapback]

     

    Ja, det er slik jeg også har forstått det, og det fungerer utmerket når jeg skal hente ut informasjon.

     

    $file = "innlegg/articles.xml";
    $xml = simplexml_load_file($file) or die ("Unable to load data!"); 
    
    $article = $xml->addChild('article');
    $article->addAttribute('id', $id);
    $article->addAttribute('published', $published);
    $article->addChild('pubdate', $date);
    $article->addChild('title', $title);
    $article->addChild('author', $author);
    $article->addChild('category', $category);
    $article->addChild('content', $content);
    
    file_put_contents($file, $xml->asXML());
    

     

    Har prøvd med den nullen en del steder her, og det funker ikke...

  4. Kanskje enklere å bruke SimpleXML?

    http://no.php.net/manual/en/ref.simplexml.php - Ta en titt på eksempel 8.

    7302372[/snapback]

     

    Det var en hel del lettere å forholde seg til!

    Nå kan jeg skrive velformet xml! :yes:

     

    Men jeg klarer fortsatt ikke å få den til å legge nye article elementer over gamle... Ser at de har brukt noe [0] greier i manualen du linket til, men dette får jeg ikke til. Vet ikke om det er riktig fremgangsmåte engang...

  5. Takk for hjelpen!

     

    Jeg har fått til å vise de to siste, og å søke i xmlen.

     

    Et problem jeg har hatt en stund nå, som det begynner å bli på høy tid å fikse er å skrive xml.

     

    Jeg har fått til å sende data fra et skjema inn i et php dokument som skriver xml. Xmlen er noenlunde riktig, men tingen er at hver <article> skal være inni en <articles> som omfatter alt.

     

    Når jeg nå skriver nye innlegg omfattes hver <article> av sin egen <articles>, noe som selvfølgelig ikke er riktig. Det jeg vil er å putte inn hver nye article på toppen, under <articles> elementet slik at de nyeste posetne alltid er øverst i dokumentet.

     

    Jeg bruker DOMDocument(); til å skrive xml.

    Så, jeg spør en gang til om hjelp :blush:

     

    Her er koden hvis det gjør ting enklere:

    Klikk for å se/fjerne innholdet nedenfor
    $articles = array();
    $articles[] = array(
    'published' => $_POST['published'],
    'title' => $_POST['title'],
    'author' => $_POST['author'],
    'content' => $_POST['content']
    );
    
    $dom = new DOMDocument();
    $dom->formatOutput = true;
    $dom->load("innlegg/articles.xml");
    $r = $dom->createElement("articles");
    $dom->appendChild( $r );
     
    foreach( $articles as $article ) {
     $b = $dom->createElement( "article" );
    
     $published = $dom->createElement( "published" );
     $published->appendChild(
     $dom->createTextNode( $article['published'] )
     );
     $b->appendChild( $published );
    
     $title = $dom->createElement( "title" );
     $title->appendChild(
     $dom->createTextNode( $article['title'] )
     );
     $b->appendChild( $title );
    
     $author = $dom->createElement( "author" );
     $author->appendChild(
     $dom->createTextNode( $article['author'] )
     );
     $b->appendChild( $author );
      
     $content = $dom->createElement( "content" );
     $content->appendChild(
     $dom->createTextNode( $article['content'] )
     );
     $b->appendChild( $content ); 
     
     $r->appendChild( $b );
    }
    echo $dom->saveXML;
    $dom->save("innlegg/articles.xml");
     header("Location: admin.php");
    

  6. Ellers kan du bruke denne for å hente ut de 2 siste fra en spesifikk kategori

    //article[category=test][position() >= last() - 1]

    7289703[/snapback]

     

    Tusen takk for hjelpen!

     

    Jeg forstår ikke helt bruken av article variabelen.

    Hvis jeg prøver echo $article[category=test][position() >= last() - 1]; får jeg en feilmelding om Parse error: parse error, unexpected '=', expecting ']'.

     

    Fikk det forøvrig til tilslutt med

    global $xml;
    $categorytext = $xml->xpath("/articles/article[category='" . $category ."']");
    
    $usedcategory = 1;
     foreach($categorytext as $text) {
       if($usedcategory <= 2) { 
         echo "<p>";
         echo $text->title . "<br/>";
         echo $text->category . "<br/>";
         echo $text->author . "<br/>";
         echo $text->pubdate . "<br/>";
         echo $text->content . "<br/>";
         echo "</p>";
         $usedcategory++;
       }  
     }
    

     

    Men din løsning var utrolig mye mer elegant! Synd jeg ikke kan nok til å bruke den :p Hva er det jeg gjør feil?

  7. Jeg bare fortsetter med progresjoenen min jeg, så kanskje noen lærer noe nytt eller ser en løsning jeg ikke ser :-)

     

    Nå har jeg klart å lage en funksjon som sender et kategorinavn til en annen funksjon.

     

    xml = simplexml_load_file("innlegg/artikler.xml");
    $article = $xml->xpath("/articles/article[published='true']");
    
    function getCategories() {
     global $article;
     $categories = array();
     
     foreach ($article as $content) {
     $categories[] = $content->category;
     }
     $categories = array_unique($categories); sort($categories);
     foreach ($categories as $category) {
       showLastTwo($category);
     }
    }
    
    
    
    function showLastTwo($category) {
    global $xml;
    global $article;
    
    for ($i=0;$i<2;$i++) {
    
    //Her er det store problemet!
    
    }
    }
    

     

    Det jeg nå må gjøre er å hente ut diverse elementer fra kategorien $category i xml.

     

    Vanligvis kunne jeg vel klart dette med xpath("/articles/article[category=$category]"); Men det får jeg altså ikke til... Sikkert bare jeg som er dum og/eller har sett meg helt blind på dette :p

  8. XML er en veldig spennende ting å bruke synes jeg, så lenge man ikke sitter på tusenvis/millioner av innlegg etc så kan man klare seg uten kraften til en databaseserver.

    Særlig det å bruke XSL på brukersiden ser veldig spennende ut. Støtten for det er jo også overraskende god i nettleserene.

    På PHP-siden bør du sjekke ut disse modulene: XMLWriter/XMLReader, XSL, XSLT og SimpleXML

     

    Har du ikke pløyd gjennom XML-guidene på w3schools.com så er bare å gjøre det.

    7285225[/snapback]

     

    Ja, det er ganske spennende, men ganske frustrerende og!

     

    Jeg har sett på de fleste løsningene jeg har kommet over, og funnet ut at xpath er ganske kraftig og enkel (i forhold til de andre iallefall). Likevel er det ikke lett å få til..

     

    Jeg klarer fint å hente ut navnet på kategoriene slik:

     $xml = simplexml_load_file("innlegg/artikler.xml");
     $article = $xml->xpath("/articles/article[published='true']");
    
    Og jeg kan da for eksempel få ut kategorinavn med:
    
     foreach ($article as $content) {
       echo $content->category;
     }
    
    (echo er selvølgelig ikke det jeg vil bruke her)
    

     

    Kanskje noen andre enn meg har lært litt om xml og php av det?

     

    Xpath tar altså nivåer av xml dokumentet som argument... Xmlen min er strukturert slik:

     

    <articles>
     <article>
       <published>true</published>
       <id>1</id>
       <pubdate>2006:12:11:225232</pubdate>
       <title>aaa</title>
       <author>robin</author>
       <category>test</category>
       <content>
         First line of initial text.
         Second line of initial text.
       </content>
     </article>
    </articles>
    

     

    Så kommer den store utfordringen som jeg har slitt med i en del timer etterhvert... :no:

     

    Hvordan skal jeg klare å få ut de to siste fra hver kategori?

  9. Vanskelige greier det der med damer :p

     

    Problemet jeg stadig støter på er balansegangen mellom å vise dem at man bryr seg og kanskje vil noe mer uten å vise alle kortene og hva man prøver å oppnå...

     

    Uff, livet mitt er mer komplisert på den fronten enn det har vært på lenge... Damen og jeg holder på å slå opp, noe som er litt problematisk når man har bodd sammen en stund og ikke er sikker nok til å ta med seg alle tingene og flytte.

     

    Samtidig har jeg selvfølgelig klart å rote meg opp i en jente som er usannsynlig uklar på hva hun vil nå som jeg er en "fri mann".

×
×
  • Opprett ny...