Výukový program XML

XML HOME Úvod do XML XML Jak používat XML strom Syntaxe XML Prvky XML Atributy XML Jmenné prostory XML Zobrazení XML XML HttpRequest XML Parser XML DOM XML XPath XML XSLT XML XQuery XML XLlink XML Validator XML DTD Schéma XML XML server Příklady XML XML kvíz XML certifikát

XML AJAX

Úvod do AJAX AJAX XMLHttp Požadavek AJAX Odpověď AJAX Soubor XML AJAX AJAX PHP AJAX ASP Databáze AJAX Aplikace AJAX Příklady AJAX

XML DOM

Úvod do DOM DOM uzly Přístup k DOM Informace o uzlu DOM Seznam uzlů DOM DOM Traversing Navigace DOM DOM získat hodnoty DOM změnit uzly DOM Remove Nodes DOM nahradit uzly DOM Vytvořte uzly DOM Přidat uzly Klonovací uzly DOM Příklady DOM

Výukový program XPath

Úvod do XPath Uzly XPath Syntaxe XPath osy XPath Operátoři XPath Příklady XPath

Kurz XSLT

Úvod do XSLT Jazyky XSL Transformace XSLT XSLT <šablona> XSLT <hodnota-of> XSLT <pro každého> XSLT <sort> XSLT <if> XSLT <vyberte> Použít XSLT XSLT u klienta XSLT na serveru XSLT Úprava XML Příklady XSLT

Výukový program XQuery

Úvod do XQuery Příklad XQuery XQuery FLWOR HTML XQuery Podmínky XQuery Syntaxe XQuery Přidat XQuery XQuery Select Funkce XQuery

XML DTD

Úvod do DTD Stavební bloky DTD DTD prvky Atributy DTD DTD Elements vs Attr DTD entity Příklady DTD

XSD schéma

Úvod do XSD XSD Jak na to XSD <schéma> XSD prvky XSD atributy Omezení XSD

XSD komplex

XSD prvky XSD Prázdné Pouze prvky XSD Pouze text XSD XSD smíšené XSD indikátory XSD <libovolné> XSD <jakýkoliAtribut> Náhrada XSD Příklad XSD

XSD data

XSD řetězec Datum XSD Číselné XSD XSD Různé XSD reference

Webové služby

Služby XML XML WSDL XML SOAP XML RDF XML RSS

Reference

Typy uzlů DOM Uzel DOM DOM NodeList DOM NamedNodeMap Dokument DOM Prvek DOM Atribut DOM Text DOM DOM CDATA Komentář DOM DOM XMLHttpRequest DOM Parser Prvky XSLT Funkce XSLT/XPath

Příklad XSD


Tato kapitola ukáže, jak napsat schéma XML. Dozvíte se také, že schéma lze napsat různými způsoby.


XML dokument

Podívejme se na tento dokument XML s názvem „shiporder.xml“:

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

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

Výše uvedený dokument XML se skládá z kořenového prvku „shiporder“, který obsahuje povinný atribut s názvem „orderid“. Element "shiporder" obsahuje tři různé podřízené prvky: "orderperson", "shipto" a "item". Prvek „item“ se objeví dvakrát a obsahuje prvek „title“, volitelný prvek „note“, „množství“ a prvek „cena“.

Řádek výše: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" říká analyzátoru XML, že tento dokument by měl být ověřen podle schématu. Řádek: xsi:noNamespaceSchemaLocation="shiporder.xsd" určuje, KDE se schéma nachází (zde je ve stejné složce jako "shiporder.xml").



Vytvořte schéma XML

Nyní chceme vytvořit schéma pro XML dokument výše.

Začneme otevřením nového souboru, který nazveme „shiporder.xsd“. Chcete-li vytvořit schéma, mohli bychom jednoduše sledovat strukturu v dokumentu XML a definovat každý prvek tak, jak jej najdeme. Začneme standardní deklarací XML následovanou prvkem xs:schema, který definuje schéma:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

Ve výše uvedeném schématu používáme standardní jmenný prostor (xs) a URI spojené s tímto jmenným prostorem je definice jazyka Schema, která má standardní hodnotu http://www.w3.org/2001/XMLSchema.

Dále musíme definovat prvek „shiporder“. Tento prvek má atribut a obsahuje další prvky, proto jej považujeme za komplexní typ. Podřízené prvky prvku „shiporder“ jsou obklopeny prvkem xs:sequence, který definuje uspořádanou sekvenci dílčích prvků:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

Pak musíme element "orderperson" definovat jako jednoduchý typ (protože neobsahuje žádné atributy ani jiné prvky). Před typem (xs:string) je předpona jmenného prostoru spojená se schématem XML, která označuje předdefinovaný datový typ schématu:

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

Dále musíme definovat dva prvky, které jsou komplexního typu: „shipto“ a „item“. Začneme definováním prvku „shipto“:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Pomocí schémat můžeme definovat počet možných výskytů prvku s atributy maxOccurs a minOccurs. maxOccurs určuje maximální počet výskytů prvku a minOccurs určuje minimální počet výskytů prvku. Výchozí hodnota pro maxOccurs i minOccurs je 1!

Nyní můžeme definovat prvek "item". Tento prvek se může v prvku „shiporder“ objevit vícekrát. To je specifikováno nastavením atributu maxOccurs prvku „item“ na „unbounded“, což znamená, že může být tolik výskytů prvku „item“, kolik si autor přeje. Všimněte si, že prvek "note" je volitelný. Upřesnili jsme to nastavením atributu minOccurs na nulu:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Nyní můžeme deklarovat atribut prvku „shiporder“. Protože se jedná o povinný atribut, zadáme use="required".

Poznámka: Deklarace atributů musí být vždy poslední:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Zde je úplný seznam souboru schématu s názvem „shiporder.xsd“:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Rozdělte schéma

Předchozí metoda návrhu je velmi jednoduchá, ale pokud jsou dokumenty složité, může být obtížné ji číst a udržovat.

Další metoda návrhu je založena na tom, že se nejprve definují všechny prvky a atributy a poté se na ně odkazuje pomocí atributu ref.

Zde je nový design souboru schématu ("shiporder.xsd"):

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Použití pojmenovaných typů

Třetí metoda návrhu definuje třídy nebo typy, což nám umožňuje znovu použít definice prvků. Toho dosáhnete pojmenováním elementů simpleTypes a complexTypes a poté na ně ukážete pomocí atributu type elementu.

Zde je třetí návrh souboru schématu ("shiporder.xsd"):

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

Prvek omezení označuje, že datový typ je odvozen z datového typu oboru názvů schématu XML W3C. Následující fragment tedy znamená, že hodnota prvku nebo atributu musí být řetězcová hodnota:

<xs:restriction base="xs:string">

Prvek omezení se častěji používá k aplikaci omezení na prvky. Podívejte se na následující řádky z výše uvedeného schématu:

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

To znamená, že hodnota prvku nebo atributu musí být řetězec, musí to být přesně šest znaků v řadě a tyto znaky musí být číslo od 0 do 9.