Validácia XML súboru pomocou DTD alebo XML Schema

Published:

Add / read comments

V minulom článku som si generoval XML dokument. Teraz si ukážeme ako daný súbor zvalidovať, t.j. zaistiť, aby v súbore bolo všetko tak ako má byť (želaná štruktúra, prítomnosť určitých dát, želaný typ dát). Pomocou externého súboru teda vieme zaistiť, aby sme ochránili aplikáciu pred dátami, ktoré nedokáže aplikácia spracovať.

Externý súbor pracuje na princípe: čo nie je povolené, je zakázané. Čiže nie ako v našom ľudskom svete, kde to funguje naopak, t.j. čo nie je zakázané, je povolené. Veď to je presne to, čo nás odlišuje od strojov. Stroj keď mu nepovieme čo má robiť, nerobí nič. Naopak, človeku keď nič nepoviete, vždy si niečo nájde. Skôr to tak býva, že najmä dieťatu rodičia zdôrazňujú aby nič nerobilo :-) Všetko o XML nájdete tu.

Čiže môj XML dokument má takú štruktúru, že má jeden hlavný koreň. Tento koreň má ľubovolný počet detských elementov, ktoré predstavujú štáty. A každý tento element (štát) má obsahovať informácie o tomto štáte v nasledujúcom formáte: jeden názov štátu (reťazec), jeden medzinárodný kód štátu (reťazec), rozloha štátu (číslo), populácia štátu (číslo). Mojím cieľom je vytvoriť validačný dokument, ktorý odmietne spracovať dokument, ktorý nebude spľňať horeuvedené podmienky.

V obľúbenom textovom editore si vytvoríme nový dokument, ktorý bude reprezentovať externý validačný dokument pre náš XML súbor. Na začiatku uvedieme DTD (Document Type Definition) dokumentu, pričom v našom prípade bude validačný dokument tiež typu XML. Dokument uložíme s príponou ".dtd"

<?xml version="1.0" encoding="utf-8"?>

Tak, súbor máme a teraz môžeme začať postupne vytvárať XML validačný súbor. Začneme s názvom koreňového elementu "states", ktorý môže obsahovať jeden až ľubovolný počet detských elementov "state". Využívajú sa špeciálne operátory.

<!-- operator "+" znamena jeden az nekonecno -->
<!ELEMENT states (state+)>

Ďalej zadefinujeme, že štát môže obsahovat práve jeden názov, jeden kód, jednu rozlohu a jednu populáciu.

<!ELEMENT state (name, code, area, population)>

A teraz už len povieme, že dáta v jednotlivých elementoch štátu budú parsované parserom a špeciálne znaky (entity) ako &, < a > budú prevedené do ich HTML entít.

<!ELEMENT name (#PCDATA)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT area (#PCDATA)>
<!ELEMENT population (#PCDATA)>

Validitu XML súboru voči jeho DTD dokumentu si môžeme overiť v linuxovej konzole nasledujúcim príkazom:

<!ELEMENT name (#PCDATA)>
<!ELEMENT code (#PCDATA)>
<!ELEMENT area (#PCDATA)>
<!ELEMENT population (#PCDATA)>

Nevýhody DTD sú, že nerozlišuje medzi typom dát (reťazec, číslo, dátum atď.) Spôsob ako overiť typ dát v XML súbore voči jeho DTD dokumentu je XML Schema. Tá umožňuje kontrolovať nielen formát obsahu, ale aj vlastnosti (min/max dĺžka, kladné/záporné hodnoty).

Opät si v obľúbenom textovom editore vytvoríme nový dokument. Na začiatku si vytvoríme základnú šablónu dokumentu pre XSL Schema a dokument uložíme s príponou ".xsd"

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

Teraz zadefinujeme, že koreňový element je "states". Ten obsahuje jeden až lubovoľný počet elementov "state". Element "state" obsahuje práve jeden element "name", "code", "area" a "population". Kód sa vloží do základnej šablóny.

<xs:element name="states">
  <xs:complexType>  
    <xs:sequence>
      <xs:element ref="state" minOccurs="1" maxOccurs="unbounded"/> 
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="state">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name" minOccurs="1" maxOccurs="1"/>
      <xs:element ref="code" minOccurs="1" maxOccurs="1"/> 
      <xs:element ref="area" minOccurs="1" maxOccurs="1"/>
      <xs:element ref="population" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

A prišiel čas určiť formu a vlastnosti dát v jednotlivých elementoch. Názov bude reťazec, dlhý aspoň 3 písmená. Kód bude reťazec, ktorý má presne 2 znaky. Rozloha bude číslo s desatinnou čiarkou, pričom nemôže byť záporné a ani nulové. No a populácia bude celé, nezáporné číslo. Veď videl už niekto napr. jeden a pol človeka?

  <xs:simpleType name="simple_name">
    <xs:restriction base="xs:string">
      <xs:minLength value="3"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="name" type="simple_name"/>
 
  <xs:simpleType name="simple_code">
    <xs:restriction base="xs:string">
      <xs:length value="2"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="code" type="simple_code"/>
 
  <xs:simpleType name="simple_area">
    <!-- iba cisla (s desatinnou ciarkou) -->
    <xs:restriction base="xs:decimal">
      <!-- vylucuje cisla zaporne a nulu => zaporna a ziadna poloha nie -->
      <xs:minExclusive value="0.0"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="area" type="simple_area"/>
 
  <xs:simpleType name="simple_population">
    <!-- iba pozitivne cele cisla (bez desatinnej ciarky), vylucuje nulu -->
    <xs:restriction base="xs:positiveInteger">      
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="population" type="simple_population"/>
	

Tak a je to. Vytvorili sme validačné dokumenty DTD a XML Schema pre XML dokument, ktorý obsahuje zoznam štátov.

Published:

Add / read comments

FIND ME

Share, follow or connect with me.