WYKŁAD 2 DTD DOCUMENT TYPE DEFINITION CZĘŚĆ 1
XML (ang. Extensible Markup Language Rozszerzalny język znaczników) Oparty o SGML prosty, elastyczny format tekstowy opisujący klasę obiektów nazywanych dokumentami XML. Dokumenty te zawierają dane i znaczniki, które służą do reprezentacji struktury i znaczenia danych, nie są jednak z nimi związane domyślne reguły prezentacji i formatowania danych. Poprawny dokument XML to dokument spełniający zasady opisane w definicji typu dokumentu DTD.
DOBRE FORMATOWANIE TO NIE WSZYSTKO Dobrze sformatowany document XML: Zaczyna się od deklaracji XML; Zawiera jeden unikalny element podstawowy (root element); Wszystkie znaczniki są domknięte; Nazwy elementów uwzględniają wielkość liter; Elementy muszą być poprawnie zagnieżdżone; Wartości atrybutów muszą być w cudzysłowach; Znaki specjalne muszą mieć swoje odpowiedniki. Samo formatowanie to nie wszystko nadal mogą pojawiać się błędy. Przykład: zamówienie 8 drukarek brutto zamiast 8 sztuk.
DOKUMENT DTD (Document Type Definition) Dokument definiujący strukturę i elementy oraz atrybuty dokumentu XML. To swego rodzaju przewodnik po dokumencie zawiera informację o znacznikach, atrybutach, dozwolonych wartościach. Przy wymianie informacji między różnymi systemami, pełni rolę opisu standardu informacji oraz umożliwia sprawdzenie, czy dokument XML jest poprawny.
PRZYKŁAD <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#CDATA)> ]> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note>
INTERPRETACJA DTD <!DOCTYPE note [ //root element is note <!ELEMENT note (to,from,heading,body)> //must contain to, from, heading, body elements //elementy mają format tekstowy <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#CDATA)>
PO CO UŻYWAĆ DTD? Dzięki definicji typu dokumentu można ustalić standard do wymiany informacji miedzy różnymi grupami osób lub różnymi systemami. Aplikacje mogą zweryfikować, czy otrzymały poprawny dokument XML.
BLOKI XML W DTD Elementy inaczej znaczniki, Atrybuty właściwości znaczników, Odwołania znakowe (encje, entities): o < < o > > o & & o " " o ' ' PCDATA tekst, który będzie interpretowany przez parser, CDATA tekst, który nie będzie interpretowany, tylko wstawiany as it is
ELEMENTY W DTD Elementy w DTD definiowane są poprzez składnię ELEMENT: <!ELEMENT element-name category> lub <!ELEMENT element-name (element-content)>
PUSTY ELEMENT <!ELEMENT element-name EMPTY> Przykład: <!ELEMENT br EMPTY> czyli <br />
ELEMENTY Z DOWOLNĄ ZAWARTOŚCIĄ <!ELEMENT element-name ANY> Przykład: <!ELEMENT note ANY>
ELEMENTY PCDATA <!ELEMENT element-name (#PCDATA)> Przykład: <!ELEMENT from (#PCDATA)>
ELEMENTY ZAWIERAJĄCE INNE ELEMENTY <!ELEMENT element-name (child1)> lub <!ELEMENT element-name (child1,child2,...)> Przykład: <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#CDATA)>
ILOŚĆ WYSTĄPIEŃ ELEMENTU W DTD można ustalić, że: Element wystąpi tylko raz <!ELEMENT element-name (child-name)> Element wystąpi minimum raz <!ELEMENT element-name (child-name+)> Element wystąpi wcale lub wiele razy <!ELEMENT element-name (child-name*)> Element wystąpi wcale lub jeden raz <!ELEMENT element-name (child-name?)>
MIESZANE ELEMENTY Wystąpi jeden element lub drugi <!ELEMENT note (to,from,header,(message body))> //wystąpi message LUB/I body Może wystąpić mieszany typ elementów <!ELEMENT note (#PCDATA to from header message)*> //note zawiera 0 lub więcej wystąpień każdego z elementów
ATRYBUTY W DTD Atrybuty w DTD definiowane są przez składnię ATTLIST: <!ATTLIST element-name attribute-name attribute-type attribute-value> Przykład: <!ATTLIST payment type CDATA "check"> czyli <payment type="check" />
TYPY ATRYBUTÓW: ATTRIBUTE-TYPE CDATA - wartość znakowa (en1 en2..) - wartość z listy ID IDREF IDREFS NMTOKEN wartość to ID wartość to ID innego elementu - wartość to lista ID innych elementów wartość to nazwa XML NMTOKENS wartość to lista nazw XML ENTITY ENTITIES NOTATION xml: wartość to jednostka wartość to lista jednostek wartością jest nazwa notacji - wartością jest predefiniowana wartość XML
WARTOŚCI ATRYBUTÓW ATTRIBUTE-VALUE value - domyślna wartość atrybutu #REQUIRED atrybut jest wymagany #IMPLIED - atrybut jest opcjonalny #FIXED value wartość atrybutu jest ustalona
DOMYŚLNA WARTOŚĆ DTD: <!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0"> XML: <square width="100" /> //pusty element square posiada atrybut width typu znakowego, który ma domyślnie ustaloną wartość 0
#REQUIRED Używamy, gdy chcemy wymusić istnienie atrybutu, nawet jeśli nie mamy domyślnej wartości. <!ATTLIST element-name attribute-name attribute-type #REQUIRED> DTD: <!ATTLIST person number CDATA #REQUIRED> Poprawny XML: <person number="5677" /> Niepoprawny XML: <person />
#IMPLIED Używamy, gdy nie mamy domyślnej wartości i nie wymagamy istnienia atrybutu. <!ATTLIST element-name attribute-name attribute-type #IMPLIED> DTD: <!ATTLIST contact fax CDATA #IMPLIED> Poprawny XML: <contact fax="555-667788" /> lub: <contact />
#FIXED Używamy, gdy sami chcemy decydować o wartości atrybutu. <!ATTLIST element-name attribute-name attribute-type #FIXED "value"> DTD: <!ATTLIST sender company CDATA #FIXED "Microsoft"> Poprawny XML: <sender company="microsoft" /> Niepoprawny XML: <sender company="w3schools" />
LIST WARTOŚCI ATRYBUTÓW <!ATTLIST element-name attribute-name (en1 en2..) default-value> DTD: <!ATTLIST payment type (check cash) "cash"> Poprawny XML: <payment type="check" /> lub <payment type="cash" />
ODWOŁANIA ZNAKOWE (ENTITIES) Odwołania znakowe (encje) służą do definiowania skrótów do znaków specjalnych. <!ENTITY entity-name "entity-value"> DTD: <!ENTITY writer "Donald Duck."> <!ENTITY copyright "Copyright W3Schools."> XML: <author>&writer;©right;</author>
DTD ZAWARTE W DOKUMENCIE XML <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#CDATA)> ]> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note>
DTD ZAWARTE W OSOBNYM PLIKU <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note>
XML SCHEMA DEFINITION (XSD) CZĘŚĆ 2
XML SCHEMA DEFINITION (XSD) Podobnie jak DTD jest to format do opisu struktury dokumentu XML, z tym, że jest oparty na języku XML. Celem XML Schema jest definiowanie ptrawidłowej budowy bloków w dokumencie XML, czyli określenie: Elementów i atrybutów, które mogą się pojawiać w dokumencie; Ilość i kolejność potomków elementów; Typów danych elementów i atrybutów; Domyślnych wartości elementów oraz atrybutów.
XML SCHEMA ZALETY Dokumenty XML Schema są napisane w języku XML i korzystają ze wszystkich jego udogodnień (styli, parsowania, manipulacji drzewem DOM); Łatwo je rozszerzać o dodatkowe opcje; Wspierają typy danych i przestrzenie nazw: łatwiej opisać zawartość dokumentu oraz sprawdzić poprawność danych.
PRZYKŁAD <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="note"> <xs:complextype> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema>
PUSTY XML SCHEMA <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" targetnamespace="https://www.w3schools.com" xmlns="https://www.w3schools.com" elementformdefault="qualified">...... </xs:schema> targetnamespace pochodzenie obszaru nazw elementformdefault - "qualified" dokument musi spełniać zasady
DOŁĄCZENIE DO DOKUMENTU <?xml version="1.0"?> <note xmlns="https://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="https://www.w3schools.com note.xsd"> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note>
PROSTY ELEMENT Prosty element element nie zawierający innych elementów czy atrybutów. <xs:element name="xxx" type="yyy"/> Może zawierać w sobie różne typy danych: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time
PRZYKŁAD <lastname>kwiatkowski</lastname> <age>36</age> <dateborn>1970-03-27</dateborn> <xs:element name="lastname" type="xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/> Ponadto może posiadać oznaczenie, czy wartość jest domyślna, czy stała: <xs:element name="color" type="xs:string" default="red"/> <xs:element name="color" type="xs:string" fixed="red"/>
ATRYBUTY Atrybuty są zawsze prostego typu, czyli nie zawierają w sobie innych elementów ani atrybutów. <xs:attribute name="xxx" type="yyy"/> Przyjmują podobne wartości type jak prosty element oraz mogą być default lub fixed. <lastname lang="en">smith</lastname> <xs:attribute name="lang" type="xs:string" default="en"/>
FACETS OGRANICZENIA Na zawartość elementów można nałożyć ograniczenia. Ograniczenie liczb: <xs:element name="age"> <xs:simpletype> <xs:restriction base="xs:integer"> <xs:mininclusive value="0"/> <xs:maxinclusive value="120"/> </xs:restriction> </xs:simpletype> </xs:element>
FACETS OGRANICZENIA Ograniczenie elementów: <xs:element name="car"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="audi"/> <xs:enumeration value="golf"/> <xs:enumeration value="bmw"/> </xs:restriction> </xs:simpletype> </xs:element>
FACETS OGRANICZENIA Ograniczenie serii danych: <xs:element name="gender"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:pattern value="male female"/> </xs:restriction> </xs:simpletype> </xs:element> Pełna lista ograniczeń dostępna pod adresem: https://www.w3schools.com/xml/schema_facets.asp
ZŁOŻONY ELEMENT Złożony element element, który zawiera inne elementy i atrybuty. Może nim być: Pusty element Element, który zawiera inne elementy Element, który zawiera elementy i tekst Element, który zawiera tylko tekst Element, który zawiera atrybuty
PUSTY ZŁOŻONY ELEMENT <product pid="1345"/> <xs:element name="product"> <xs:complextype> <xs:attribute name="prodid" type="xs:positiveinteger" /> </xs:complextype> </xs:element>
ELEMENT ZAWIERAJĄCY INNE ELEMENTY <employee> <firstname>john</firstname> <lastname>smith</lastname> </employee> <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element>
ELEMENT ZAWIERAJĄCY TEKST <shoesize country="france">35</shoesize> <xs:element name="shoesize"> <xs:complextype> <xs:simplecontent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simplecontent> </xs:complextype> </xs:element>
ELEMENT MIESZANY: <letter> Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter> <xs:element name="letter"> <xs:complextype mixed="true"> <xs:sequence> <xs:element name="orderid" type="xs:positiveinteger "/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complextype> </xs:element>
ELEMENT <ANY> Pozwala na dodanie do dokumentów elementów wcześniej nieokreślonych. <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any minoccurs="0"/> </xs:sequence> </xs:complextype> </xs:element>
ATRYBUT <ANYATTRIBUTE> Pozwala na dodanie do dokumentów wcześniej niezdefiniowanych atrybutów. <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:anyattribute/> </xs:complextype> </xs:element>
OGRANICZENIA ILOŚCI ELEMENTÓW Podobnie jak w DTD na ilość wystąpień elementów można ustawić ograniczenia: Kolejność wystąpień: all, choice, sequence Ilość wystąpień: maxoccurs, minoccurs Grupowanie w sekwencje: group name, attributegroup name
OGRANICZENIE ALL Wszystkie elementy mogą się pojawić, maximum jeden raz. <xs:element name="person"> <xs:complextype> <xs:all> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:all> </xs:complextype> </xs:element>
OGRANICZENIE CHOICE Oznacza, że albo jeden albo drugi element musi się pojawić. <xs:element name="person"> <xs:complextype> <xs:choice> <xs:element name="employee" type="employee"/> <xs:element name="member" type="member"/> </xs:choice> </xs:complextype> </xs:element>
OGRANICZENIE SEQUENCE Oznacza, że elementy muszą się pojawić w określonym porządku. <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> Więcej przykładów: https://www.w3schools.com/xml/schema_complex_indicators.asp
Dziękuję za uwagę MATERIAŁY POMOCNICZE http://www.w3schools.com/xml/xml_dtd_intro.asp http://www.w3schools.com/xml/schema_intro.asp