Problem bei Ausgabe von XML über PHP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem bei Ausgabe von XML über PHP

    Hallo zusammen,

    ich bin noch ziemlich neu auf dem Gebiet PHP und muss für ne Klausur folgende Übungsaufgabe lösen:

    Wir sollen eine XML-Datei mit verschiedenen Autodaten anlegen.
    Die hab ich auch schon erstellt (siehe unten).
    Nun sollen mitteln PHP erst alle Maseratis rausgefiltert werden und deren Daten zeilenweise innerhalb einer Tabelle ausgegeben werden.
    Jeder Maserati hat dann einen eigenen Link. Wenn man auf diesen Link klickt sollen nur noch die Daten dieses Maseratis ausgegeben werden. Diese Daten sollen dann auf einer neuen Seite (also die Gesamtübersicht soll verschwinden) in einem vertikalen Tabellenlayout angezeigt werden.

    Das hab ich mittels XML, XSL und JavaScript jetzt so gelöst:

    XML-Code:

    Code:
    <?xml version="1.0"?>
    <?xml-stylesheet href="autos_xsl.xsl" type="text/xsl" ?>
    
    <autos>
    	<auto>
    		<marke xml:link="simple" naechster="Maserati" href="mas1.xml">Maserati</marke>
    		<modell>Biturbo Coupé</modell>
    		<foto quelle="Maserati1.jpg"></foto>
    		<foto2 quelle="Maserati1_gross.jpg"></foto2>
    		<preis>EUR 1.111</preis>
    		<adresse>
    			<name>Helmut Müller</name>
    			<strasse>Schustereck 5</strasse>
    			<plz>66709</plz>
    			<ort>Rappweiler</ort>	
    		</adresse>
    		<ps>75</ps>
    		<EZ>06/1984</EZ>
    		<art>Coupé</art>
    		<farbe>schwarz</farbe>
    		<kilometer>100.000km</kilometer>
    		<extras>keine</extras>
    		<kraftstoff>Benzin</kraftstoff>
    		<getriebe>Automatik</getriebe>
    	</auto>
    	
    	<auto>
    		<marke xml:link="simple" naechster="Audi" href="audi.xml">Audi</marke>
    		<modell>Audi A8</modell>
    		<foto quelle="Audi.jpg"></foto>
    		<foto2 quelle="Audi_gross.jpg"></foto2>
    		<preis>EUR 12.000</preis>
    		<adresse>
    			<name>Donald Duck</name>
    			<strasse>Feldweg 3</strasse>
    			<plz>54621</plz>
    			<ort>Entenhausen</ort>	
    		</adresse>
    		<ps>125</ps>		
    		<EZ>10/2001</EZ>
    		<art>4-Türer</art>
    		<farbe>silber</farbe>
    		<kilometer>40.000km</kilometer>
    		<extras>Klimaanlage
    			 <extra>Automatik</extra>
    			 <extra>Nebelscheinwerfer</extra>
    			 <extra>Sitzheizung</extra>
    		</extras>
    		<kraftstoff>Benzin</kraftstoff>
    		<getriebe>Handschaltung</getriebe>
    	</auto>
    	
    	<auto>
    		<marke xml:link="simple" naechster="Maserati" href="mas2.xml">Maserati</marke>
    		<modell>Maserati Sportswagon</modell>
    		<foto quelle="Maserati2.jpg"></foto>	
    		<foto2 quelle="Maserati2_gross.jpg"></foto2>	
    		<preis>EUR 87.000</preis>
    		<adresse>
    			<name>Fred Feuerstein</name>
    			<strasse>Steinbruch 5</strasse>
    			<plz>66679</plz>
    			<ort>Losheim am See</ort>	
    		</adresse>
    		<ps>340</ps>
    		<EZ>05/2005</EZ>
    		<art>Cabrio</art>
    		<farbe>blau</farbe>
    		<kilometer>25.000km</kilometer>
    		<extras>Klimaanlage
    			 <extra>Automatik</extra>
    			 <extra>Nebelscheinwerfer</extra>
    			 <extra>Sitzheizung</extra>
    			 <extra>Ledersitze</extra>
    		</extras>
    		<kraftstoff>Benzin</kraftstoff>
    		<getriebe>Handschaltung</getriebe>
    	</auto>
    </autos>
    XSL-Code:

    [code]<?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="markenauswahl" match="auto" use="marke" />
    <xsl:template match="/">
    <html>
    <head>
    <title>Autoliste</title>

    <style type="text/css">
    .einzeln { display:none; }
    .markentabelle { display:none; }

    th
    {
    background-color: #B4CEA7;
    }

    .spalte
    {
    background-color: #B4CEA7;
    font-weight: bold;
    width=140;
    }

    .daten
    {
    background-color: #F7F9C1;
    width=100;
    }

    </style>

    <script type="text/javascript">
    var arrAutos = new Array(<xsl:apply-templates select="autos" mode="jsarray" />);
    var arrAutosTabelle = new Array(<xsl:apply-templates select="autos" mode="markejsarray" />);

    <![CDATA[
    function displayLayer(strID)
    {
    document.getElementById(strID).style.display = "block";
    }

    function hideLayer(strID)
    {
    document.getElementById(strID).style.display = "none";
    }

    function showAuto(strArrayName, strID)
    {
    for(i=0; eval("i<= " + strArrayName + ".length-1"); i++)
    {
    if(eval(strArrayName + "[i] != strID"))
    {
    hideLayer(eval(strArrayName + "[i]"));
    }
    else
    displayLayer(strID);
    }
    }

    function hideSingleAutos() {
    for(i=0; i<=arrAutos.length-1; i++) {
    hideLayer(arrAutos[i]);
    }
    }
    ]]>
    </script>
    </head>
    <body>

    <form action="#">
    <select onchange="showAuto('arrAutosTabelle', this.form.markenauswahl.options[this.form.markenauswahl.selectedIndex].value); hideSingleAutos();" name="markenauswahl">
    <option>Wählen Sie eine Marke</option>
    <xsl:for-each select="autos/auto[generate-id() = generate-id(key('markenauswahl', marke)[1])]">
    <xsl:sort select="marke" />
    <option value="marke_{generate-id()}"><xsl:value-of select="marke" /></option>
    </xsl:for-each>
    </select>
    </form>

    <xsl:apply-templates select="autos" mode="alle" />
    <xsl:apply-templates select="autos" mode="einzeln" />
    </body>
    </html>
    </xsl:template>

    <xsl:template match="autos" mode="alle">
    <xsl:for-each select="auto[generate-id() = generate-id(key('markenauswahl', marke)[1])]">
    <xsl:variable name="strLayerID" select="generate-id()" />
    <xsl:variable name="automarke" select="marke" />
    <div id="marke_{generate-id(.)}" class="markentabelle">
    <h1>Autoliste</h1>
    <p/>
    <table border="1">
    <tr>
    <th>Nr.</th>
    <th>Foto</th>
    <th>Marke</th>
    <th>Modell</th>
    <th>Preis</th>
    <th>Adresse</th>
    <th>PS</th>
    <th>Erstzulassung</th>
    <th>Bauart</th>
    <th>Farbe</th>
    <th>Kilometerleistung</th>
    <th>Extras</th>
    </tr>
    <xsl:apply-templates select="key('markenauswahl', $automarke)" mode="alle">
    <xsl:with-param name="strLayerID" select="$strLayerID" />
    </xsl:apply-templates>
    </table>
    </div>
    </xsl:for-each>
    </xsl:template>

    <xsl:template match="auto" mode="alle">
    <xslaram name="strLayerID" />
    <xsl:variable name="ID" select="generate-id(.)" />
    <tr>
    <td>
    <xsl:number format="1"/>
    </td>
    <td>
    <xsl:apply-templates select="foto"/>
    </td>
    <td align="center" width="90">
    <a href="#" onclick="hideLayer('marke_{$strLayerID}');showAuto('arrAutos', '{$ID}');"><xsl:value-of select="marke" /></a>
    </td>
    <xsl:apply-templates select="modell | preis" mode="alle"/>
    <xsl:apply-templates select="adresse" mode="alle"/>
    <xsl:apply-templates select="ps | EZ | art | farbe | kilometer | extras" mode="alle"/>
    </tr>
    </xsl:template>

  • #2
    Fortsetzung:

    <xsl:template match="foto">
    <img align="left">
    <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>
    </img>
    </xsl:template>

    <xsl:template match="foto2">
    <img align="center">
    <xsl:attribute name="src"><xsl:value-of select="@quelle"/></xsl:attribute>
    </img>
    </xsl:template>

    <xsl:template match="modell | preis" mode="alle">
    <td>
    <xsl:value-of select="."/>
    </td>
    </xsl:template>

    <xsl:template match="adresse" mode="alle">
    <td>
    <xsl:value-of select="plz"/><br></br>
    <xsl:value-of select="ort"/>
    </td>
    </xsl:template>

    <xsl:template match="ps | EZ | art | farbe | kilometer | extras" mode="alle">
    <td>
    <xsl:value-of select="."/>
    </td>
    </xsl:template>

    <xsl:template match="autos" mode="einzeln">
    <xsl:apply-templates select="auto" mode="einzeln" />
    </xsl:template>

    <xsl:template match="auto" mode="einzeln">
    <xsl:variable name="strLayerID" select="generate-id(key('markenauswahl', marke)[1])" />
    <div id="{generate-id(.)}" class="einzeln">
    <table border="1">
    <tr>
    <th colspan="3">
    <xsl:value-of select="modell" />
    </th>
    </tr>
    <tr>
    <td class="spalte">Preis</td>
    <td class="daten"><xsl:value-of select="preis" /></td>
    <td rowspan="10" width="400" align="center">
    <xsl:apply-templates select="foto2"/>
    </td>
    </tr>
    <tr>
    <td class="spalte">Adresse</td>
    <xsl:apply-templates select="adresse" mode="einzeln"/>
    </tr>
    <tr>
    <td class="spalte">PS</td>
    <td class="daten"><xsl:value-of select="ps" /></td>
    </tr>
    <tr>
    <td class="spalte">Erstzulassung</td>
    <td class="daten"><xsl:value-of select="EZ" /></td>
    </tr>
    <tr>
    <td class="spalte">Bauart</td>
    <td class="daten"><xsl:value-of select="art" /></td>
    </tr>
    <tr>
    <td class="spalte">Farbe</td>
    <td class="daten"><xsl:value-of select="farbe" /></td>
    </tr>
    <tr>
    <td class="spalte">Kilometerleistung</td>
    <td class="daten"><xsl:value-of select="kilometer" /></td>
    </tr>
    <tr>
    <td class="spalte">Extras</td>
    <td class="daten"><xsl:value-of select="extras" /></td>
    </tr>
    <tr>
    <td class="spalte">Kraftstoffart</td>
    <td class="daten"><xsl:value-of select="kraftstoff" /></td>
    </tr>
    <tr>
    <td class="spalte">Getriebe</td>
    <td class="daten"><xsl:value-of select="getriebe" /></td>
    </tr>
    </table>
    <p>
    <a href="#" onclick="hideLayer('{generate-id(.)}');displayLayer('marke_{$strLayerID}');">Gesamtübersicht anzeigen</a>
    </p>
    </div>
    </xsl:template>

    <xsl:template match="adresse" mode="einzeln">
    <td class="daten">
    <xsl:value-of select="name"/><br></br>
    <xsl:value-of select="plz"/><br></br>
    <xsl:value-of select="ort"/>
    </td>
    </xsl:template>

    <xsl:template match="autos" mode="jsarray">
    <xsl:for-each select="auto">
    <xsl:text>"</xsl:text><xsl:value-of select="generate-id(.)" /><xsl:text>"</xsl:text><xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
    </xsl:for-each>
    </xsl:template>

    <xsl:template match="autos" mode="markejsarray">
    <xsl:for-each select="auto[generate-id() = generate-id(key('markenauswahl', marke)[1])]">
    <xsl:text>"</xsl:text><xsl:value-of select="concat('marke_', generate-id(.))" /><xsl:text>"</xsl:text><xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>[/code]


    So, nachdem das nun läuft, hab ich mich heute mal daran versucht das mittels PHP (also ohne XSLT) zu lösen:

    Hier mal die PHP-Codes:

    Für Ausgabe aller Autos:

    PHP-Code:
    <?php

    $id 
    $_GET['id'];

    if (
    file_exists("autos_php.xml")) {

    $xml simplexml_load_file("autos_php.xml");

    $path ="/autos/auto";

    if (!
    $res $xml->xpath($path)) {
    echo 
    "Auto nicht vorhanden!";
    }
    else {
    echo 
    "<table border="1">";
    echo 
    "<tr>";
    echo 
    "<th>Marke</th>";
    echo 
    "<th>Modell</th>";
    echo 
    "<th>Preis</th>";
    echo 
    "<th>Adresse</th>";
    echo 
    "</tr>";

    foreach (
    $xml->xpath('auto') as $auto) {
          echo 
    '<tr><td>'$auto->marke'</td><td>'$auto->modell'</td><td>'$auto->preis,'</td>';

    foreach (
    $xml->xpath('//adresse') as $adresse) {
          echo 
    '<td>'$adresse->name$adresse->strasse$adresse->ort,'</td></tr>';
    }
    else {
    exit(
    "Konnte Datei nicht laden.");
    }
    ?>

    Und für die Daten eines Autos:

    PHP-Code:
    <?php

    $id 
    $_GET['id'];

    if (
    file_exists("autos_php.xml")) {

    $xml simplexml_load_file("autos_php.xml");

    $path ="/autos/auto[@id=".$id."]";

    if (!
    $res $xml->xpath($path)) {
    echo 
    "Artikel nicht vorhanden!";
    }
    else {
    echo 
    "<table border="1">";
    echo 
    "<tr>";
    echo 
    "<td>Marke:</td>";
    echo 
    "<td>".$res[0]->marke."</td>";
    echo 
    "</tr>";

    echo 
    "<tr>";
    echo 
    "<td>Modell:</td>";
    echo 
    "<td>".$res[0]->modell."</td>";
    echo 
    "</tr>";

    echo 
    "<tr>";
    echo 
    "<td>Preis:</td>";
    echo 
    "<td>".$res[0]->preis."</td>";
    echo 
    "</tr>";

    echo 
    "<tr>";
    echo 
    "<td>Adresse:</td>";
      echo 
    "<td>";
        foreach (
    $xml->xpath('//adresse') as $adresse) {
          echo 
    $adresse->name$adresse->strasse$adresse->ort,'<br />';
      echo 
    "</td>";
    echo 
    "</tr>";
      
    echo 
    "<tr>";
    echo 
    "<td>PS:</td>";
    echo 
    "<td>".$res[0]->ps."</td>";
    echo 
    "</tr>";
    }


    }
    else {
    exit(
    "Konnte Datei nicht laden.");
    }
    ?>


    Läuft aber nicht auf meinem Apache. Also hab ich wohl was falsch.

    Was hab ich denn da falsch?
    Problem mit PHP ist, dass wir das nur ganz kurz angesprochen haben, aber diese Aufgabe für die Klausur auch mit PHP lösen müssen.
    Zumindest so, dass erst ne Gesamtübersicht angezeigt wird und dann bei nem Klick auf eins der Autos wie gehabt ne Einzelübersicht kommt.

    Die Einzelansicht wollte ich dann einfach so erzeugen lassen, dass bei dem Klick auf nen Link der Gesamtübersicht die ID des entsprechenden Autos mit an die PHP-Datei der Einzelübersicht geschickt wird und somit nur dieses Auto ausgegeben wird.

    Vielleicht wäre ja einer von euch so nett mir den Code mal so anzupassen, dass es läuft. Dann würde ich ja sehen wie es funktioniert.

    Ich sitz da jetzt schon ewig dran und bekomms einfach nicht hin.
    Würde mir also echt sehr helfen.

    Das hier soll jetzt nur mal die Grobversion sein.
    Da kommen später natürlich auch noch die anderen Daten hinzu.

    Die Autos_php.xml hab ich nur soweit abgeändert, dass jedes Auto jetzt ne eigene ID hat.

    Hier mal noch der angepasste XML-Code:

    Code:
    <?xml version="1.0"?>
    <?xml-stylesheet href="autos_xsl.xsl" type="text/xsl" ?>
    
    <autos>
    	<auto id="1">
    		<marke xml:link="simple" naechster="Maserati" href="mas1.xml">Maserati</marke>
    		<modell>Biturbo Coupé</modell>
    		<foto quelle="Maserati1.jpg"></foto>
    		<foto2 quelle="Maserati1_gross.jpg"></foto2>
    		<preis>EUR 1.111</preis>
    		<adresse>
    			<name>Helmut Müller</name>
    			<strasse>Schustereck 5</strasse>
    			<plz>66709</plz>
    			<ort>Rappweiler</ort>	
    		</adresse>
    		<ps>75</ps>
    		<EZ>06/1984</EZ>
    		<art>Coupé</art>
    		<farbe>schwarz</farbe>
    		<kilometer>100.000km</kilometer>
    		<extras>keine</extras>
    		<kraftstoff>Benzin</kraftstoff>
    		<getriebe>Automatik</getriebe>
    	</auto>
    	
    	<auto id="2">
    		<marke xml:link="simple" naechster="Audi" href="audi.xml">Audi</marke>
    		<modell>Audi A8</modell>
    		<foto quelle="Audi.jpg"></foto>
    		<foto2 quelle="Audi_gross.jpg"></foto2>
    		<preis>EUR 12.000</preis>
    		<adresse>
    			<name>Donald Duck</name>
    			<strasse>Feldweg 3</strasse>
    			<plz>54621</plz>
    			<ort>Entenhausen</ort>	
    		</adresse>
    		<ps>125</ps>		
    		<EZ>10/2001</EZ>
    		<art>4-Türer</art>
    		<farbe>silber</farbe>
    		<kilometer>40.000km</kilometer>
    		<extras>Klimaanlage
    			 <extra>Automatik</extra>
    			 <extra>Nebelscheinwerfer</extra>
    			 <extra>Sitzheizung</extra>
    		</extras>
    		<kraftstoff>Benzin</kraftstoff>
    		<getriebe>Handschaltung</getriebe>
    	</auto>
    	
    	<auto id="3">
    		<marke xml:link="simple" naechster="Maserati" href="mas2.xml">Maserati</marke>
    		<modell>Maserati Sportswagon</modell>
    		<foto quelle="Maserati2.jpg"></foto>	
    		<foto2 quelle="Maserati2_gross.jpg"></foto2>	
    		<preis>EUR 87.000</preis>
    		<adresse>
    			<name>Fred Feuerstein</name>
    			<strasse>Steinbruch 5</strasse>
    			<plz>66679</plz>
    			<ort>Losheim am See</ort>	
    		</adresse>
    		<ps>340</ps>
    		<EZ>05/2005</EZ>
    		<art>Cabrio</art>
    		<farbe>blau</farbe>
    		<kilometer>25.000km</kilometer>
    		<extras>Klimaanlage
    			 <extra>Automatik</extra>
    			 <extra>Nebelscheinwerfer</extra>
    			 <extra>Sitzheizung</extra>
    			 <extra>Ledersitze</extra>
    		</extras>
    		<kraftstoff>Benzin</kraftstoff>
    		<getriebe>Handschaltung</getriebe>
    	</auto>
    </autos>
    Viele Grüße,
    Masipulami

    Kommentar


    • #3
      Habs jetzt endlich selbst hinbekommen:

      Hab nur noch ein kleines Problem:
      Da scheint was mit der Syntax des Links, der die ID an die Autos_einzeln.php übergibt, nicht zu stimmen.

      Wär schön, wenn mir jemand den Fehler aufzeigen könnte.

      Hier mal die beiden PHP-Codes:

      Autos_alle.php:
      (zeigt Gesamtübersicht aller Autos an)

      <?php

      $id = $_GET['id'];

      if (file_exists("autos_php.xml"))
      {

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

      $path ="/autos/auto";

      if (!$res = $xml->xpath($path))
      {
      echo "Auto nicht vorhanden!";
      }

      else
      {
      echo "<table border=\"1\">";
      echo "<tr>";
      echo "<th>Marke</th>";
      echo "<th>Modell</th>";
      echo "<th>Preis</th>";
      echo "<th>Adresse</th>";
      echo "<th>PS</th>";
      echo "<th>Erstzulassung</th>";
      echo "<th>Bauart</th>";
      echo "<th>Farbe</th>";
      echo "<th>Kilometerleistung</th>";
      echo "<th>Extras</th>";
      echo "<th>Link</th>";
      echo "</tr>";

      foreach ($xml->xpath('auto') as $auto)
      {
      echo '<tr><td>', $auto->marke, '</td><td>', $auto->modell, '</td><td>', $auto->preis,'</td>';
      echo '<td>', $auto->adresse->name, '<br>', $auto->adresse->strasse, '<br>', $auto->adresse->ort,'</td>';
      echo '<td>', $auto->ps, '</td><td>', $auto->EZ, '</td><td>', $auto->art, '</td><td>', $auto->farbe, '</td><td>', $auto->kilometer, '</td>';
      echo '<td>', $auto->extras, '</td>';

      echo "<td><A href=\"autos_einzeln.php\">Link</A></td></tr>";
      }
      }
      }
      else
      {
      exit("Konnte Datei nicht laden.");
      }
      ?>


      Autos_einzeln.php:
      (zeigt die Einzelansicht des Autos mit der übergebenen ID an)

      <?php

      $id = $_GET['id'];
      //$id = '1';

      if (file_exists("autos_php.xml"))
      {

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

      $path ="/autos/auto[@id=".$id."]";
      //$path ="/autos/auto['id']";

      if (!$res = $xml->xpath($path))
      {
      echo "Artikel nicht vorhanden!";
      }
      else
      {
      echo "<table border=\"1\">";
      echo "<tr>";
      echo "<td>Marke:</td>";
      echo "<td>".$res[0]->marke."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Modell:</td>";
      echo "<td>".$res[0]->modell."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Preis:</td>";
      echo "<td>".$res[0]->preis."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Adresse:</td>";
      echo "<td>".$res[0]->adresse->name."<br>".$res[0]->adresse->strasse."<br>".$res[0]->adresse->ort."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>PS:</td>";
      echo "<td>".$res[0]->ps."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Erstzulassung:</td>";
      echo "<td>".$res[0]->EZ."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Bauart:</td>";
      echo "<td>".$res[0]->art."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Farbe:</td>";
      echo "<td>".$res[0]->farbe."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Kilometerleistung:</td>";
      echo "<td>".$res[0]->kilometer."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Extras:</td>";
      echo "<td>".$res[0]->extras."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Kraftstoffart:</td>";
      echo "<td>".$res[0]->kraftstoff."</td>";
      echo "</tr>";

      echo "<tr>";
      echo "<td>Getriebe:</td>";
      echo "<td>".$res[0]->getriebe."</td>";
      echo "</tr>";
      }
      }
      else
      {
      exit("Konnte Datei nicht laden.");
      }
      ?>

      Kann sich ja nur noch um ne Kleinigkeit handeln.

      Viele Grüße und schönen Abend noch,
      Masipulami

      Kommentar

      Lädt...
      X