XSD - Guia rápido
A definição de esquema XML, comumente conhecida como XSD, é uma maneira de descrever precisamente a linguagem XML. O XSD verifica a validade da estrutura e do vocabulário de um documento XML em relação às regras gramaticais da linguagem XML apropriada.
Um documento XML pode ser definido como -
Well-formed- Se o documento XML aderir a todas as regras XML gerais, como tags, devem ser aninhadas corretamente, as tags de abertura e fechamento devem ser balanceadas e as tags vazias devem terminar com '/>', então ele é chamado de bem formado .
OR
Valid- Um documento XML considerado válido quando não é apenas bem formado , mas também está em conformidade com o XSD disponível que especifica quais tags ele usa, quais atributos essas tags podem conter e quais tags podem ocorrer dentro de outras tags, entre outras propriedades .
O diagrama a seguir mostra como o XSD é usado para estruturar documentos XML -
Aqui está um código XSD simples. Dê uma olhada nisto.
<?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>
Características
Aqui está uma lista de alguns dos recursos populares do XSD -
- Os XSDs podem ser extensíveis para adições futuras.
- O XSD é mais rico e poderoso do que o DTD.
- XSD é escrito em XML.
- XSD suporta tipos de dados.
- XSD oferece suporte a namespaces.
- XSD é a recomendação W3C.
Um XML XSD é mantido em um documento separado e, em seguida, o documento pode ser vinculado a um documento XML para usá-lo.
Sintaxe
A sintaxe básica de um XSD é a seguinte -
<?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>
O esquema é o elemento raiz do XSD e sempre é necessário.
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
O fragmento acima especifica que os elementos e tipos de dados usados no esquema são definidos em http://www.w3.org/2001/XMLSchema namespace e esses elementos / tipos de dados devem ser prefixados com xs. É sempre necessário.
targetNamespace = "http://www.tutorialspoint.com"
O fragmento acima especifica que os elementos usados neste esquema são definidos em http://www.tutorialspoint.comnamespace. É opcional.
xmlns = "http://www.tutorialspoint.com"
O fragmento acima especifica que o namespace padrão é http://www.tutorialspoint.com.
elementFormDefault = "qualified"
O fragmento acima indica que quaisquer elementos declarados neste esquema devem ser qualificados por namespace antes de serem usados em qualquer documento XML. É opcional.
Esquema de Referência
Dê uma olhada no seguinte Esquema de Referência -
<?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"
O fragmento acima especifica a declaração de namespace padrão. Este namespace é usado pelo validador de esquema para verificar se todos os elementos fazem parte deste namespace. É opcional.
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">
Depois de definir a instância XMLSchema xsi, use schemaLocationatributo. Este atributo possui dois valores, namespace e localização do XML Schema, a serem usados separados por um espaço. É opcional.
Usaremos validador XSD baseado em Java para validar students.xml contra o students.xsd.
students.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>
students.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;
}
}
Etapas para validar XML em relação ao XSD
Copie o XSDValidator.java arquivo para qualquer local, digamos E: > java
Copie o students.xml para o mesmo local E: > java
Copie o students.xsd para o mesmo local E: > java
Compilar XSDValidator.javausando o console. Certifique-se de ter o JDK 1.5 em diante instalado em sua máquina e os classpaths configurados. Para obter detalhes sobre como usar JAVA, consulte o Tutorial JAVA
E:\java\javac XSDValidator.java
Executar XSDValidator com students.xsd e students.xml passado como argumento.
E:\java\java XSDValidator students.xsd students.xml
Verifique a saída
Você verá o seguinte resultado -
students.xml is valid against students.xsd
Neste capítulo, veremos Tipos simples que o XSD define.
S.No. | Tipo e descrição simples |
---|---|
1 | Elemento O elemento simples pode conter apenas texto. Não pode conter nenhum outro elemento. |
2 | Atributo O atributo é um tipo e é usado no Elemento complexo. |
3 | Restrição A restrição define os valores aceitáveis de um elemento XML. |
Elemento complexo é um elemento XML que pode conter outros elementos e / ou atributos. Podemos criar um elemento complexo de duas maneiras -
Defina um tipo complexo e, em seguida, crie um elemento usando o type atributo
Defina um tipo complexo diretamente nomeando
Defina um tipo complexo e, a seguir, crie um elemento usando o atributo type.
<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 um tipo complexo diretamente por nomenclatura.
<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 seguir está a lista de tipos complexos que o XSD suporta.
S.No. | Tipo e descrição simples |
---|---|
1 | Vazio O elemento de tipo complexo vazio complexo pode ter apenas atributos, mas nenhum conteúdo. |
2 | Elementos Apenas Elemento de tipo complexo apenas de elementos pode conter apenas elementos |
3 | Somente texto O elemento de tipo complexo somente texto pode conter apenas atributo e texto. |
4 | Misturado O elemento de tipo complexo misto pode conter elemento, atributo e texto. |
5 | Indicadores Os indicadores controlam as maneiras como os elementos devem ser organizados em um documento XML. |
6 | O elemento <any> é usado para elementos que não são definidos pelo esquema |
7 | O atributo <anyAttribute> é usado para atributos que não são definidos pelo esquema. |
Tipos de dados de string são usados para representar caracteres nos documentos XML.
<xs: string> tipo de dados
O tipo de dados <xs: string> pode receber caracteres, avanços de linha, retornos de carro e caracteres de tabulação. O processador XML não substitui avanços de linha, retornos de carro e caracteres de tabulação no conteúdo por espaço e os mantém intactos. Por exemplo, vários espaços ou guias são preservados durante a exibição.
<xs: string> Exemplo
Declaração de elemento em xsd -
<xs:element name = "name" type = "xs:string"/>
Uso de elemento em xml -
<name>Dinkar</name>
<name>Dinkar Kad</name>
<xs: token> tipo de dados
O tipo de dados <xs: token> é derivado do tipo de dados <string> e pode receber caracteres, avanços de linha, retornos de carro e caracteres de tabulação. O processador XML removerá alimentações de linha, tabulações, retornos de carro, espaços à esquerda e à direita e vários espaços.
<xs: token> Exemplo
Declaração de elemento em xsd -
<xs:element name = "name" type = "xs:token"/>
Uso de elemento em xml -
<name>Dinkar</name>
<name>Dinkar Kad</name>
Tipos de dados de string
A seguir está a lista de tipos de dados comumente usados que são derivados do tipo de dados <string>.
S.No. | Nome e Descrição |
---|---|
1 | ID Representa o atributo de ID em XML e é usado em atributos de esquema. |
2 | IDREF Representa o atributo IDREF em XML e é usado em atributos de esquema. |
3 | language Representa um id de idioma válido |
4 | Name Representa um nome XML válido |
5 | NMTOKEN Representa um atributo NMTOKEN em XML e é usado em atributos de esquema. |
6 | normalizedString Representa uma string que não contém avanços de linha, retornos de carro ou tabulações. |
7 | string Representa uma string que pode conter avanços de linha, retornos de carro ou tabulações. |
8 | token Representa uma string que não contém avanços de linha, retornos de carro, tabulações, espaços iniciais ou finais ou vários espaços |
Restrições
Os seguintes tipos de restrições podem ser usados com tipos de dados String -
- enumeration
- length
- maxLength
- minLength
- pattern
- whiteSpace
Os tipos de dados de data e hora são usados para representar a data e a hora nos documentos XML.
<xs: date> tipo de dados
O tipo de dados <xs: date> é usado para representar a data no formato AAAA-MM-DD.
YYYY - representa o ano
MM - representa o mês
DD - representa o dia
<xs: date> Exemplo
Declaração de elemento em XSD -
<xs:element name = "birthdate" type = "xs:date"/>
Uso de elemento em XML -
<birthdate>1980-03-23</birthdate>
<xs: time> tipo de dados
O tipo de dados <xs: time> é usado para representar o tempo no formato hh: mm: ss.
hh - representa horas
mm - representa minutos
ss - representa segundos
<xs: time> Exemplo
Declaração de elemento em XSD -
<xs:element name = "startTime" type = "xs:time"/>
Uso de elemento em XML -
<startTime>10:20:15</startTime>
<xs: datetime> tipo de dados
O tipo de dados <xs: datetime> é usado para representar a data e a hora no formato AAAA-MM-DDThh: mm: ss.
YYYY - representa o ano
MM - representa o mês
DD - representa o dia
T - representa o início da seção de tempo
hh - representa horas
mm - representa minutos
ss - representa segundos
<xs: datetime> Exemplo
Declaração de elemento em XSD -
<xs:element name = "startTime" type = "xs:datetime"/>
Uso de elemento em XML -
<startTime>1980-03-23T10:20:15</startTime>
<xs: duração> tipo de dados
O tipo de dados <xs: duration> é usado para representar o intervalo de tempo no formato PnYnMnDTnHnMnS. Cada componente é opcional, exceto P.
P - representa o início da seção de data
nY - representa o ano
nM - representa o mês
nD - representa o dia
T - representa o início da seção de tempo
nH - representa horas
nM - representa minutos
nS - representa segundos
<xs: duração> Exemplo
Declaração de elemento em XSD -
<xs:element name = "period" type = "xs:duration"/>
Uso do elemento em xml para representar período de 6 anos, 3 meses, 10 dias e 15 horas.
<period>P6Y3M10DT15H</period>
Tipos de dados de data
A seguir está a lista de tipos de dados de data comumente usados.
S.No. | Nome e Descrição |
---|---|
1 | date Representa um valor de data |
2 | dateTime Representa um valor de data e hora |
3 - | duration Representa um intervalo de tempo |
4 | gDay Representa uma parte de uma data como o dia (DD) |
5 | gMonth Representa uma parte de uma data como o mês (MM) |
6 | gMonthDay Representa uma parte de uma data como o mês e dia (MM-DD) |
7 | gYear Representa uma parte de uma data como o ano (AAAA) |
8 | gYearMonth Representa uma parte de uma data como o ano e mês (AAAA-MM) |
9 | time Representa um valor de tempo |
Restrições
Os seguintes tipos de restrições podem ser usados com os tipos de dados Date -
- enumeration
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- whiteSpace
Tipos de dados numéricos são usados para representar números em documentos XML.
<xs: decimal> tipo de dados
O tipo de dados <xs: decimal> é usado para representar valores numéricos. Ele suporta números decimais de até 18 dígitos.
<xs: decimal> Exemplo
Declaração de elemento em XSD -
<xs:element name = "score" type = "xs:decimal"/>
Uso de elemento em XML -
<score>9.12</score>
<xs: integer> tipo de dados
O tipo de dados <xs: integer> é usado para representar valores inteiros.
<xs: integer> Exemplo
Declaração de elemento em XSD -
<xs:element name = "score" type = "xs:integer"/>
Uso de elemento em XML -
<score>9</score>
Tipos de dados numéricos
A seguir está a lista de tipos de dados numéricos comumente usados.
S.No. | Nome e Descrição |
---|---|
1 | byte Um inteiro assinado de 8 bits |
2 | decimal Um valor decimal |
3 - | int Um inteiro assinado de 32 bits |
4 | integer Um valor inteiro |
5 | long Um inteiro assinado de 64 bits |
6 | negativeInteger Um número inteiro tendo apenas valores negativos (.., - 2, -1) |
7 | nonNegativeInteger Um número inteiro tendo apenas valores não negativos (0,1,2, ..) |
8 | nonPositiveInteger Um número inteiro tendo apenas valores não positivos (.., - 2, -1,0) |
9 | positiveInteger Um número inteiro tendo apenas valores positivos (1,2, ..) |
10 | short Um inteiro assinado de 16 bits |
11 | unsignedLong Um inteiro não assinado de 64 bits |
12 | unsignedInt Um inteiro não assinado de 32 bits |
13 | unsignedShort Um inteiro não assinado de 16 bits |
14 | unsignedByte Um inteiro sem sinal de 8 bits |
Restrições
Os seguintes tipos de restrições podem ser usados com os tipos de dados Date -
- enumeration
- fractionDigits
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- totalDigits
- whiteSpace
XSD tem alguns outros tipos de dados importantes, como Boolean, binary, e anyURI.
tipo de dados <xs: boolean>
O tipo de dados <xs: boolean> é usado para representar o valor verdadeiro, falso, 1 (para verdadeiro) ou 0 (para falso).
<xs: boolean> Exemplo
Declaração de elemento em XSD -
<xs:element name = "pass" type = "xs:boolean"/>
Uso de elemento em XML -
<pass>false</pass>
Tipos de dados binários
Os tipos de dados binários são usados para representar valores binários. Dois tipos binários são comuns em uso.
base64Binary - representa dados binários codificados em base64
hexBinary - representa dados binários codificados hexadecimais
<xs: hexbinary> Exemplo
Declaração de elemento em XSD -
<xs:element name = "blob" type = "xs:hexBinary"/>
Uso de elemento em XML -
<blob>9FEEF</blob>
<xs: anyURI> tipo de dados
O tipo de dados <xs: anyURI> é usado para representar URI.
<xs: anyURI> Exemplo
Declaração de elemento em XSD -
<xs:attribute name = "resource" type = "xs:anyURI"/>
Uso de elemento em XML -
<image resource = "http://www.tutorialspoint.com/images/smiley.jpg" />
Tipos de dados numéricos
A seguir está a lista de tipos de dados numéricos comumente usados.
S.No. | Nome e Descrição |
---|---|
1 | byte Um inteiro assinado de 8 bits |
2 | decimal Um valor decimal |
3 - | int Um inteiro assinado de 32 bits |
4 | integer Um valor inteiro |
5 | long Um inteiro assinado de 64 bits |
6 | negativeInteger Um número inteiro tendo apenas valores negativos (.., - 2, -1) |
7 | nonNegativeInteger Um número inteiro tendo apenas valores não negativos (0,1,2, ..) |
8 | nonPositiveInteger Um número inteiro tendo apenas valores não positivos (.., - 2, -1,0) |
9 | positiveInteger Um número inteiro tendo apenas valores positivos (1,2, ..) |
10 | short Um inteiro assinado de 16 bits |
11 | unsignedLong Um inteiro não assinado de 64 bits |
12 | unsignedInt Um inteiro não assinado de 32 bits |
13 | unsignedShort Um inteiro não assinado de 16 bits |
14 | unsignedByte Um inteiro sem sinal de 8 bits |
Restrições
Os seguintes tipos de restrições podem ser usados com tipos de dados diversos, exceto no tipo de dados booleano -
- enumeration
- length
- maxLength
- minLength
- pattern
- whiteSpace