DevSupportDocs/xsd.md

134 lines
4.0 KiB
Markdown

## Documentación XML Schema (XSD)
### Definición
XSD (XML Schema Definition) es un lenguaje, también llamado simplemente XML Schema, que sirve para definir la estructura de un documento XML, permitiendo su validación.
### Declaracion de un archivo XSD y su vinculacion al XML
#### Sin espacio de nombres asociado
Al usar la etiqueta noNamespaceSchemaLocation, podemos usar un archivo xsd sin namespace asociado
```xml
<?xml version="1.0" encoding="utf-8"?>
<!-- archivo.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="etiqueta_raiz">
<!-- Contenido -->
</xs:element>
</xs:schema>
```
```xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!-- archivo.xml -->
<etiqueta_raiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="archivo.xsd">
<contenido/>
</etiqueta_raiz>
```
#### Con espacio de nombres personalizado
schemaLocation necesita dos valores:
- La url del espacio de nombres.
- La ubicacion del archivo con el esquema del espacio de nombres.
```xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!-- archivo.xml -->
<custom:etiqueta_raiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://custom.url archivo.xsd"
xmlns:custom="https://custom.url">
<custom:contenido/>
</custom:etiqueta_raiz>
```
- targetNamespace define el espacio de nombres para este esquema.
- xmlns especifica que este es el espacio de nombres por defecto.
- elementFormDefault indica que todos los elementos tienen que llevar el espacio de nombres (qualified) o no es necesario que lo lleven (unqualified)
```xml
<?xml version="1.0" encoding="utf-8"?>
<!-- archivo.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://custom.url"
xmlns="https://custom.url"
elementFormDefault="qualified">
<xs:element name="etiqueta_raiz">
<!-- Contenido -->
</xs:element>
</xs:schema>
```
### Estructura y elementos
#### Elementos simples
Los elementos simples solo pueden contener texto. La diferencia entre fixed y default es que en que con fixed, el valor no se puede modificar, tiene que ser ese, y con default si es modificable.
```xml
<xs:element name="nombre_del_elemento" type="xs:tipo_de_dato"/>
<xs:element name="nombre_del_elemento" type="xs:tipo_de_dato" {fixed|default}="cadena"/>
```
#### Atributos
##### Simples
```xml
<!-- Simple -->
<xs:attribute name="nombre_del_atributo" type="xs:tipo_de_dato"/>
<!-- Con valor por defecto -->
<xs:attribute name="nombre_del_atributo" type="xs:tipo_de_dato" default="valor"/>
<!-- Con valor fijo -->
<xs:attribute name="nombre_del_atributo" type="xs:tipo_de_dato" fixed="valor"/>
<!-- Obligatorio (por defecto es opcional-->
<xs:attribute name="nombre_del_atributo" type="xs:tipo_de_dato" use="required"/>
<!-- Con faceta -->
<xs:attribute name="nombre_atributo">
<xs:simpleType>
<xs:restriction base="xs:tipo_de_dato">
<xs:pattern value="[A-D]{3}\d"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
```
##### Complejos
```xml
<!-- Elemento complejo vacio, con atributos -->
<xs:element name="nombre_elemento">
<xs:complexType>
<xs:attribute name="nombre_atributo" type="xs:tipo_de_dato"/>
</xs:complexType>
</xs:element>
<!-- Elemento complejo con elementos, y atributos -->
<xs:element name="nombre_elemento">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre_elemento" type="xs:tipo_de_dato"/>
</xs:sequence>
<xs:attribute name="nombre_atributo" type="xs:tipo_de_dato"/>
</xs:complexType>
</xs:element>
<!-- Elemento complejo con texto, y atributos -->
<!-- Elemento complejo con elementos, texto, y atributos -->
<xs:element name="nombre_elemento">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="nombre_elemento" type="xs:tipo_de_dato"/>
</xs:sequence>
<xs:attribute name="nombre_atributo" type="xs:tipo_de_dato"/>
</xs:complexType>
</xs:element>
```