Announcement

Collapse
No announcement yet.

[Anfangsschwierigkeiten] Mehrere Tabellen mit unterschiedlichen Namen vordefinieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Anfangsschwierigkeiten] Mehrere Tabellen mit unterschiedlichen Namen vordefinieren

    Moin,
    ich möchte ein XML-Schema so schreiben, dass nicht nur die Grundstruktur angegeben ist, sondern, dass man auch die Elementeigenschaften vordefiniert, mehrere Tabellen mit bestimmten Namen vorsieht usw. Ist vielleicht besser wenn ich etwas Code zeige:
    Code:
     
    - <scope name="core">
    − <table name="Preferences">
    <column name="SystemId" type="bigint" required="true"/> <column name="Name" type="varchar" size="255" required="true"/> <column name="PrefValue" type="varchar" size="255" required="true"/> −<unique name="PK_PREFERENCES">
    <unique-column name="SystemId"/> <unique-column name="Name"/>
    </unique>
    </table> −<table name="VersionInfo">
    <column name="SystemId" type="bigint" primaryKey="true" required="true"/> <column name="ModuleVersion" type="varchar" size="32" required="true"/> <column name="Comment" type="varchar" size="255" required="false"/>
    </table> .............
    </scope>
    So wie es jetzt da steht, wurde es einfach "zum Vergleich" benutzt, sprich: man erzeugt XML-Dateien, wo Tabellen mit identischen Namen stehen und will schauen, ob die Variablenbelegung in den einzelnen "Spalten" richtig ist.
    Ist sowas überhaupt realisierbar in einem XML-Schema? Wie kann man dort fest die Tabellen-Namen vergeben, und das noch mehrmals? Wäre für jede Hilfe dankbar (XMLSpy macht Mist draus )

  • #2
    Lege für das name-Attribut des table-Elements als Restriktion (xs:restriction) eine Auflistung mit den erlaubten Werten fest. Dazu ist xs:enumeration geeignet.

    Comment


    • #3
      Danke für die Antwort. Das Problem ist aber, dass jede Tabelle sowieso anders strukturiert ist.
      Ich habe schon eine Lösung gefunden:
      Code:
      	<xs:complexType name="scope-type">
      		<xs:sequence>
      			<xs:element name="table" type="xs:ref_table"/>
      			<xs:element name="table" type="xs:version_table"/>
      		</xs:sequence>
      		<xs:attribute name="name" use="required">
      			<xs:simpleType>
      				<xs:restriction base="xs:string">
      					<xs:enumeration value="core"/>
      				</xs:restriction>
      			</xs:simpleType>
      		</xs:attribute>
      	</xs:complexType>
      Da ich sowieso all die Tabellen definieren muss, komm ich um die einzelnen Typen nicht drum herum.

      Ich habe aber eine neue Frage:
      Wie kann ich es erzwingen, dass der Knoten scope als name core hat? Im Code habe ich mein Versuch markiert, aber es wird in der neu erzeugten .xml-Datei nur als Vorschlag angegeben, und ich möchte, dass der Wert schon belegt ist.

      Comment


      • #4
        Und noch eine zweite Frage: wie kann ich das Pattern 0.0.0.0 angeben? Hab es mit
        Code:
        		<xs:attribute name="schema-version" use="required">
        			<xs:simpleType>
        				<xs:restriction base="xs:string">
        					<xs:pattern value="[0-9]{1-2}(.[0-9]{1}(.[0-9]{1}(.[0-9]{1-2})?)?)?"/>
        				</xs:restriction>
        			</xs:simpleType>
        		</xs:attribute>
        versucht, aber es scheint nicht zu funktionieren. Wie kann ich sonst angeben, dass alles Zahlen sein sollen, die in der Mitte einstellig, die "von aussen" eins- oder zweistellig?

        Comment


        • #5
          Ein fester Attributwert lässt sich ohne weitere Restriktion so erreichen:
          <xs:attribute name="name" use="required" fixed="core"/>

          Das gesuchte Muster:
          <xsattern value="\d{1,2}\.\d\.\d\.\d{1,2}"/>

          Der Punkt steht im RegEx für genau ein beliebiges Zeichen. Wenn der Punkt selbst gemeint ist, dann muss dieser mittels Backslash maskiert werden.

          Comment


          • #6
            Originally posted by Thomas Meinike View Post
            Ein fester Attributwert lässt sich ohne weitere Restriktion so erreichen:
            <xs:attribute name="name" use="required" fixed="core"/>
            So klappt das leider nicht. Ich entwickle mein Schema unter XML-Spy und dann lasse aus diesem zur Kontrolle eine XML-Datei erzeugen, und die mit 'fixed' gesetzten Attribute sind leider nicht in dem Dokument zu finden
            Danke für das Pattern

            Comment


            • #7
              Der einfachste Fall ohne weitere Kindelemente:
              Code:
              <xs:element name="scope">
                <xs:complexType>
                  <xs:attribute name="name" use="required" fixed="core"/>
                </xs:complexType>
              </xs:element>
              Damit sollte der Editor das Attribut mit Inhalt vorbelegen, ansonsten mal die Optionen prüfen.

              Comment


              • #8
                Das tut er auch nicht.
                Wo könnte ich diese Option finden? Unter Tools>Options sehe ich keine Einstellungen für die Konvertierung in XML....

                Comment


                • #9
                  Version 2007? Bei der 2006er gibt es unter Extras | Optionen > Bearbeiten einige Einstellungen für Elemente und Attribute. In dieser Version funktioniert das von Dir gewünschte Vorgaben auch problemlos -- das Attribut wird beim Erstellen eines neuen Dokuments automatisch mit dem fixed-Wert vorbelegt.

                  Comment


                  • #10
                    Moin,
                    ich habe tatsächlich die 2007er Version. Ich habe es jetzt auch bei mir zu Hause ausprobiert und es funktioniert leider auch nicht! Die fixed-Elemente werden nicht rangehängt, obwohl ich einen Hacken bei Extras>Optionen>Bearbeiten>"Pflicht-Child-Element an neue Elemente automatisch anhängen" Habe keine Idee woran es liegen kann
                    Habe auch versucht die 2006er Versuion zu installieren, aber es klappt leider nicht, da das Programm immer versucht, den Schlüssel per Internet zu aktiviren und sobald dieser Vorgang ausgeführt wird, wird automatisch in die 2007enterpreise - Version umgeschaltet.
                    Weißt da jemand vielleicht einen Ausweg??

                    Comment


                    • #11
                      Ok, ich habe die Lösung für mein xsd->xml-Problem zwar immernoch nicht gefunden, aber es ist halb so tragisch, da ich sowieso die xsd datei zur Validierung benutzen will und XMLSpy sollte mir nur dabei helfen, ein anständiges Schema zu entwickeln. Ich komme aber wieder auf das alte Problem von oben: in einem Schema habe ich mehrere <table>-Tags vorhanden, und jeder solcher Abschnitt besteht aus mehreren Spaltendefinitionen (<column>/<unique-column>-Tags). Ich habe überhaupt keine Ahnung wie es zu lösen ist.
                      So wie ich es oben beschrieben habe, geht das anscheinend doch nicht
                      Code:
                      <xs:complexType name="scope-type">
                      		<xs:sequence>
                      			<xs:element name="table" type="xs:ref_table"/>
                      			<xs:element name="table" type="xs:version_table"/>
                      		</xs:sequence>
                      		<xs:attribute name="name" use="required">
                      			<xs:simpleType>
                      				<xs:restriction base="xs:string">
                      					<xs:enumeration value="core"/>
                      				</xs:restriction>
                      			</xs:simpleType>
                      		</xs:attribute>
                      	</xs:complexType>
                      XML-Spy "meckert", dass die einzelnen <table>s nicht konsistent seien. Ich habe keine Ahnung, wie man es anders lösen könnte. Kann mir da jemand vielleicht mit einer Gedankenstütze helfen?

                      Comment


                      • #12
                        Es hat sich alles so ziemlich erledigt, bis auf n letztes Problemchen:

                        Nun habe ich folgende Frage:
                        Ist es möglich, in einem XML-Schema zu sagen: wenn der Name "x" genommen wurde, so muss dessen Wert so und so sein? Mein konkreter Fall zur Erleuchtung:

                        Ich habe Spalten (column-data), und jede Spalte hat einen Namen und einen Wert. Die zugelassenen/möglichen Namen habe ich mit restriction -> enumeration angegeben. Nun möchte ich noch sagen: Wenn der Name z.B. "ISOCode" ist, so muss er von diesem Typ sein. Geht das überhaupt?
                        (Es sollte im Endeffekt eine Applikation sein, die es dem Benutzer ermöglicht, den Inhalt einer .xml-Datei zu bearbeiten und ich möchte schon im Schema definieren welcher Wert in welcher Spalte stehen darf). Ich hoffe, es ist klar genug beschrieben

                        HTML Code:
                        <xs:element name="column-data" maxOccurs="unbounded">
                           <xs:complexType>
                        	<xs:attribute name="value" type="xs:string" use="required"/>
                        	<xs:attribute name="columnName" use="required">
                           	   <xs:simpleType>
                        	       <xs:restriction base="xs:string">
                          		    <xs:enumeration value="Comment"/>
                        	  	    <xs:enumeration value="ISOCode"/>
                        	. . .

                        Comment


                        • #13
                          So viele "Hits" und keiner weiß Bescheid? Ich habe auch in einem anderen Forum gefragt und mein eigentliches Problem lautet: Kann ich es hinkriegen, dass das Attribut (Value) vom obigen Beispiel vom Typ her dynamisch wird??

                          Comment

                          Working...
                          X