XML in PHP - Eine umfangreiche Einführung?

PlaciD

Böhser Onkel
ID: 55555
L
11 Februar 2007
722
104
Hi,

ich schreibe gerade ne neue Homepage, und, naja, ich dreh hier total am Rad. Ich finde einfach keine umfangreiche Einführung für den Umgang mit XML-Files in PHP.

Mein Ziel: Ich habe ein Programm, Music Collector Pro, mit dem ich meine CD's verwalte. Dieses Programm kann einen xml-Export vornehmen. Diesen möchte ich nun auf meine HP bringen, natürlich in verschiedensten Formen.

Zuerst mal möchte ich ne Übersicht über alle CD's, und dann je nach ausgewählter ID (per Link) dann eine Detailansicht. Mit ner db wüsste ich, wie ich das realisiere, nur bei xml stehe ich auf dem Schlauch und finde irgendwie auch nicht die richtigen Tutorials.

Bisher habe ich folgendes Tutorial durchgelesen und auch verstanden (denke ich):
https://www.drweb.de/programmierung/xml-php-expat.shtml
ABER: Das Skript geht ja jede Zeile durch und parst den Inhalt. Ich würde aber lieber auf verschiedene Nodes direkt zugreifen. So bin ich das von Java gewöhnt, und irgendwie erschließt sich mir der Sinn nicht, warum man xml-Dateien von oben nach unten lesen sollte, wenn man z.B. ein Objekt sucht. Da muss es doch was schnelleres geben?

Danke schonmal allen für die Hilfe,
PlaciD
 
Abgesehen davon, dass ich dir leider kein Tutorial geben kann, und ich leider auch nicht viel Ahnung habe, möchte ich dir trotzdem einen Vorschlag machen ;).

Denn ab Version 5.0 hat PHP ja Standradmäßig Simple XML dabei, was ja unter Umständen reichen könnten. Soweit ich mir das angeguckt habe, funktioniert der Zugriff über ein Objekt, dass die Knoten und Attribute als Unterobjekte/Eigenschaften hat. Für eine nicht allzu aufwändige Umsetzung des Skriptes dürfte ds ja durchaus ausreichen.

Ansonsten bietet PHP ab Version 5.0 / 5.1 noch ein paar andere Fertig eingebaute XML-Parser, die ganz gut zu sein scheinen.
Da ich mal davon ausgehe, dass du schon ein wenig Ahnung hast, würde ich an deiner Stelle versuchen anhand der Funktionsbeschreibungen und Beispiele klar zu kommen.

Hier noch die Links:
Simple XML
XML Parser
XMLReader
 
Hi,

erstmal danke für deine Antwort. Mit SimpleXML habe ich mich schon beschäftigt (ganz kurz), aber ich bin mir nicht sicher, ob das das richtige ist.

Aber nachdem ich nun schon viel gelesen habe, finde ich SimpleXML schon fast das beste, einfach weil man mittles XPath direkt in ein Element reinspringen kann (z.B. für die Detailansicht).
Diese Funktion konnte ich bisher sonst noch garnirgendwo finden.

PlaciD
 
weil man mittles XPath direkt in ein Element reinspringen kann (z.B. für die Detailansicht).
Diese Funktion konnte ich bisher sonst noch garnirgendwo finden.
Hi PlaciD,

XPath geht auch "einfach so":
PHP:
$xpath = new DOMXPath($this->xmlDoc);
$nextNodes = $xpath->query('following-sibling::node()/attribute::id', $refNode);
Liefert eine DOMNodelist.
Ein tolles Tutorial habe ich leider auch nicht; verlockt mich fast, mal eins zu schreiben, hab nur grad soviel Arbeit. Habe mich selbst mit https://www.php.net/manual/de/ref.dom.php reingegraben, war aber am Anfang nicht lustig.
Viel Glück erstmal,
wB
 
Wie ich sehe, zielt der Thread in Richtung "XML parsen" ab. Eine Alternative wäre das direkte Formatieren der XML-Daten mit CSS. Du benötigst kein bisschen PHP dazu.

Ich lass nur mal schnell n Link mit einem Beispiel da, da ich noch ne DVD gucken will :mrgreen:
https://de.selfhtml.org/xml/darstellung/css.htm
 
Eine Alternative wäre das direkte Formatieren der XML-Daten mit CSS. Du benötigst kein bisschen PHP dazu.
Das geht, ist aber nicht "Browser-fest", d. h. alte (oder schlechte) Browser kriegen die Darstellung nicht hin. Sowas macht man besser mit XSLT. *klugscheiss*
Evt. poste ich hier die Tage mal ein bisschen Code von mir, wo ich damit rummache ... jetzt ist erstma Wochenende :yawn:!
 
Wie ich sehe, zielt der Thread in Richtung "XML parsen" ab. Eine Alternative wäre das direkte Formatieren der XML-Daten mit CSS. Du benötigst kein bisschen PHP dazu.

Ich lass nur mal schnell n Link mit einem Beispiel da, da ich noch ne DVD gucken will :mrgreen:
https://de.selfhtml.org/xml/darstellung/css.htm

Geht nicht, da ich auch Umformatierung vornehmen muss. Also ein Element garnicht anzeigen, eins woanders anzeigen usw.
Kommt daher, dass der ziemlich wild die XML rausschmeißt und die eigentlich zum Backup da ist, nicht zum einstellen auf der HP. Da ist z.B. der Pfad zum Bild drin (natürlich der lokale, also nicht zu gebrauchen).

Ansonsten habe ich's jetzt so gemacht:

Code:
$parser = simplexml_load_file('scripts/xml/music.xml');
	
$res = $parser->xpath('/musicinfo/musiclist/music');
	
foreach($res AS $key => $value){
	if($value->index!=$_GET['albumid'])
		continue;
	//Mittels $value->ELEMENTNAME auf Element zugreifen
}

So gehts. Hab nur keine Ahnung, wie lange der braucht, zum 500 Alben durchzugehen. Ansonsten funzt das so erstmal ;-)

@weissBescheid: Werde mich da mal reinlesen, kann ja nicht schaden ;-) Danke für den Tipp und den Link.

PlaciD
 
xpath ist zum selektieren da... also wenn du nicht das bekommst was du suchst machst du was falsch. in deinem code kannste das xpath auch gleich weglassen und direkt
PHP:
foreach($parser->musiclist->music AS $key => $value) {
schreiben.

ansonsten versuchs mal so:
PHP:
xpath('/musicinfo/musiclist/music[./index="DIE_ID"]');
 
@weissBescheid: Werde mich da mal reinlesen, kann ja nicht schaden ;-)
Ich würde das an Deiner Stelle unbedingt machen, dann könntest Du nämlich die hübschen Stylesheets unter https://www.collectorz.com/music/xsltemplates.php benutzen (oder Deinen Bedürfnissen anpassen). Leider haben die ihre DTD (bzw. XSD) nicht ins Netz gestellt, sonst hätte ich ein konkreteres Beispiel machen können, so hab ich mir selber diese blödsinnige Struktur ausgedacht:
Code:
<?xml version="1.0"?>
<cdlist>
  <cd name="Powerjodler" artist="Florian Blechschrott">
    <track no="1">Powerjodling</track>
    <track no="2">Alpenpower</track>
    <track no="3">weiter so...</track>
  </cd>
  <cd name="Trallala" artist="Ernst Moschit">
    <track no="1">Radetzkymarsch</track>
    <track no="2">Lustig blasen wir ...</track>
    <track no="3">weiter so...</track>
  </cd>
</cdlist>
als 'meineMukke.xml' speichern.
dann der PHP-Code (hier 'index.php'):
PHP:
<html><head><title>My Music via XML</title></head>
<body>
<a href="?ausgabe=komplett">Alle meine CD's</a><br/>
<a href="?ausgabe=alltracks">Alle Musikstücke</a>
<?php
  //erstmal das XML-File laden:
  $xmlDoc = new DOMDocument();
  $xmlDoc->load('meineMukke.xml');
  // schonmal ein XSLT-Stylesheet instanzieren:
  $xslSheet = new DOMDocument();
  // welches Stylesheet hättens denn gern?:
  switch($_GET['ausgabe']) {
    case 'komplett':
      $xslSheet->load('komplett.xsl');
      break;
    case 'alltracks':
      $xslSheet->load('alltracks.xsl');
      break;
    case '':
      die('<br/>bitte wählen Sie!');
      break;
    default:
      die('<br/>gibts nich!');
  }
  // transformieren des XML-Files:
  $xslProc = new XSLTProcessor;
  $xslProc->importStyleSheet($xslSheet);
  $html = $xslProc->transformToDoc($xmlDoc);
  // und Ausgabe des HTML-Files:
  echo($html->saveHTML());
?>
</body>
und dann kommen schon die Stylesheets:
1. 'komplett.xsl':
Code:
<xsl:stylesheet version="1.0" 
        xmlns:xsl="https://www.w3.org/1999/XSL/Transform">
<xsl:output 
  method="html"
  encoding="iso-8859-1"/>
  
<xsl:template match="/">
  <h1>Alle meine Mukke:</h1>
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="cd">
  <h3><xsl:value-of select="@name" /></h3>
  <span>von <xsl:value-of select="@artist" /></span>
  <ol><xsl:apply-templates/></ol>
</xsl:template>

<xsl:template match="track">
  <li><xsl:value-of select="."/></li>
</xsl:template>

</xsl:stylesheet>
und 2. 'alltracks.xml', wo nur <track>-Elemente ausgegeben werden:
Code:
<xsl:stylesheet version="1.0" 
  xmlns:xsl="https://www.w3.org/1999/XSL/Transform">
<xsl:output 
  method="html"
  encoding="iso-8859-1"/>

<xsl:strip-space elements="*" />

<xsl:template match="/">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="cd">
  <ol><xsl:apply-templates/></ol>
</xsl:template>

<xsl:template match="track">
  <li><xsl:value-of select="."/></li>
</xsl:template>

</xsl:stylesheet>
Also, das ist nicht so schwer, Du kannst die Styles von o. g. Seite verwenden oder sogar eigene entwickeln, es ist total modular (Dein Code hat (fast) nix mit der Ausgabe zu tun) und es handelt sich um die vom W3C empfohlene Sprache für die XML-Verarbeitung (zukunftssicher, z. B. wenn Music Collector seine DTD ändert ...).
Daher meine Empfehlung: XSLT!

:achja:
Deinen XPath-Kram (falls gewünscht) führst Du einfach vor der Transformation auf deinem XMLDoc durch.
Du kannst XSLT-Stylesheets auch parametrisieren, d. h. Du brauchst nicht ganz viele Stylesheets, sondern kannst bestimmte <xsl:template>-Tags durch Übergabe von Parametern steuern.
 
Zuletzt bearbeitet: