simple nonamespaceschemalocation complex xml xsd schema

nonamespaceschemalocation - ¿Cuál es la diferencia entre la referencia y el tipo en un esquema XML?



xsd c# (3)

Dentro de un modelo de contenido, el xs:element element puede ser:

  1. Una declaración de elemento (que da el nombre y el tipo del elemento) o
  2. Una referencia a una declaración de elemento de nivel superior (que proporciona el nombre del elemento como una forma de identificarlo y aplazar la declaración real para el tipo).

(La misma alternancia de nombre / referencia se aplica a las declaraciones de atributos y referencias de atributos, y existe una dicotomía similar entre las definiciones de tipo en línea y las referencias a los tipos nombrados).

En su ejemplo, no hay una declaración de nivel superior para un elemento llamado Niño, por lo que el atributo ref falla. Espero que esto ayude.

Considere el siguiente esquema:

<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="Root"> <xs:sequence> <xs:element ref="Child" /> <xs:element name="Child2" type="Child" /> </xs:sequence> <xs:attribute ref="Att" /> <xs:attribute name="Att2" type="Att" /> </xs:complexType> <xs:complexType name="Child"> <xs:attribute ref="Att" /> </xs:complexType> <xs:attribute name="Att" type="xs:integer" /> </xs:schema>

La ref a "Niño" en la línea 6 falla, mientras que el type en la línea 7 se valida. Para el atributo, la ref tiene éxito mientras que el type falla. Estoy tratando de entender por qué.

Mi entendimiento de ref fue que simplemente se refería a otro elemento y especificó que espera ver una instancia del tipo referido (con el nombre dado en la definición) en esa ubicación. Obviamente estoy equivocado, entonces, ¿qué significa realmente ref ?


La diferencia significativa entre la referencia y el tipo es que con el tipo no puede ir más allá de un nivel, pero con la referencia puede usar un elemento que puede tener un nivel adicional y así sucesivamente.


Usando ref = ".." está "pegando" un elemento / atributo existente definido en el otro lugar. Al utilizar type = "..", está asignando alguna estructura (definida en complextype / simpletype) a nuevo elemento / atributo. Mira lo siguiente:

<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test"> <xs:complexType name="Root"> <xs:sequence> <xs:element ref="tst:Child" /> <xs:element name="Child2" type="tst:ChildType" /> </xs:sequence> <xs:attribute ref="tst:AttRef" /> <xs:attribute name="Att2" type="tst:AttType" /> </xs:complexType> <xs:complexType name="ChildType"> <xs:attribute ref="tst:AttRef" /> </xs:complexType> <xs:element name="Child"> </xs:element> <xs:simpleType name="AttType"> <xs:restriction base="xs:string"> <xs:maxLength value="10" /> </xs:restriction> </xs:simpleType> <xs:attribute name="AttRef" type="xs:integer" /> </xs:schema>