Mittwoch, 18. August 2010

Wir basteln uns Test-Daten, Teil 3

Wir haben alles um unsere Daten zu generieren, es fehlt uns noch die Fähigkeit alles in XML-Dateien zu speichern.

Wir haben Passagen, wir haben zusätzliche Informationen dazu, nun wollen wir diese Informationen auch in Dateien packen. Dazu erschaffen wir eine einfache XML als SimpleXML-Objekt. Diesem Objekt können Schlüssel-Wert Kombinationen oder Schlüssel-Array Kombinationen übergeben werden, die in die XML geschrieben werden.

Zu guter Letzt wird die XML unter einem angegebenen Namen gespeichert, bestehenden Dateien werden dabei überschrieben. Ist das XML nicht valide wird die Datei nicht gespeichert.

Mit unserem "SAILOR'S WORD-BOOK" erhalten wir so immerhin 13289 XML-Dateien mit einer Größe zwischen einem und neunzehn Kilobyte und einem Gesamtvolumen von etwas über 13 MB - ausreichend für unsere Tests.

class DateiSchreiber
{
//$Objekt = new DateiSchreiber()
//Ein SimpleXML-Objekt wird erzeugt, Inhalt kann übergeben und eine XML
//geschrieben werden.
//
// $Objekt->erstelle("Datei"), SimpleXML-Objekt wird erzeugt,
//  zukuenftiger Dateiname wird festgelegt
// $Objekt->schreibeKnoten("Knoten","Inhalt"|Array)
//  Arrays werden als Inhalt geschrieben
// $Objekt->speichere(), speichert Datei wenn gueltige XML vorliegt

    private $Ziel; private $XMLObjekt;
    public $Pfad='c:/temp/';


    function __construct($Ziel)
    {
        $this->Ziel = $Ziel;
        $this->XMLObjekt = simplexml_load_string('');
    }

    function schreibeKnoten($Knoten, $Info)
    {
      if(is_array($Info)){
        $SubKnoten = $this->XMLObjekt->addChild("Daten");
        foreach($Info as $key => $wert){
          $Hier = $SubKnoten->addChild($Knoten, htmlentities($wert));
          $Hier->addAttribute('id', $key);
        }
      }else{ $this->XMLObjekt->addChild($Knoten, htmlentities($Info) ); }

    }

    function speichere()
    {
        if( simplexml_load_string( $this->XMLObjekt->asXML() ))
        {
          $handle = fopen($this->Pfad.$this->Ziel, 'w');
          fwrite($handle, $this->XMLObjekt->asXML() );
          fclose($handle);
        }
    }

}
Da fehlt noch etwas?

Natürlich.
Das Programm, bzw. die Klassen sollten noch wesentlich flexibler gestaltet werden. Mögliche Fehler sollten abgefangen werden und wir benötigen natürlich noch eine globale Steuerung, die die Klassen anspricht.
Eine primitive Steuerung ist hier noch der Vollständigkeit halber aufgeführt.

$DateiMitInhalt  = 'd:/testxml/26000.txt';
$TextObjekt = new TextTeiler($DateiMitInhalt);

for ($i=0; $i<$TextObjekt->Absaetze(); $i++)
{

    $AbsatzObjekt = new AbsatzInspektor($TextObjekt->NaechstePassage());

    $XMLObjekt = new DateiSchreiber($AbsatzObjekt->Schluessel.'.xml');

    $XMLObjekt->schreibeKnoten('id', $TextObjekt->Zeiger());
    $XMLObjekt->schreibeKnoten('MD5Schluessel', $AbsatzObjekt->Schluessel);
    $XMLObjekt->schreibeKnoten('Laenge', $AbsatzObjekt->Laenge);
    $XMLObjekt->schreibeKnoten('Anriss', $AbsatzObjekt->Anriss);
    $XMLObjekt->schreibeKnoten('AnzahlWoerter', $AbsatzObjekt->AnzahlWoerter);
    $XMLObjekt->schreibeKnoten('wort', $AbsatzObjekt->AlleWoerter());
    $XMLObjekt->schreibeKnoten('Inhalt', $TextObjekt->AktuellePassage());

    if($AbsatzObjekt->Schluessel) $XMLObjekt->speichere();
}
Schreiben Sie eine bessere Steuerung! Es würde mich freuen sie hier vorstellen zu dürfen.

Keine Kommentare:

Kommentar veröffentlichen