aacjohn: DTD - erlaubte Inhalte eines Elementtyps abfragen

Hallo zusammen,
ich versuche eine XML-Dateneingabe per PHP/HTML zu realisieren. Nun bin ich die zahlreichen PHP-Klassen zur Verarbeitung von XML durchgegangen: http://de2.php.net/manual/de/refs.xml.php
...und ich finde keine Möglichkeit abzufragen, was die erlaubten Inhalte für einen bestimmten Elementtyp sind. Steh ich da irgendwie auf dem Schlauch?

Gruß, johannes

  1. Hi Johannes,

    ich stehe gerade in bißchen auf dem Schlauch;-)

    Kannst Du das etwas detailierter bringen?
    Ich bin mr nicht sicher was Du willst...

    gruß pit

    1. Hi Pit

      ich stehe gerade in bißchen auf dem Schlauch;-)

      Kannst Du das etwas detailierter bringen?

      gerne:
      Also, ich möchte eine DTD einlesen und dann eine Maske generieren, die das Aufnehmen von XML-Daten unterstützt, die valide zu der eingelesenen DTD sind.
      Das heißt, ich müsste am Anfang z.B. wissen, welche Inhalte für den Wurzelknoten erlaubt sind. Dann möchte ich in die Maske Buttons setzen, die das Einfügen dieser Inhalte erlauben und diese wieder ausblenden, wenn sie z.B. nur einmal auftauchen dürfen. Das heißt ich brauche irgendwie Zugriff auf die logischen Informationen in der DTD und zwar im einzelnen. Da im PHP-Manual soviel über XML steht, dachte ich, dass es sowas geben müsste.
      Ich habe aber bisher kaum Erfahrung mit XML und vielleicht geh ich das auch irgendwie falsch an. Wenn du mir ein bißchen Orientierung geben kannst, wär ich dir dankbar.

      Gruß, Johannes.

      P.S.: Vielleicht die Frage nochmal anders gestellt: Wie würdest du vorgehen, wenn du aus einer DTD eine passende Eingabemaske genrieren willst?

      1. Hallo Johannes,

        aus eigener Erfahrung kann ich Dir sagen: DTD parsen ist doof. Sehr doof. Ich habe für SELFHTML 9 selbst lange nach irgend einer brauchbaren (und vor allem unkomplizierten!) Lösung gesucht, die wir DTDs für automatisch generierte Referenzen auslesen können (d.h. die HTML-Referenz wird in SELFHTML 9 später zum Teil automatisch generiert sein). Etwas wirklich zufriedenstellendes habe ich noch nicht gefunden.

        Was wir aktuell machen ist folgendes: Wir verwenden trang, ein Java-Tool [1], das zwischen DTD, XML Schema und Relax NG hin- und herkonvertieren kann. Damit konvertieren wir die XHTML-DTDs nach Relax NG (XML-Notation). Dieses verarbeiten wir dann mit XSLT weiter zu einem HTML-Dokument, das dann die Referenz darstellt. [2]

        Das alles hilft Dir aber nicht wirklich weiter: Du hast nicht den Luxus, erst mühsam die DTD in ein anderes Format zu konvertieren. Ferner verwendest Du PHP und glaube mir aus Erfahrung: Selbst wenn Du es schaffst, eine Java-VM für trang automatisch zu starten, willst Du das aus Performancegründen definitiv nicht tun. Ausserdem lässt sich Relax NG in XML-Notation zwar leicht mit einem stinknormalen XML-Parser parsen, aber das logische Verarbeiten davon ist dann auch wieder etwas aufwändiger.

        Alles in allem: Ich glaube nicht, dass Du eine einfache Lösung finden wirst, die das erledigen kann, was Du willst. Vielleicht täusche ich mich und es gibt für PHP etwas fertiges in dieser Richtung, aber ich könnte mir gut vorstellen, dass Du die DTD selbst von Hand parsen müsstest, um da wirklich weiter zu kommen - was dann gleich wieder verdammt aufwändig ist, weil die meisten DTDs lauter Entities verwenden, um Dinge abzukürzen.

        Viele Grüße,
        Christian

        [1] Für den ganzen SELF9-Kram verwenden wir sowieso Java.
        [2] Dabei importieren wir auch weitergehende Informationen wie Beschreibungstexte oder Linkziele aus anderen Quellen.

        1. Hallo Christian,

          danke für deine ausführliche Antwort! Es ist gut zu wissen, dass ich nicht was entscheidendes übersehen habe.
          Ich bin nicht auf DTD festgelegt, da es um eigene (noch nicht existierende) Dokumenttypen geht. RelaxNG hatte ich mir noch nicht genau angeschaut und das scheint ja wirklich sehr viel leichter interpretierbar zu sein. Vielleicht wage ich mich da mal dran. Nach allem was ich bisher gesehen habe ist XML Schema vergleichsweise komplex, würdest du das bestätigen?

          Eine Sache verstehe ich aber immernoch nicht: Im Prinzip muss doch in jedem XML-Validator, der DTD-Validierung beherscht, die Funktionalität drin sein, die ich brauche. Und davon scheint es für PHP ja einige zu geben. Warum stellt keine dieser Klassen die Funktionalität zur Verfügung, sondern bietet nur komplette Validierungen an?
          Und: Im Prinzip ist das doch eine Aufgabe vor der jeden Tag tausende Programmierer stehen müssten, eine Eingabemaske für einen bestimmten Dokumenttyp zu stricken. Wird das alles von Hand gebastelt?

          Gruß, Johannes

          1. Hallo Johannes,

            Ich bin nicht auf DTD festgelegt, da es um eigene (noch nicht existierende) Dokumenttypen geht. RelaxNG hatte ich mir noch nicht genau angeschaut und das scheint ja wirklich sehr viel leichter interpretierbar zu sein. Vielleicht wage ich mich da mal dran. Nach allem was ich bisher gesehen habe ist XML Schema vergleichsweise komplex, würdest du das bestätigen?

            Ja. Wenn Du die Wahl hast, nimm auf jeden Fall Relax NG. XML Schema halte ich nicht nur für sehr komplex, sondern auch in einigen Teilen für sehr schlecht konzipiert.

            Eine Sache verstehe ich aber immernoch nicht: Im Prinzip muss doch in jedem XML-Validator, der DTD-Validierung beherscht, die Funktionalität drin sein, die ich brauche.

            Ja.

            Warum stellt keine dieser Klassen die Funktionalität zur Verfügung, sondern bietet nur komplette Validierungen an?

            Nunja, einige Parser bieten - soweit ich das sehen kann - zumindest grundsätzlichen Zugriff auf diese Informationen an. Ich habe damals auch ein paar Dinge gefunden für C-basierte Parser (was mir im Java-Fall aber nicht weitergeholfen hat). Soweit ich mich erinnern kann, kann man z.B. der libxml2 diese Informationen irgendwie entlocken, wenn man sich auf den Kopf stellt und mit dem Füßen wackelt - kann mich aber auch täuschen. Allerdings: Auch wenn PHP die libxml2 nutzt für die XML-Funktionalität: PHP-Funktionen, die diese Funktionalität bereitstellen, gibt es nicht.

            Viele Grüße,
            Christian