XML abstrakt einlesen

XML abstrakt einlesen

am 19.07.2006 10:57:47 von Thomas Dartsch

Hallo,

ich beschäftige mich seit eingier Zeit mit der Verarbeitung von XML in PHP.
Im Moment benutze ich eine XML-Klasse aus den User Contributed Notes um XML
einzulesen.
Diese benutzt die normalen XML-Parser Funktionen von PHP.
Prinzipiell fuktioniert das auch, nur ist der fertige PHP-Code zu starr und
auf die einzulesende XML-Datei ausgerichtet.

Was ich möchte:
Ich suche nach einer Möglichkeit mit PHP weitgehend abstrakt und
strukturunabhängig XML-Dateien einzulesen.
Aktuell fange ich bei jedem Importvorgang quasi bei 0 an und muß für jede
XML-Datei mühselig den Inhalt durchsuchen und in meine weiterführenden
Variablen übergeben.
Außerdem möchte ich vorher eine "well-formed"-Prüfung der Daten auf Basis
einer DTD durchführen.

Welche Ansätze nutzt ihr dazu? Unter anderen Sprachen (z.B. Java) gibt es da
gute abstrakte Methoden, die ich aktuell bei PHP vermisse oder noch nicht
gefunden habe.
Wie kann ich eine DTD-Strukturprüfung mit PHP machen?

Vielen Dank
t.d

Re: XML abstrakt einlesen

am 19.07.2006 22:58:34 von Ulf Kadner

Thomas Dartsch wrote:

> ich beschäftige mich seit eingier Zeit mit der Verarbeitung von XML in PHP.
> Im Moment benutze ich eine XML-Klasse aus den User Contributed Notes um XML
> einzulesen.
> Diese benutzt die normalen XML-Parser Funktionen von PHP.
> Prinzipiell fuktioniert das auch, nur ist der fertige PHP-Code zu starr und
> auf die einzulesende XML-Datei ausgerichtet.
>
> Was ich möchte:
> Ich suche nach einer Möglichkeit mit PHP weitgehend abstrakt und
> strukturunabhängig XML-Dateien einzulesen.

Warum nimmst Du nicht SimpleXML? Ist zwar wirklich simpel ab oft reicht
das bereits. Ansonsten gibt noch DOM in PHP, das weitestgehend alle
XML-Notwendigkeiten abdeckt.

Wenn Du kein SimpleXML zur verfügung hast aber dessen Strukturierung gut
findest ists einfach diese Funktionalität (Elemente stehen als Objekte
in dynamischen Feldern/Eigenschaften bereit) zu implementieren.

Einfach die magischen Methoden __get($paramname) und
__set($paramname,$value) implementieren, welche alle Anfragen auf nicht
direkt existierende Felder verarbeiten.

Bsp: Du willst das das XML-Datenobjekt ein beliebiges XML-Dokument
darstellt. (seeehr einfach gehalten)

class Element
{
private $___params = array();
public function __construct($params=null) {
if (!empty($params) && is_array($params))
$this->___params = $params;
if (!isset($this->___params['ABC']))
$this->___params['ABC'] = '...';
if (!isset($this->___params['DEF']))
$this->___params['DEF'] = '???';
}
public function __get($paramname) {
switch (strtolower($paramname)) {
// Spezielle verarbeiten
case 'abc': return _params['ABC'];
case 'def': return _params['DEF'];
// Alle Anderen verarbeiten
default:
if (isset($this->___params[$paramname])
return $this->___params[$paramname];
throw new Exception(
'Field "'.$paramname.'" dont exists!' );
}
}
public function __set($paramname, $value) {
switch (strtolower($paramname)) {
// Spezielle verarbeiten
case 'abc': _params['ABC'] = value; break;
case 'def': _params['DEF'] = value; break;
// Alle Anderen verarbeiten
default:
$this->___params[$paramname] = $value;
break;
}
}
}

$elem = new Element(array('sub1'=>new Element()));

try {
echo $elem->Abc,"\n";
echo $elem->sub1,"\n";
$elem->sub2 = 'sub2';
echo $elem->sub2;
// Loest exception aus
echo $elem->xyz;
}
catch (Exception $ex) { exit($ex->getMessage()); }


Die magischen Methoden stehen auch unter PHP4 zur Verfügung (Doku zu
'overload' lesen) sind dort aber nicht gerade die Performancekönige ;-)


MfG, Ulf