XML auf Strukturanordnung prüfen (!= validieren)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML auf Strukturanordnung prüfen (!= validieren)

    Hallo

    Dieser Beitrag hätte wohl genauso gut ins Brainstorming-Board gepasst, aber gut.

    Ich machs kurz:

    Ein Script liest ein externes XML-Dokument ein und speichert ein paar Sachen in eine DB. Dass die externe XML-Datei aber ihre jetzige Struktur behält, kann nicht garantiert werden.

    Vor dem verarbeiten der Datei soll sie also auf ihre Struktur bzw. ihren Aufbau hin geprüft werden. Ich meine hiermit NICHT das Validieren auf Wohlgeformtheit!

    Ich mach mal ein Beispiel:

    PHP-Code:
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
     <verzeichnis>
          <titel>Wikipedia Städteverzeichnis</titel>
          <eintrag>
               <stichwort>Genf</stichwort>
               <eintragstext>Genf ist der Sitz von ...</eintragstext>
          </eintrag>
          <eintrag>
               <stichwort>Köln</stichwort>
               <eintragstext>Köln ist eine Stadt, die ...</eintragstext>
          </eintrag>
     </verzeichnis>
    Vor dem Verarbeiten muss folgendes Sichergestellt sein:

    - Element Stichwort muss vorkommen, muss dabei aber innerhalb verzeichnis->eintrag stehen (für Eintragstext das gleiche).
    - Element Titel muss vorkommen, muss dabei innerhalb Verzeichnis stehen (für Titel das gleiche), außerdem müssen Stichwort und Eintragstext darunter vorzufinden sein
    - andere Elemente dürfen nicht vorkommen

    Und so weiter, und so fort...

    Gibt es da schon was fertiges? Kann ja fast nicht sein, dass ich der einzige bin, der den korrekten Aufbau eines XML-Dokuments feststellen muss

    Oder muss mich das garnicht interessieren? PHP DOM wird schon einen Fehler werfen wenn ich was verarbeiten will, was sich in der XML-Datei geändert hat. Nur würde ich das gerne vor dem verarbeiten wissen, um eine allgemeine eindeutige Meldung ausspucken zu können ("Fehler: XML-Struktur verändert").

    Danke

  • #2
    mit einem XML Schema (xsd) kannst du die struktur deiner xml-datei beschreiben.
    mit $dom->schemaValidate() kannst du dann leicht überprüfen, ob das dokument zu dem vorgegebenen schema passt.

    Kommentar


    • #3
      Cool Danke, das ist ja noch besser als ich mirs vorgestellt hab.
      Habe da aber noch Fragen:

      Wenn man möchte, dass Elemente in einer genauen Reihenfolge vorkommen, kann man ja <xsd:sequence..... benutzen und trägt dort dann die Elemente ein.

      Doch wie sieht das gleiche bei Attributen aus? Also wie kann ich festlegen, in welcher Reihenfolge die Attribute eines Elements vorhanden sein müssen? Dafür scheint sequence ja nicht geeignet zu sein (oder doch?). Einfach die Attribute hintereinander auflisten?

      Desweiteren kann man mit minoccurs und maxoccurs ja die Häufigkeit der Elemente festlegen. Was ist, wenn ich aber eine exakte Anzahl angeben möchte? Klar, ich könnte min- und maxoccurs auf genau den selben Wert legen, aber gibt es nicht sowas wie "exactoccurs"?

      Was ist der Defaultwert, wenn ...occurs weggelassen wird? Dann MÜSSEN sie ja genau einmal vorkommen. Wenn ich dann allerdings minoccurs x einführe, dürfen sie plötzlich beliebig oft >x vorkommen?

      Danke

      Kommentar


      • #4
        Okay, habe durch trial and error obige Fragen erschlagen, nurnoch das bleibt:

        Ich habe hier einen komplexen Typen, welcher Kindelemente dreier Arten enthält:



        PHP-Code:

        <xsd:complexType name="MatchTyp">
              <
        xsd:sequence>
                 <
        xsd:element name="eins" type="einsTyp" />
                 <
        xsd:element name="zwei" type="zweiTyp" />
                 <
        xsd:element name="drei" type="dreiTyp" minOccurs="3" maxOccurs="3" />
              </
        xsd:sequence>
        </
        xsd:complexType

        "sequence" sorgt ja dafür, dass die Kindelemente genau in der angegebenen Reihenfolge vorhanden sein müssen. Das dritte Element drei soll außerdem genau 3 mal auftreten. Soweit, so gut.

        Jetzt habe ich aber festgestellt, dass das Kindelement zwei manchmal vor Kindelement eins auftritt, ergo gibts beim Validieren einen Fehler ("eins statt zwei erwartet"). Normalerweise kann man statt "sequence" ja "all" verwenden, dann spielt die Reihenfolge keine Rolle mehr. Leider kann ich mit "all" beim dritten Kindelement nichtmehr max- und minOccurs festlegen, denn jedes Element darf bei all vorkommen wo es will, aber nur einmal 8und keine 3 mal, wie gewollt).


        Wie könnte man da vorgehen?
        Danke

        Kommentar


        • #5
          Original geschrieben von INC.
          Leider kann ich mit "all" beim dritten Kindelement nichtmehr max- und minOccurs festlegen, denn jedes Element darf bei all vorkommen wo es will, aber nur einmal 8und keine 3 mal, wie gewollt).
          müsste beides hinhauen:

          unschön - das dritte element dreimal notieren

          sauber - neues übergeordnetes komplexes element erstellen, das eine sequenz des dritten elements mit der gewünschten häufigkeit enthält.

          Kommentar


          • #6
            Original geschrieben von 3DMax
            müsste beides hinhauen:

            unschön - das dritte element dreimal notieren

            sauber - neues übergeordnetes komplexes element erstellen, das eine sequenz des dritten elements mit der gewünschten häufigkeit enthält.
            Hey,

            deine erste Variante benutze ich aktuell, aber ist unschön wie du schon sagtest.

            Wie meinst du das mit der 2. Variante? So wohl eher nicht, oder?

            PHP-Code:
            <xsd:complexType name="MatchTyp">
                  <
            xsd:all>
                     <
            xsd:element name="eins" type="einsTyp" />
                     <
            xsd:element name="zwei" type="zweiTyp" />
                  </
            xsd:all>
                  <
            xsd:sequence>
                    <
            xsd:element name="drei" type="dreiTyp" minOccurs="3" maxOccurs="3" />
                  </
            xsd:sequence>
            </
            xsd:complexType

            Kommentar


            • #7
              soetwas in der art (ungetestet):
              PHP-Code:
              <xsd:complexType name="MatchTyp">
                 <
              xsd:all>
                    <
              xsd:element name="eins" type="einsTyp" />
                    <
              xsd:element name="zwei" type="zweiTyp" />
                    <
              xsd:element ref="drei_sequenz" />
                 </
              xsd:all>
              </
              xsd:complexType>

              <
              xsd:element name="drei_sequenz">
                 <
              xsd:complexType>
                    <
              xsd:sequence>
                       <
              xsd:element name="drei" type="dreiTyp" minOccurs="3" maxOccurs="3" />
                    </
              xsd:sequence>
                 </
              xsd:complexType>
              </
              xsd:element
              ob man's direkt schachteln kann, weiß ich nicht - kannst du ja ausprobieren
              EDIT:
              jetzt wo ich es sehe - ganz schön viel schreibkram. da könnte man glatt wieder zu variante 1 tendieren
              Zuletzt geändert von 3DMax; 18.08.2008, 18:16.

              Kommentar

              Lädt...
              X