Neues Beispiel 2: Wiederholung: Verbindung der Teile

30.01.2017 08:31 Uhr
#include <iostream>
#include <string.h>


using namespace std;
#include <fstream>

#include "ntoken2.h"

ClElement *verarbeite(ifstream& datei);

enum ezustand {direktive, element, attribute, abhaengigElement,
               abhaengigAttribute, noise};


int main()
{
char dateiname[100];
ifstream eingabe;
ClToken *token;

ClElement *jetzt=NULL, *wurzel;


cout << "DTD-Dateiname: " << endl;
cin >> dateiname;
eingabe.open(dateiname);

wurzel=verarbeite(eingabe);
for (jetzt=wurzel;jetzt!=NULL;jetzt=jetzt->getNext())
    jetzt->druckeElement(0,wurzel);
eingabe.close();

cout << "DTD erfolgreich geladen." << endl;

// -----------------------------------

cout << "XML-Dateiname:" << endl;
cin >> dateiname;
eingabe.open(dateiname);

token=new ClToken;

if (token->getToken(eingabe,NULL,wurzel)!=0) token->druckeToken(1);
eingabe.close();
}

ClElement *verarbeite(ifstream& datei)
{
char zeichen, letztes;
char puffer[100];
int zaehler;
enum ezustand zustand = noise;
ClElement *jetzt=NULL, *wurzel=NULL, *neu;

for (datei.get(zeichen);!datei.eof();datei.get(zeichen))
    {
    switch(zeichen)
       {
    case '<':
       zustand=direktive;
       zaehler=0;
       break;
    case '>':


       if (letztes!=' ')
          {
          puffer[zaehler]='\0';
          switch(zustand)
             {
          case abhaengigElement:
	     jetzt->addTag(puffer);
             break;
          case abhaengigAttribute:
             jetzt->addAttribute(puffer);
             break;
          case element:
             neu=new ClElement(puffer);
	     if (jetzt!=NULL) jetzt->setNext(neu);
	     else wurzel=neu;
	     jetzt=neu;
	     zustand=abhaengigElement;
             break;
	     }
          }

       zustand=noise;
       break;
    case ' ':
       if (letztes==' ') continue;
       puffer[zaehler]='\0';
       zaehler=0;
       switch(zustand)
          {
       case direktive:

          if (!strcmp(puffer,"!ELEMENT")) zustand=element;
          else if (!strcmp(puffer,"!ATTLIST")) zustand=attribute;
          else
	     {
	     cout << endl << "Diese Direktive verstehe ich nicht: " << puffer;
	     zustand=noise;
	     }


          break;
       case element:
          neu=new ClElement(puffer);
	  if (jetzt!=NULL) jetzt->setNext(neu);
	  else wurzel=neu;
	  jetzt=neu;
	  zustand=abhaengigElement;
          break;

       case attribute:
          if (wurzel==NULL) jetzt=NULL;
          else neu=wurzel->sucheElement(puffer,wurzel);
          if (neu==NULL)
             {
             cout << endl << "Es gibt kein Element mit dem Namen: " << puffer << endl;
             zustand=noise;
             }
          else
             {
             zustand=abhaengigAttribute;
             jetzt=neu;
             }
          break;
       case abhaengigElement:
          jetzt->addTag(puffer);
          break;
       case abhaengigAttribute:
          jetzt->addAttribute(puffer);
          break;
	  }


       break;
    default:
       if (zustand!=noise) puffer[zaehler] = zeichen;
       zaehler++;
       break;
       }
    letztes=zeichen;
    }

return wurzel;
}

Element Bibliothek

#include <iostream>

using namespace std;
#include <string.h>

#include "nelement2.h"

ClElement::ClElement(
char                *string)
{
zahl=0;
zahlAttribute=0;
strcpy(name,string);
status=frei;
naechstes=NULL;
}

void ClElement::addTag(
char                  *string)
{
strcpy(tags[zahl],string);
zahl++;
}


void ClElement::addAttribute(
char                        *string)
{
strcpy(attributes[zahlAttribute],string);
zahlAttribute++;
}


void ClElement::druckeElement(
int                           ebene,
ClElement                          *wurzel)
{
ClElement *abhaengig;

status=inBearbeitung;
for (int j=0;j<ebene;j++) cout << "|   ";

cout << "Element " << name << " erlaubt die Attribute: " << endl;
for (int i=0;i<zahlAttribute;i++)
    {
    for (int j=0;j<ebene;j++) cout << "|   ";
    cout << "  -" << attributes[i] << endl;
    }
for (int j=0;j<ebene;j++) cout << "|   ";
cout << "und enthält die Tags: " << endl;
for (int i=0;i<zahl;i++)
    {
    for (int j=0;j<ebene;j++) cout << "|   ";
    cout << "   " << tags[i] << endl;
    abhaengig=sucheElement(tags[i],wurzel);
    if (abhaengig != NULL) abhaengig->druckeElement(ebene+1,wurzel);
    }


status=frei;
}

ClElement *ClElement::sucheElement(
char                              *suche,
ClElement                               *element)
{
ClElement *resultat;

if (element==NULL) return NULL;
if (!strcmp(suche,element->name))
   if (element->status==frei) return element;
   else return NULL;
return sucheElement(suche,element->naechstes);
}

//--------------------------------------------------------

int ClElement::elementIstErlaubt(
char                            *name)
{
for (int i=0;i<zahl;i++)
    if (!strcmp(name,tags[i])) return i;

return -1;
}

Dateien: Beispiel 2

Schlagwörter: