Bindungsunterstützung für das mixed-Attribut
Dieses Thema bezieht sich auf eine veraltete Technologie. XML-Webdienste und XML-Webdienstclients sollten nun mithilfe der folgenden Technologie erstellt werden: Windows Communication Foundation.
.NET Framework stellt partielle Bindungsunterstützung für das mixed-Attribut bereit.
Zum Definieren komplexer Typen mittels Erweiterung setzt das Tool Xsd.exe ein mixed="true"
-XML-Attribut mit einem Zeichenfolgen-Arrayfeld gleich, für das das XmlTextAttribute übernommen wurde.
Erklärung
Das mixed-Attribut kann im complexType-Element und im complexContent-Element angegeben werden. Der Wert true
zeigt an, dass das Element untergeordnete Elemente oder Textkörper (d. h. nicht typisierte Zeichendaten) oder eine Kombination aus beidem enthalten kann.
Entsprechend dem XML-Schema überschreibt der mixed-Wert für <complexContent> den mixed-Wert für <complexType>. Sofern vorhanden, ist das <complexContent>-Element das einzige untergeordnete Element des <complexType>-Elements.
Xsd.exe ordnet eine true
-Einstellung beim mixed-Attribut einem Zeichenfolgen-Arrayfeld mit einem System.Xml.Serialization.XmlTextAttribute-Attribut wie folgt zu:
[System.Xml.Serialization.XmlTextAttribute()]
public string[] Text;
Das XmlText-Attribut weist die XmlSerializer-Klasse an, einen Klassenmember als Textkörper zu serialisieren. Die Bindung funktioniert in beiden Richtungen: beim Generieren einer XSD-Datei aus Klassen und beim Generieren von Quellcode aus einer XSD-Datei.
Typableitung mittels Erweiterung
Die XML-Schemaspezifikation verbietet das Umschalten zwischen gemischtem Inhalt und Nur-Element-Inhalt mit Erweiterung:
Das XML-Schema verbietet das Erstellen komplexer Typen mit gemischtem Inhalt durch Erweiterung komplexer Typen mit nicht gemischten untergeordneten Elementen.
Das XML-Schema verbietet das Erstellen komplexer Typen mit nicht gemischten untergeordneten Elementen durch Erweiterung komplexer Typen mit gemischtem Inhalt.
Wenn Xsd.exe beim Generieren von Quellcode aus einem XML-Schemadokument eine dieser unzulässigen Erweiterungen findet, gibt es folgende Warnmeldung aus:
Schemavalidierungswarnung: Der abgeleitete Typ und der Basistyp müssen den gleichen Inhaltstyp aufweisen.
Gleichzeitig platziert Xsd.exe das zuvor beschriebene Zeichenfolgen-Arrayfeld mit XmlText-Attribut in der abgeleiteten Klasse, wo der gemischte Inhalt eingeführt wird. Dies veranlasst alle Nachfolger, gemischten Inhalt aufzuweisen.
Die vorhergehende Warnung wird ausgegeben, wenn ein komplexer Vorgängertyp untergeordnete Elemente hat und ein komplexer Nachfolgertyp mixed="true"
angibt. Die Warnung wird auch ausgegeben, wenn ein komplexer Vorgängertyp einen true
-Wert für das mixed-Attribut angibt und ein komplexer Nachfolgertyp weder im <complexContent>-Element noch im <complexType>-Element ausdrücklich einen true
-Wert angibt.
Im Allgemeinen legt Xsd.exe beim Generieren eines XML-Schemadokuments aus einem Satz an Klassen in einer Assembly das mixed-Attribut in folgenden Elementen auf true
fest:
<complexType>: Für den komplexen Typ, bei dem der gemischte Inhalt eingeführt wird. Der Typ entspricht derjenigen Klasse, die das Zeichenfolgen-Arrayfeld mit einem XmlText-Attribut enthält. Damit das Schema gültig ist, muss der Datentyp kein komplexer Basistyp sein, wie in diesem Thema an späterer Stelle noch erklärt wird.
<complexContent>: Für komplexe Nachfolgertypen.
Dennoch akzeptiert Xsd.exe beim Verwenden eines XML-Schemadokuments <complexType mixed="true">
zum Anzeigen von geerbtem, gemischtem Inhalt für Nachfolgertypen sogar dann, wenn der Standard <complexContent mixed="false">
dies überschreiben sollte. Bei der Rückübersetzung aus dem generierten Code wird die erwartete Form wie folgt wiederhergestellt:
<complexType>
<complexContent mixed="true">
...
</complexContent>
</complexType>
Es gibt genau einen Fall, bei dem gemischter Inhalt in einen abgeleiteten komplexen Typ eingeführt werden kann: wenn der komplexe Basistyp keine untergeordneten Elemente enthält (er kann aber Attribute enthalten). Zugleich ist das aber genau die Situation, in der Xsd.exe bei einer Round-Trip-Übersetzung ein XML-Schema mit abweichender Bedeutung erzeugt.
Der abgeleitete Typ, der gemischten Inhalt einführt, sollte wie folgt angegeben werden:
<complexType>
<complexContent mixed="true">
...
</complexContent>
</complexType>
Bei der Rückübersetzung vertauscht Xsd.exe die Platzierung von mixed="true"
, wie aus nachfolgendem Auszug ersichtlich ist:
<complexType mixed="true">
<complexContent mixed="false">
...
</complexContent>
</complexType>
Gemäß XML-Schema sollte hier der false
-Wert für das <complexContent>-Element den true
-Wert für das <complexType> -Element überschreiben, sodass der Inhalt des abgeleiteten Typs nicht mehr gemischt ist und damit der ursprünglichen Absicht widerspricht.
Der Fehler tritt auf, weil beim komplexen Typ, bei dem der gemischte Inhalt eingeführt wird, Xsd.exe stets das mixed-Attribut im <complexType>-Element auf true
festlegt (nicht im <complexContent>-Element, sofern vorhanden).
Dennoch, wenn Xsd.exe diese umgekehrte Ausgabe als Eingabe entgegennimmt, interpretiert es den abgeleiteten Typ einheitlich als Einführung gemischten Inhalts; daher wird das Zeichenfolgen-Arrayfeld mit dem XmlText-Attribut zu einem Member der entsprechenden Klasse gemacht. Wie zuvor erwähnt, akzeptiert Xsd.exe <complexType mixed="true">
zum Anzeigen von geerbtem, gemischtem Inhalt für Nachfolgertypen sogar dann, wenn <complexContent mixed="false>
dies überschreiben sollte.
Typableitung durch Einschränkung
Das XML-Schema erlaubt die Einschränkung komplexer Typen mit gemischtem Inhalt zwecks Ableitung komplexer Typen mit untergeordneten, nicht gemischten Elementen. .NET Framework erkennt jedoch keine Einschränkung des komplexen Typs. Stattdessen erstellt Xsd.exe eine leere Klasse, die von der Basisklasse erbt. Siehe die Ausführungen zum <restriction>-Element.
Mögliche übergeordnete Elemente: <complexContent>, <complexType>
Siehe auch
Verweis
System.Xml.Schema.XmlSchemaComplexContent.IsMixed
System.Xml.Schema.XmlSchemaComplexType.IsMixed