Compatibilidad con enlaces del elemento ComplexType
Este tema es específico de una tecnología heredada. Ahora, los servicios Web XML y los clientes de servicios Web XML deben crearse con Windows Communication Foundation.
.NET Framework proporciona compatibilidad de enlace para el elemento <complexType> .
La herramienta Xsd.exe equipara los tipos complejos del esquema XML con tipos de .NET Framework cuyas propiedades o campos públicos representan el contenido del tipo complejo.
Explicación
La herramienta Xsd.exe equipara los tipos complejos del esquema XML con tipos de .NET Framework cuyos campos públicos representan el contenido del tipo complejo.
Atributo abstract
Un tipo complejo se declara abstracto (abstract="true"
) para garantizar que solo aparecen en un documento compatible con XML las instancias de tipos derivados, y no las instancias del tipo base abstracto.
Xsd.exe equipara un tipo complejo abstracto con una clase abstracta. La conversión funciona en ambas direcciones entre el código y los documentos XSD.
Aparte del uso de la palabra clave abstract, la clase abstracta se trata como una clase base no abstracta. Las clases secundarias extienden la clase base. Xsd.exe aplica a la clase abstracta un System.Xml.Serialization.XmlIncludeAttributepara cada una de las clases descendientes. Cada atributo XmlInclude especifica el tipo de la clase descendiente.
Ejemplo: Atributo abstract
En el siguiente ejemplo de código se muestra cómo usar el atributo abstract con el elemento <complexType>.
Documento de esquema XML de entrada:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/" xmlns="http://example.org/" elementFormDefault="qualified">
<xsd:element name="FamilyNode" type="FamilyNodeType" />
<xsd:complexType name="FamilyNodeType">
<xsd:sequence>
<xsd:element name="Code" type="xsd:string" />
<xsd:element name="Parent" type="Parent" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Daughter">
<xsd:complexContent>
<xsd:extension base="Parent">
<xsd:sequence>
<xsd:element name="Date" type="xsd:dateTime" minOccurs="0"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Son">
<xsd:complexContent>
<xsd:extension base="Parent">
<xsd:sequence>
<xsd:element name="Info" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Parent" abstract="true">
<xsd:sequence>
<xsd:element name="Text" type="xsd:normalizedString" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Grandchild">
<xsd:complexContent>
<xsd:extension base="Daughter">
<xsd:attribute name="Parent" type="xsd:normalizedString" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
Las clases de C# generadas a partir del documento del esquema XML anterior:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlRootAttribute("FamilyNode", Namespace="http://example.org/", IsNullable=false)]
public class FamilyNodeType {
public string Code;
public Parent Parent;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Son))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Daughter))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public abstract class Parent {
[System.Xml.Serialization.XmlElementAttribute(DataType="normalizedString")]
public string Text;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Son : Parent {
public string Info;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Grandchild))]
public class Daughter : Parent {
public System.DateTime Date;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool DateSpecified;
}
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://example.org/")]
public class Grandchild : Daughter {
[System.Xml.Serialization.XmlAttributeAttribute("Parent", DataType="normalizedString")]
public string Parent1;
}
El esquema XML generado a partir de clases compiladas del código fuente de C# anterior es en la práctica equivalente al esquema XML original.
Atributos posibles | Compatibilidad de enlace |
---|---|
abstract |
La utilidad Xsd.exe equipara un tipo complejo abstracto, identificado por Vea la sección anterior, Abstract Attribute. |
block |
El atributo block se puede aplicar a un tipo de datos para impedir que los tipos derivados ocupen el lugar del tipo original donde se especifica el original. La herramienta Xsd.exe omite el atributo block, así como el atributo blockDefault del elemento Compatibilidad con enlaces del elemento Schema |
final |
El atributo final se puede aplicar a un tipo de datos para que no se derive. Xsd.exe omite el atributo final, así como el atributo finalDefault del elemento <esquema>>. |
id |
La utilidad Xsd.exe omite el atributo id, que está pensado para proporcionar un identificador único. En su lugar, Xsd.exe reconoce el atributo name. |
mixed |
Vea el atributo mixed. |
nombre |
El valor del atributo name se convierte en el nombre del tipo de .NET Framework que Xsd.exe genera a partir del tipo complejo. Para cumplir con las convenciones de codificación no se intenta ningún cambio de mayúsculas y minúsculas. Por ejemplo, si el atributo de nombre de un elemento <complexType> tiene el valor Cuando Xsd.exe genera una definición <complexType> a partir de una clase, utiliza el nombre de clase para el valor del atributo name. Se puede proporcionar un nombre alternativo (valor de atributo name) a través de la propiedad TypeName. Consulte el atributo Compatibilidad con enlaces del atributo Name. |
Elementos primarios posibles: <element>, <redefine>, <schema>
Elementos secundarios posibles: <all>, <annotation>, <anyAttribute>, <attribute>, <attributeGroup>, <choice>, <complexContent>, <group>, <sequence>, <simpleContent>