XSD - szybki przewodnik

Definicja schematu XML, powszechnie znana jako XSD, to sposób na precyzyjne opisanie języka XML. XSD sprawdza poprawność struktury i słownictwa dokumentu XML z regułami gramatycznymi odpowiedniego języka XML.

Dokument XML można zdefiniować jako -

  • Well-formed- Jeśli dokument XML jest zgodny ze wszystkimi ogólnymi regułami XML, takimi jak tagi, muszą być prawidłowo zagnieżdżone, tagi otwierające i zamykające muszą być zrównoważone, a puste tagi muszą kończyć się znakiem „/>”, wówczas jest on nazywany dobrze sformułowanym .

    OR

  • Valid- Dokument XML, o którym mówi się, że jest prawidłowy, gdy jest nie tylko dobrze sformułowany , ale jest również zgodny z dostępnym XSD, który określa, które tagi używa, jakie atrybuty mogą zawierać te tagi i które tagi mogą występować w innych tagach, między innymi .

Poniższy diagram pokazuje, jak XSD jest używany do tworzenia struktury dokumentów XML -

Oto prosty kod XSD. Spójrz na to.

<?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>

funkcje

Oto lista niektórych popularnych funkcji XSD -

  • XSD można rozszerzyć w celu przyszłego rozszerzenia.
  • XSD jest bogatszy i potężniejszy niż DTD.
  • XSD jest napisane w XML.
  • XSD obsługuje typy danych.
  • XSD obsługuje przestrzenie nazw.
  • XSD to zalecenie W3C.

XML XSD jest przechowywany w oddzielnym dokumencie, a następnie dokument można połączyć z dokumentem XML, aby go użyć.

Składnia

Podstawowa składnia XSD jest następująca -

<?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>

Element <Schema>

Schemat jest głównym elementem XSD i jest zawsze wymagany.

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">

Powyższy fragment określa, że ​​elementy i typy danych użyte w schemacie są zdefiniowane w http://www.w3.org/2001/XMLSchema przestrzeń nazw i te elementy / typy danych powinny być poprzedzone przedrostkiem xs. Jest to zawsze wymagane.

targetNamespace = "http://www.tutorialspoint.com"

Powyższy fragment określa, że ​​elementy użyte w tym schemacie są zdefiniowane w http://www.tutorialspoint.comprzestrzeń nazw. Jest to opcjonalne.

xmlns = "http://www.tutorialspoint.com"

Powyższy fragment określa, że ​​domyślna przestrzeń nazw to http://www.tutorialspoint.com.

elementFormDefault = "qualified"

Powyższy fragment wskazuje, że wszystkie elementy zadeklarowane w tym schemacie muszą mieć kwalifikację przestrzeni nazw przed użyciem ich w jakimkolwiek dokumencie XML.Jest to opcjonalne.

Schemat odniesienia

Spójrz na następujący schemat odniesienia -

<?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"

Powyższy fragment określa domyślną deklarację przestrzeni nazw. Ta przestrzeń nazw jest używana przez walidator schematu, który sprawdza, czy wszystkie elementy są częścią tej przestrzeni nazw. Jest to opcjonalne.

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">

Po zdefiniowaniu instancji XMLSchema xsi użyj schemaLocationatrybut. Ten atrybut ma dwie wartości, przestrzeń nazw i lokalizację schematu XML, które mają być używane oddzielone spacją. Jest to opcjonalne.

Do walidacji użyjemy walidatora XSD opartego na Javie students.xml niezgodne z 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;
   }
}

Kroki, aby sprawdzić poprawność XML względem XSD

  • Skopiuj plik XSDValidator.java na przykład w dowolne miejsce E: > java

  • Skopiuj plik students.xml do tej samej lokalizacji E: > java

  • Skopiuj plik students.xsd do tej samej lokalizacji E: > java

  • Skompilować XSDValidator.javaza pomocą konsoli. Upewnij się, że na komputerze jest zainstalowane oprogramowanie JDK 1.5 i nowsze, a ścieżki klas są skonfigurowane. Aby uzyskać szczegółowe informacje na temat korzystania z JAVA, zobacz Samouczek JAVA

E:\java\javac XSDValidator.java
  • Wykonać XSDValidator z students.xsd i students.xml przekazane jako argument.

E:\java\java XSDValidator students.xsd students.xml

Sprawdź dane wyjściowe

Zobaczysz następujący wynik -

students.xml is valid against students.xsd

W tym rozdziale zobaczymy proste typy, które definiuje XSD.

S.No. Prosty typ i opis
1

Element

Prosty element może zawierać tylko tekst. Nie może zawierać żadnego innego elementu.

2

Atrybut

Atrybut sam w sobie jest typem i jest używany w elemencie złożonym.

3

Ograniczenie

Ograniczenie definiuje dopuszczalne wartości elementu XML.

Element złożony to element XML, który może zawierać inne elementy i / lub atrybuty. Złożony element możemy stworzyć na dwa sposoby -

  • Zdefiniuj typ złożony, a następnie utwórz element przy użyciu type atrybut

  • Zdefiniuj typ złożony bezpośrednio przez nazewnictwo

Zdefiniuj typ złożony, a następnie utwórz element przy użyciu atrybutu typu.

<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' />

Zdefiniuj typ złożony bezpośrednio przez nazewnictwo.

<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>

Poniżej znajduje się lista typów złożonych obsługiwanych przez XSD.

S.No. Prosty typ i opis
1

Pusty

Złożony Pusty element typu złożonego może mieć tylko atrybuty, ale bez zawartości.

2

Tylko elementy

Element typu złożonego Tylko elementy może zawierać tylko elementy

3

Tylko tekst

Element typu złożonego Tylko tekst może zawierać tylko atrybut i tekst.

4

Mieszany

Mieszany element typu złożonego może zawierać element, atrybut i tekst.

5

Wskaźniki

Wskaźniki kontrolują sposób organizacji elementów w dokumencie XML.

6

Element <any> jest używany w przypadku elementów, które nie są zdefiniowane przez schemat

7

Atrybut <anyAttribute> jest używany dla atrybutu, który nie jest zdefiniowany przez schemat.

Typy danych String są używane do reprezentowania znaków w dokumentach XML.

Typ danych <xs: string>

Typ danych <xs: string> może przyjmować znaki, nowe wiersze, powroty karetki i znaki tabulacji. Procesor XML nie zastępuje znaków nowego wiersza, powrotu karetki i znaków tabulacji w treści spacjami i zachowuje je nienaruszone. Na przykład podczas wyświetlania zachowanych jest wiele spacji lub tabulatorów.

<xs: string> Przykład

Deklaracja elementu w xsd -

<xs:element name = "name" type = "xs:string"/>

Wykorzystanie elementu w xml -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

Typ danych <xs: token>

Typ danych <xs: token> pochodzi z typu danych <string> i może przyjmować znaki, nowe wiersze, powroty karetki i znaki tabulacji. Procesor XML usunie nowe wiersze, tabulatory, powroty karetki, spacje początkowe i końcowe oraz wiele spacji.

<xs: token> Przykład

Deklaracja elementu w xsd -

<xs:element name = "name" type = "xs:token"/>

Wykorzystanie elementu w xml -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

Typy danych ciągów

Poniżej znajduje się lista najczęściej używanych typów danych, które pochodzą z typu danych <string>.

S.No. Nazwa i opis
1

ID

Reprezentuje atrybut ID w XML i jest używany w atrybutach schematu.

2

IDREF

Reprezentuje atrybut IDREF w XML i jest używany w atrybutach schematu.

3

language

Reprezentuje prawidłowy identyfikator języka

4

Name

Reprezentuje prawidłową nazwę XML

5

NMTOKEN

Reprezentuje atrybut NMTOKEN w XML i jest używany w atrybutach schematu.

6

normalizedString

Reprezentuje ciąg, który nie zawiera znaków nowej linii, znaków powrotu karetki ani tabulatorów.

7

string

Reprezentuje ciąg, który może zawierać nowe wiersze, powroty karetki lub tabulatory.

8

token

Reprezentuje ciąg, który nie zawiera znaków nowego wiersza, powrotu karetki, tabulatorów, spacji wiodących lub końcowych ani wielu spacji

Ograniczenia

Następujące typy ograniczeń mogą być używane z typami danych typu String -

  • enumeration
  • length
  • maxLength
  • minLength
  • pattern
  • whiteSpace

Typy danych Data i godzina są używane do reprezentowania daty i godziny w dokumentach XML.

Typ danych <xs: date>

Typ danych <xs: date> służy do przedstawiania daty w formacie RRRR-MM-DD.

  • YYYY - oznacza rok

  • MM - reprezentuje miesiąc

  • DD - reprezentuje dzień

<xs: date> Przykład

Deklaracja elementu w XSD -

<xs:element name = "birthdate" type = "xs:date"/>

Wykorzystanie elementu w XML -

<birthdate>1980-03-23</birthdate>

Typ danych <xs: time>

Typ danych <xs: time> służy do przedstawiania czasu w formacie gg: mm: ss.

  • hh - reprezentuje godziny

  • mm - oznacza minuty

  • ss - oznacza sekundy

<xs: time> Przykład

Deklaracja elementu w XSD -

<xs:element name = "startTime" type = "xs:time"/>

Wykorzystanie elementu w XML -

<startTime>10:20:15</startTime>

Typ danych <xs: datetime>

Typ danych <xs: datetime> służy do przedstawiania daty i godziny w formacie RRRR-MM-DDThh: mm: ss.

  • YYYY - oznacza rok

  • MM - reprezentuje miesiąc

  • DD - reprezentuje dzień

  • T - reprezentuje początek odcinka czasu

  • hh - reprezentuje godziny

  • mm - oznacza minuty

  • ss - oznacza sekundy

<xs: datetime> Przykład

Deklaracja elementu w XSD -

<xs:element name = "startTime" type = "xs:datetime"/>

Wykorzystanie elementu w XML -

<startTime>1980-03-23T10:20:15</startTime>

<xs: duration> typ danych

Typ danych <xs: duration> służy do reprezentowania przedziału czasu w formacie PnYnMnDTnHnMnS. Każdy składnik jest opcjonalny, z wyjątkiem P.

  • P - oznacza początek sekcji daty

  • nY - oznacza rok

  • nM - reprezentuje miesiąc

  • nD - reprezentuje dzień

  • T - reprezentuje początek odcinka czasu

  • nH - reprezentuje godziny

  • nM - oznacza minuty

  • nS - oznacza sekundy

<xs: duration> Przykład

Deklaracja elementu w XSD -

<xs:element name = "period" type = "xs:duration"/>

Użycie elementu w xml reprezentuje okres 6 lat, 3 miesięcy, 10 dni i 15 godzin.

<period>P6Y3M10DT15H</period>

Data Typy danych

Poniżej znajduje się lista powszechnie używanych typów danych dat.

S.No. Nazwa i opis
1.

date

Reprezentuje wartość daty

2.

dateTime

Reprezentuje wartość daty i godziny

3.

duration

Reprezentuje przedział czasu

4.

gDay

Reprezentuje część daty jako dzień (DD)

5.

gMonth

Reprezentuje część daty jako miesiąc (MM)

6.

gMonthDay

Reprezentuje część daty jako miesiąc i dzień (MM-DD)

7.

gYear

Reprezentuje część daty jako rok (RRRR)

8.

gYearMonth

Reprezentuje część daty jako rok i miesiąc (RRRR-MM)

9.

time

Reprezentuje wartość czasu

Ograniczenia

Następujące typy ograniczeń mogą być używane z typami danych Data -

  • enumeration
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • whiteSpace

Liczbowe typy danych są używane do reprezentowania liczb w dokumentach XML.

Typ danych <xs: decimal>

Typ danych <xs: decimal> służy do przedstawiania wartości liczbowych. Obsługuje liczby dziesiętne do 18 cyfr.

<xs: decimal> Przykład

Deklaracja elementu w XSD -

<xs:element name = "score" type = "xs:decimal"/>

Wykorzystanie elementu w XML -

<score>9.12</score>

Typ danych <xs: integer>

Typ danych <xs: integer> służy do reprezentowania wartości całkowitych.

<xs: integer> Przykład

Deklaracja elementu w XSD -

<xs:element name = "score" type = "xs:integer"/>

Wykorzystanie elementu w XML -

<score>9</score>

Numeryczne typy danych

Poniżej znajduje się lista najczęściej używanych liczbowych typów danych.

S.No. Nazwa i opis
1.

byte

8-bitowa liczba całkowita ze znakiem

2.

decimal

Wartość dziesiętna

3.

int

32-bitowa liczba całkowita ze znakiem

4.

integer

Wartość całkowita

5.

long

64-bitowa liczba całkowita ze znakiem

6.

negativeInteger

Liczba całkowita mająca tylko wartości ujemne (.., - 2, -1)

7.

nonNegativeInteger

Liczba całkowita mająca tylko wartości nieujemne (0, 1, 2, ..)

8.

nonPositiveInteger

Liczba całkowita mająca tylko wartości niedodatnie (.., - 2, -1,0)

9.

positiveInteger

Liczba całkowita mająca tylko wartości dodatnie (1, 2, ...)

10.

short

16-bitowa liczba całkowita ze znakiem

11.

unsignedLong

64-bitowa liczba całkowita bez znaku

12.

unsignedInt

32-bitowa liczba całkowita bez znaku

13.

unsignedShort

16-bitowa liczba całkowita bez znaku

14.

unsignedByte

8-bitowa liczba całkowita bez znaku

Ograniczenia

Następujące typy ograniczeń mogą być używane z typami danych Data -

  • enumeration
  • fractionDigits
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • totalDigits
  • whiteSpace

XSD ma kilka innych ważnych typów danych, takich jak Boolean, binary, i anyURI.

Typ danych <xs: boolean>

Typ danych <xs: boolean> jest używany do reprezentowania wartości prawda, fałsz, 1 (prawda) lub 0 (fałsz).

<xs: boolean> Przykład

Deklaracja elementu w XSD -

<xs:element name = "pass" type = "xs:boolean"/>

Wykorzystanie elementu w XML -

<pass>false</pass>

Binarne typy danych

Binarne typy danych służą do reprezentowania wartości binarnych. W użyciu są dwa typy binarne.

  • base64Binary - reprezentuje dane binarne zakodowane w formacie base64

  • hexBinary - reprezentuje dane binarne zakodowane szesnastkowo

<xs: hexbinary> Przykład

Deklaracja elementu w XSD -

<xs:element name = "blob" type = "xs:hexBinary"/>

Wykorzystanie elementu w XML -

<blob>9FEEF</blob>

Typ danych <xs: anyURI>

Typ danych <xs: anyURI> jest używany do reprezentowania identyfikatora URI.

<xs: anyURI> Przykład

Deklaracja elementu w XSD -

<xs:attribute name = "resource" type = "xs:anyURI"/>

Wykorzystanie elementu w XML -

<image resource = "http://www.tutorialspoint.com/images/smiley.jpg" />

Numeryczne typy danych

Poniżej znajduje się lista najczęściej używanych liczbowych typów danych.

S.No. Nazwa i opis
1.

byte

8-bitowa liczba całkowita ze znakiem

2.

decimal

Wartość dziesiętna

3.

int

32-bitowa liczba całkowita ze znakiem

4.

integer

Wartość całkowita

5.

long

64-bitowa liczba całkowita ze znakiem

6.

negativeInteger

Liczba całkowita mająca tylko wartości ujemne (.., - 2, -1)

7.

nonNegativeInteger

Liczba całkowita mająca tylko wartości nieujemne (0, 1, 2, ..)

8.

nonPositiveInteger

Liczba całkowita mająca tylko wartości niedodatnie (.., - 2, -1,0)

9.

positiveInteger

Liczba całkowita mająca tylko wartości dodatnie (1, 2, ...)

10.

short

16-bitowa liczba całkowita ze znakiem

11.

unsignedLong

64-bitowa liczba całkowita bez znaku

12.

unsignedInt

32-bitowa liczba całkowita bez znaku

13.

unsignedShort

16-bitowa liczba całkowita bez znaku

14.

unsignedByte

8-bitowa liczba całkowita bez znaku

Ograniczenia

Następujące typy ograniczeń mogą być używane z różnymi typami danych z wyjątkiem logicznego typu danych -

  • enumeration
  • length
  • maxLength
  • minLength
  • pattern
  • whiteSpace