element einem XML Schema hinzufügen
hgento
- xml
0 Thomas J.S.0 hgento0 Thomas J.S.0 hgento
Hallo,
ich habe ein bestehendes xml dokument mit zugehörigem xsd schema. Ich möchte nun gerne das schema erweitern, da ich in der xml datei ein xinclude eingefügt habe. dazu habe ich ein neues schema mit einem neuen namespace erstellt und das alte schema über <import.... /> importiert. Dass funktioniert auch insofern ganz gut. Allerdings gibt es einen kleines Problem hinsichtlich der Erweiterung der XML.
Das root Element im original schema liegt so vor:
<element name="root">
<annotation>
<documentation>
This is the root.
</documentation>
</annotation>
<complexType>
<sequence>
<element ref="zu:xx" minOccurs="1" maxOccurs="unbounded"/>
<element ref="zu:yy" minOccurs="0" maxOccurs="unbounded"/>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="to:aa"/>
<element ref="to:bb"/>
<element ref="to:cc"/>
<element ref="to:dd"/>
</choice>
</sequence>
<attribute name="id" type="ID" use="optional"/>
<anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="lax"/>
</complexType>
</element>
Das Schema möchte bzw. kann ich nicht ändern. Wie kann ich nun in dem anderen Schema hinterlegen, das die xml Datei neben den elementen to:aa to:bb to:cc to:dd noch ein weiteres Element zulässig ist zb tx:ee . Ich könnte das Element tx:ee im zweiten Schema als
<element name="ee" substitutionGroup="to:ee">
.
.
</element>
definieren (funktioniert auch soweit). Allerdings hat dies den Nachteil, dass an dem Elemten to:aa einige Bedingungen hängen, die mich einschränken. Daher wuerde ich gern die choice gruppe um ein element erweitern und dann auch in der xml datei meine zusätzlichen Information unter diesem Element fortführen. Kann man das irgendwie in dem zwiten schema realisieren? Ich hoffe es war etwas verständlich.
Hallo,
Das root Element im original schema liegt so vor:
<element name="root">
[...]
</element>
Das Schema möchte bzw. kann ich nicht ändern. Wie kann ich nun in dem anderen Schema hinterlegen, das die xml Datei neben den elementen to:aa to:bb to:cc to:dd noch ein weiteres Element zulässig ist zb tx:ee
Nein, du hast keine Chance.
die Verwendung von Namensräumen sagt, dass in der Schema noch was anderes vorhanden ist (andere Schemas die inkludiert werden, sonst wäre es nicht möglich ein zu:xx zu referenzieren, denn ein <xs:element name="zu:xx"> ist nicht zulässig)das wiederum bedeutet einen tragetNamespace*
du könntest theoretisch zwar xs:redefine verwenden, aber nicht um Elemente zu redefinieren.
(link:http://www.edition-w3c.de/TR/2001/REC-xmlschema-1-20010502/#modify-schema])
* Und wenn der targetNamespace nicht derselbe ist wie in "deinem" schema geht es gar nicht.
Deshalb hast du keine Möglichkeit das root-Element nicht neu definieren.
. Ich könnte das Element tx:ee im zweiten Schema als
<element name="ee" substitutionGroup="to:ee">
.
.
</element>definieren (funktioniert auch soweit). Allerdings hat dies den Nachteil, dass an dem Elemten to:aa einige Bedingungen hängen, die mich einschränken.
Was hat die Definition von aa mit der Definition von 'wasauchimmer' zu tun (es sei denn, durch unique oder key/keyref)?
Grüße
Thomas
Hallo Thomas erst einmal natuerlich danke für die Antwort,
muesste aber noch einmal nachhaken. Also das original schema (original.xsd) importiert in der Tat weitere schemas über
<import namespace=".........." .... />
Das Original Schema lasse ich dann wiederum in mein schema importieren (mein.xsd). Mein schema ist nicht als solches im root element der xml Datei verankert und wird beim parsen zur Überprüfung hinzugefügt.
die definition vom root element steht an sich nicht in der original.xsd sondern wiederum in einem anderen schema (root.xsd), das in original.xsd importiert wird. Jetzt meine Frage, könnte man das schema, welches das root element (root.xsd) definiert mit einem neuen schema (kopie mit anpassung der möglichen elemente innerhalb des root elements) "überlagen". Etwa ein xsd:include mit rootneu.xsd in mein.xsd aufnehmen.
Und noch eine Frage zum redefine, weil ich über den Satz irgendwie stolpere:
"Solche Schemadokumente müssen entweder (a) den gleichen targetNamespace wie das <redefine> (neu definierte) Schemadokument oder (b) überhaupt keinen targetNamespace haben. Im letzteren Fall wird dann das <redefine> (neu definierte) Schemadokument in den targetNamespace des Schemadokuments konvertiert, in dem das <redefine> aufgerufen wurde"
Das heisst also, ein redefine von einem Element ist primär nur möglich, wenn das xsd schema den gleichen targetNamespace hat. Könnte ich dann nicht auch ein schema importieren (oder include?), was dem root.xsd entspricht und dort das ein redefine des root Element durchführen?
Würde mich über eine Antwort freuen, ansonsten bleibt mir nur das Experimentieren ;.(
Hallo,
muesste aber noch einmal nachhaken. Also das original schema (original.xsd) importiert in der Tat weitere schemas über
<import namespace=".........." .... />
Tja und daran scheiter es schon: denn diese andere Schemas haben sicherlich ein targetNamespace (ist ja auch mehr oder wenigen zwingend, damit man eben die dort definierten Elemente unterschieden kann)
Das Original Schema lasse ich dann wiederum in mein schema importieren (mein.xsd). Mein schema ist nicht als solches im root element der xml Datei verankert und wird beim parsen zur Überprüfung hinzugefügt.
Das verstehe ich nicht, du meinst im schemaLocation des XMLs ist nicht dein Schema angegeben?
die definition vom root element steht an sich nicht in der original.xsd sondern wiederum in einem anderen schema (root.xsd), das in original.xsd importiert wird. Jetzt meine Frage, könnte man das schema, welches das root element (root.xsd) definiert mit einem neuen schema (kopie mit anpassung der möglichen elemente innerhalb des root elements) "überlagen". Etwa ein xsd:include mit rootneu.xsd in mein.xsd aufnehmen.
Man könnte, genau für so etwas ist xs:redefine gedacht, aber ...
Und noch eine Frage zum redefine, weil ich über den Satz irgendwie stolpere:
"Solche Schemadokumente müssen entweder (a) den gleichen targetNamespace wie das <redefine> (neu definierte) Schemadokument oder (b) überhaupt keinen targetNamespace haben. Im letzteren Fall wird dann das <redefine> (neu definierte) Schemadokument in den targetNamespace des Schemadokuments konvertiert, in dem das <redefine> aufgerufen wurde"Das heisst also, ein redefine von einem Element ist primär nur möglich, wenn das xsd schema den gleichen targetNamespace hat. Könnte ich dann nicht auch ein schema importieren (oder include?), was dem root.xsd entspricht und dort das ein redefine des root Element durchführen?
... ja, entweder muss das Schema welches du mit xs:redefine einbindest auf denselben targetNamespace hinweisen (wie das Schema in dem du es einbindest) oder gar kein Namesraum (außer xs bzw. xsd) aufweisen.
Jedoch: auch das würde dir nicht helfen, denn auch mit xs:redefine kannst du keine Elemente nue definieren. Der Inhalt von xs:redefine kann nur (annotation | (simpleType | complexType | group | attributeGroup) sein.
Sprich: so lange das root-Element nicht als Typ deklariert ist, kannst du es nicht umdefinieren, egal ob du import oder redefine verwendest. (und so lange das root.xsd importiert und weitergereicht wird, hast du ein Element-Definition.)
Grüße
Thomas
Hallo,
muesste aber noch einmal nachhaken. Also das original schema
Danke natuerlich für die Antwort. Und ja stimmt. Das Problem liegt wohl daran, das das root Element nicht in der Art
<element name="root" typ="rootns:rootType"/>
<complexType name="rootType">
.
.
.
</complexType>
in der root.xsd geschrieben wurde. Sehr ärgerlich. Schade das es keine Möglichkeit gibt. ein rootneu.xsd zu importieren und es über das ebenfalls importierte root.xsd zu legen.
Danke dir trotzdem fuer die aufschlussreiche Abhandlung.
Gruß