Ich habe einen Knoten in einer
XML-Datei, für den es zwei Darstellungsmöglichkeiten gibt. Einmal so:
Code:
<plugin parent="ParentName" child="ChildName1"/>
<plugin parent="ParentName" child="ChildName2"/>
<plugin parent="ParentName" child="ChildName3"/>
und dann so:
Code:
<plugin parent="ParentName">
<child name="ChildName1"/>
<child name="ChildName2"/>
<child name="ChildName3"/>
</plugin>
Um nicht zu technisch zu werden: Das hat mit meinem Help 2.0-Registrierungstool zu tun. In der ersten Variante wird der ParentName-Namespace geöffnet, das Plugin (ChildName?) wird referenziert, und dann wird der Parent geschlossen und
gemergt. Dann kommt das nächste Plugin, usw. usw. In der zweiten Variante wird der Parent geöffnet, dann werden die Child-Namespaces alle in einem Durchgang referenziert, und dann wird der Parent geschlossen und nur ein einziges Mal
gemergt. Die Zeit verkürzt sich also im besten Fall. Aber wie gesagt, das ist Programminterna und hat mit der Validierung der
XML-Steuerdatei nichts zu tun.
Ich möchte jetzt nur sicherstellen, dass entweder Variante 1
oder Variante 2 als gültig anerkannt wird. Aber nicht beide gleichzeitig! Wenn so was in der Datei steht:
Code:
<plugin parent="ParentName" child="ChildName1">
<child name="ChildName2"/>
</plugin>
oder so was:
Code:
<plugin parent="ParentName"/>
dann soll der Validierungsvorgang den Fehler anzeigen. Okay, das würde der
XML-Parser von sich aus übernehmen,
wenn die Deklaration in der XSD-Datei passt. Und genau da grübele ich gerade. Für die Variante 1 würde das so aussehen:
XML-Code:
<xs:element name="plugin">
<xs:complexType>
<xs:attribute name="parent" type="xs:string" use="required"/>
<xs:attribute name="child" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
Aber wie kriege ich das hin, dass er auch Variante 2 akzeptiert. Nochmal deklarieren à la:
XML-Code:
<xs:element name="plugin">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element ref="child"/>
</xs:sequence>
<xs:attribute name="parent" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="child">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
geht nicht, weil "plugin" ja schon als Name für die Deklaration der ersten Variante benutzt wird. Ich könnte auch beides verbinden,
XML-Code:
<xs:element name="plugin">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element ref="child"/>
</xs:sequence>
<xs:attribute name="parent" type="xs:string" use="required"/>
<xs:attribute name="child" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
aber dann darf das "child"-Attribut natürlich nicht mehr
required sein, sondern es muss sich mit dem <child>-Unterknoten irgendwie gegenseitig ausschließen. Geht so was?