XSD - Guía rápida
La definición de esquema XML, comúnmente conocida como XSD, es una forma de describir con precisión el lenguaje XML. XSD verifica la validez de la estructura y el vocabulario de un documento XML con las reglas gramaticales del lenguaje XML apropiado.
Un documento XML se puede definir como:
Well-formed- Si se adhiere el documento XML en todo el XML Normas generales tales como etiquetas deben estar correctamente anidados, apertura y de cierre deben estar equilibrados, y las etiquetas vacías deben terminar con '/>', entonces se llama como bien formada .
OR
Valid- Un documento XML que se dice que es válido cuando no solo está bien formado , sino que también se ajusta al XSD disponible que especifica qué etiquetas usa, qué atributos pueden contener esas etiquetas y qué etiquetas pueden aparecer dentro de otras etiquetas, entre otras propiedades .
El siguiente diagrama muestra cómo se usa XSD para estructurar documentos XML:
Aquí hay un código XSD simple. Mira esto.
<?xml version = "1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
targetNamespace = "http://www.tutorialspoint.com"
xmlns = "http://www.tutorialspoint.com"
elementFormDefault = "qualified">
<xs:element name = 'class'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'student' type = 'StudentType' minOccurs = '0'
maxOccurs = 'unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name = "StudentType">
<xs:sequence>
<xs:element name = "firstname" type = "xs:string"/>
<xs:element name = "lastname" type = "xs:string"/>
<xs:element name = "nickname" type = "xs:string"/>
<xs:element name = "marks" type = "xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>
</xs:schema>
Caracteristicas
Aquí hay una lista de algunas de las características populares de XSD:
- Los XSD se pueden ampliar para futuras adiciones.
- XSD es más rico y poderoso que DTD.
- XSD está escrito en XML.
- XSD admite tipos de datos.
- XSD admite espacios de nombres.
- XSD es la recomendación de W3C.
Un XML XSD se guarda en un documento separado y luego el documento se puede vincular a un documento XML para usarlo.
Sintaxis
La sintaxis básica de un XSD es la siguiente:
<?xml version = "1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
targetNamespace = "http://www.tutorialspoint.com"
xmlns = "http://www.tutorialspoint.com" elementFormDefault = "qualified">
<xs:element name = 'class'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'student' type = 'StudentType' minOccurs = '0'
maxOccurs = 'unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name = "StudentType">
<xs:sequence>
<xs:element name = "firstname" type = "xs:string"/>
<xs:element name = "lastname" type = "xs:string"/>
<xs:element name = "nickname" type = "xs:string"/>
<xs:element name = "marks" type = "xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>
</xs:schema>
Elemento <Schema>
El esquema es el elemento raíz de XSD y siempre es necesario.
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
El fragmento anterior especifica que los elementos y tipos de datos utilizados en el esquema se definen en http://www.w3.org/2001/XMLSchema espacio de nombres y estos elementos / tipos de datos deben tener el prefijo xs. Siempre es obligatorio.
targetNamespace = "http://www.tutorialspoint.com"
El fragmento anterior especifica que los elementos utilizados en este esquema se definen en espacio de nombres. Es opcional.
xmlns = "http://www.tutorialspoint.com"
El fragmento anterior especifica que el espacio de nombres predeterminado es .
elementFormDefault = "qualified"
El fragmento anterior indica que cualquier elemento declarado en este esquema debe estar calificado como espacio de nombres antes de usarlo en cualquier documento XML. Es opcional.
Esquema de referencia
Eche un vistazo al siguiente esquema de referencia:
<?xml version = "1.0"?>
<class xmlns = "http://www.tutorialspoint.com"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
xmlns = "http://www.tutorialspoint.com"
El fragmento anterior especifica la declaración de espacio de nombres predeterminada. El validador de esquemas utiliza este espacio de nombres y comprueba que todos los elementos forman parte de este espacio de nombres. Es opcional.
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">
Después de definir XMLSchema-instance xsi, use schemaLocationatributo. Este atributo tiene dos valores, espacio de nombres y ubicación del esquema XML, que se utilizarán separados por un espacio. Es opcional.
Usaremos un validador XSD basado en Java para validar students.xml en contra de students.xsd.
estudiantes.xml
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
estudiantes.xsd
<?xml version = "1.0"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<xs:element name = 'class'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'student' type = 'StudentType' minOccurs = '0'
maxOccurs = 'unbounded' />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name = "StudentType">
<xs:sequence>
<xs:element name = "firstname" type = "xs:string"/>
<xs:element name = "lastname" type = "xs:string"/>
<xs:element name = "nickname" type = "xs:string"/>
<xs:element name = "marks" type = "xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>
</xs:schema>
XSDValidator.java
import java.io.File;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
public class XSDValidator {
public static void main(String[] args) {
if(args.length !=2){
System.out.println("Usage : XSDValidator <file-name.xsd> <file-name.xml>" );
} else {
boolean isValid = validateXMLSchema(args[0],args[1]);
if(isValid){
System.out.println(args[1] + " is valid against " + args[0]);
} else {
System.out.println(args[1] + " is not valid against " + args[0]);
}
}
}
public static boolean validateXMLSchema(String xsdPath, String xmlPath){
try {
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File(xsdPath));
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File(xmlPath)));
} catch (IOException e){
System.out.println("Exception: "+e.getMessage());
return false;
} catch(SAXException e1){
System.out.println("SAX Exception: "+e1.getMessage());
return false;
}
return true;
}
}
Pasos para validar XML contra XSD
Copia el XSDValidator.java archivar en cualquier ubicación, digamos E: > java
Copia el students.xml a la misma ubicación E: > java
Copia el students.xsd a la misma ubicación E: > java
Compilar XSDValidator.javausando la consola. Asegúrese de tener JDK 1.5 en adelante instalado en su máquina y que las rutas de clases estén configuradas. Para obtener detalles sobre cómo utilizar JAVA, consulte el tutorial de JAVA
E:\java\javac XSDValidator.java
Ejecutar XSDValidator con students.xsd y students.xml pasado como argumento.
E:\java\java XSDValidator students.xsd students.xml
Verificar la salida
Verá el siguiente resultado:
students.xml is valid against students.xsd
En este capítulo, veremos los tipos simples que define XSD.
S.No. | Tipo y descripción simples |
---|---|
1 | El elemento simple solo puede contener texto. No puede contener ningún otro elemento. |
2 | El atributo es en sí mismo un tipo y se utiliza en Elemento complejo. |
3 | La restricción define los valores aceptables de un elemento XML. |
El elemento complejo es un elemento XML que puede contener otros elementos y / o atributos. Podemos crear un elemento complejo de dos formas:
Defina un tipo complejo y luego cree un elemento usando el type atributo
Definir un tipo complejo directamente nombrando
Defina un tipo complejo y luego cree un elemento usando el atributo de tipo.
<xs:complexType name = "StudentType">
<xs:sequence>
<xs:element name = "firstname" type = "xs:string"/>
<xs:element name = "lastname" type = "xs:string"/>
<xs:element name = "nickname" type = "xs:string"/>
<xs:element name = "marks" type = "xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>
<xs:element name = 'student' type = 'StudentType' />
Defina un tipo complejo directamente nombrando.
<xs:element name = "student">
<xs:complexType>
<xs:sequence>
<xs:element name = "firstname" type = "xs:string"/>
<xs:element name = "lastname" type = "xs:string"/>
<xs:element name = "nickname" type = "xs:string"/>
<xs:element name = "marks" type = "xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>
<xs:element>
A continuación se muestra la lista de tipos complejos que admite XSD.
S.No. | Tipo y descripción simples |
---|---|
1 | Complejo El elemento de tipo complejo vacío solo puede tener atributos pero no contenido. |
2 | El elemento de tipo complejo solo elementos solo puede contener elementos |
3 | El elemento de tipo complejo de solo texto solo puede contener atributos y texto. |
4 | El elemento de tipo complejo mixto puede contener elemento, atributo y texto. |
5 | Los indicadores controlan las formas en que se organizarán los elementos en un documento XML. |
6 | El elemento <any> se usa para elementos que no están definidos por el esquema |
7 | El atributo <anyAttribute> se usa para atributos que no están definidos por el esquema. |
Los tipos de datos de cadena se utilizan para representar caracteres en los documentos XML.
<xs: string> tipo de datos
El tipo de datos <xs: string> puede tomar caracteres, avances de línea, retornos de carro y tabulaciones. El procesador XML no reemplaza los avances de línea, los retornos de carro y los caracteres de tabulación en el contenido con espacio y los mantiene intactos. Por ejemplo, se conservan varios espacios o tabulaciones durante la visualización.
<xs: string> Ejemplo
Declaración de elemento en xsd -
<xs:element name = "name" type = "xs:string"/>
Uso de elementos en xml -
<name>Dinkar</name>
<name>Dinkar Kad</name>
<xs: token> tipo de datos
El tipo de datos <xs: token> se deriva del tipo de datos <string> y puede tomar caracteres, avances de línea, retornos de carro y tabulaciones. El procesador XML eliminará los avances de línea, las pestañas, los retornos de carro, los espacios iniciales y finales y varios espacios.
<xs: token> Ejemplo
Declaración de elemento en xsd -
<xs:element name = "name" type = "xs:token"/>
Uso de elementos en xml -
<name>Dinkar</name>
<name>Dinkar Kad</name>
Tipos de datos de cadena
A continuación se muestra la lista de tipos de datos de uso común que se derivan del tipo de datos <string>.
S.No. | Nombre y descripción |
---|---|
1 | ID Representa el atributo ID en XML y se usa en atributos de esquema. |
2 | IDREF Representa el atributo IDREF en XML y se utiliza en atributos de esquema. |
3 | language Representa una identificación de idioma válida |
4 | Name Representa un nombre XML válido |
5 | NMTOKEN Representa un atributo NMTOKEN en XML y se usa en atributos de esquema. |
6 | normalizedString Representa una cadena que no contiene avances de línea, retornos de carro ni tabulaciones. |
7 | string Representa una cadena que puede contener avances de línea, retornos de carro o tabulaciones. |
8 | token Representa una cadena que no contiene avances de línea, retornos de carro, tabulaciones, espacios iniciales o finales, o espacios múltiples. |
Restricciones
Los siguientes tipos de restricciones se pueden usar con tipos de datos de cadena:
- enumeration
- length
- maxLength
- minLength
- pattern
- whiteSpace
Los tipos de datos de fecha y hora se utilizan para representar la fecha y la hora en los documentos XML.
<xs: fecha> tipo de datos
El tipo de datos <xs: date> se utiliza para representar la fecha en formato AAAA-MM-DD.
YYYY - representa el año
MM - representa el mes
DD - representa el día
<xs: date> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "birthdate" type = "xs:date"/>
Uso de elementos en XML -
<birthdate>1980-03-23</birthdate>
<xs: time> tipo de datos
El tipo de datos <xs: time> se utiliza para representar la hora en formato hh: mm: ss.
hh - representa horas
mm - representa minutos
ss - representa segundos
<xs: time> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "startTime" type = "xs:time"/>
Uso de elementos en XML -
<startTime>10:20:15</startTime>
<xs: datetime> tipo de datos
El tipo de datos <xs: datetime> se utiliza para representar la fecha y la hora en formato AAAA-MM-DDThh: mm: ss.
YYYY - representa el año
MM - representa el mes
DD - representa el día
T - representa la sección de inicio de tiempo
hh - representa horas
mm - representa minutos
ss - representa segundos
<xs: datetime> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "startTime" type = "xs:datetime"/>
Uso de elementos en XML -
<startTime>1980-03-23T10:20:15</startTime>
<xs: duration> tipo de datos
El tipo de datos <xs: duration> se utiliza para representar el intervalo de tiempo en formato PnYnMnDTnHnMnS. Cada componente es opcional excepto P.
P - representa la sección de inicio de la fecha
nY - representa el año
nM - representa el mes
nD - representa el día
T - representa la sección de inicio de tiempo
nH - representa horas
nM - representa minutos
nS - representa segundos
<xs: duration> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "period" type = "xs:duration"/>
Uso de elementos en xml para representar un período de 6 años, 3 meses, 10 días y 15 horas.
<period>P6Y3M10DT15H</period>
Tipos de datos de fecha
A continuación se muestra la lista de tipos de datos de fecha más utilizados.
S.No. | Nombre y descripción |
---|---|
1. | date Representa un valor de fecha |
2. | dateTime Representa un valor de fecha y hora |
3. | duration Representa un intervalo de tiempo |
4. | gDay Representa una parte de una fecha como el día (DD) |
5. | gMonth Representa una parte de una fecha como el mes (MM) |
6. | gMonthDay Representa una parte de una fecha como mes y día (MM-DD) |
7. | gYear Representa una parte de una fecha como el año (AAAA) |
8. | gYearMonth Representa una parte de una fecha como el año y el mes (AAAA-MM) |
9. | time Representa un valor de tiempo |
Restricciones
Los siguientes tipos de restricciones se pueden utilizar con los tipos de datos de fecha:
- enumeration
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- whiteSpace
Los tipos de datos numéricos se utilizan para representar números en documentos XML.
<xs: decimal> tipo de datos
El tipo de datos <xs: decimal> se utiliza para representar valores numéricos. Admite números decimales de hasta 18 dígitos.
<xs: decimal> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "score" type = "xs:decimal"/>
Uso de elementos en XML -
<score>9.12</score>
<xs: integer> tipo de datos
El tipo de datos <xs: integer> se utiliza para representar valores enteros.
<xs: integer> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "score" type = "xs:integer"/>
Uso de elementos en XML -
<score>9</score>
Tipos de datos numéricos
A continuación se muestra la lista de tipos de datos numéricos de uso común.
S.No. | Nombre y descripción |
---|---|
1. | byte Un entero de 8 bits con signo |
2. | decimal Un valor decimal |
3. | int Un entero de 32 bits con signo |
4. | integer Un valor entero |
5. | long Un entero de 64 bits con signo |
6. | negativeInteger Un número entero que solo tiene valores negativos (.., - 2, -1) |
7. | nonNegativeInteger Un número entero que solo tiene valores no negativos (0,1,2, ..) |
8. | nonPositiveInteger Un número entero que solo tiene valores no positivos (.., - 2, -1,0) |
9. | positiveInteger Un número entero que solo tiene valores positivos (1,2, ..) |
10. | short Un entero de 16 bits con signo |
11. | unsignedLong Un entero de 64 bits sin signo |
12. | unsignedInt Un entero de 32 bits sin signo |
13. | unsignedShort Un entero de 16 bits sin signo |
14. | unsignedByte Un entero de 8 bits sin signo |
Restricciones
Los siguientes tipos de restricciones se pueden utilizar con los tipos de datos de fecha:
- enumeration
- fractionDigits
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- totalDigits
- whiteSpace
XSD tiene algunos otros tipos de datos importantes, como Boolean, binary, y anyURI.
<xs: boolean> tipo de datos
El tipo de datos <xs: boolean> se utiliza para representar el valor verdadero, falso, 1 (para verdadero) o 0 (para falso).
<xs: boolean> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "pass" type = "xs:boolean"/>
Uso de elementos en XML -
<pass>false</pass>
Tipos de datos binarios
Los tipos de datos binarios se utilizan para representar valores binarios. Dos tipos binarios son de uso común.
base64Binary - representa datos binarios codificados en base64
hexBinary - representa datos binarios codificados en hexadecimal
<xs: hexbinary> Ejemplo
Declaración de elemento en XSD -
<xs:element name = "blob" type = "xs:hexBinary"/>
Uso de elementos en XML -
<blob>9FEEF</blob>
<xs: anyURI> tipo de datos
El tipo de datos <xs: anyURI> se utiliza para representar URI.
<xs: anyURI> Ejemplo
Declaración de elemento en XSD -
<xs:attribute name = "resource" type = "xs:anyURI"/>
Uso de elementos en XML -
<image resource = "http://www.tutorialspoint.com/images/smiley.jpg" />
Tipos de datos numéricos
A continuación se muestra la lista de tipos de datos numéricos de uso común.
S.No. | Nombre y descripción |
---|---|
1. | byte Un entero de 8 bits con signo |
2. | decimal Un valor decimal |
3. | int Un entero de 32 bits con signo |
4. | integer Un valor entero |
5. | long Un entero de 64 bits con signo |
6. | negativeInteger Un número entero que solo tiene valores negativos (.., - 2, -1) |
7. | nonNegativeInteger Un número entero que solo tiene valores no negativos (0,1,2, ..) |
8. | nonPositiveInteger Un número entero que solo tiene valores no positivos (.., - 2, -1,0) |
9. | positiveInteger Un número entero que solo tiene valores positivos (1,2, ..) |
10. | short Un entero de 16 bits con signo |
11. | unsignedLong Un entero de 64 bits sin signo |
12. | unsignedInt Un entero de 32 bits sin signo |
13. | unsignedShort Un entero de 16 bits sin signo |
14. | unsignedByte Un entero de 8 bits sin signo |
Restricciones
Los siguientes tipos de restricciones se pueden usar con tipos de datos varios, excepto en el tipo de datos booleanos:
- enumeration
- length
- maxLength
- minLength
- pattern
- whiteSpace