Instytut Informatyki, Automatyki i Robotyki Zastosowanie informatyki w gospodarce Wykład 3 RMI i CORBA oraz XML i XSD dr inż. Tomasz Walkowiak
RMI remote method invocation RMI umożliwia zdalne wykonywanie metod czyli: Wysłanie przez klienta żądania wykonania metody do serwera Wykonanie zadania na serwerze Przesłanie wyniku do klienta 2
Odległe interfejsy W celu stworzenia odległego obiektu przykrywamy implementację, tworząc interfejs i w rezultacie klient otrzymuje referencje do interfejsu i odwołuje się do obiektu przez interfejs 1. Odległy interfejs musi być publiczny 2. Musi rozszerzać interfejs java.rmi.remote 3. Każda metoda musi deklarować java.rmi.remoteexception 3
Przykład odległego interfejsu import java.rmi.*; public interface Srednia extends Remote{ public Double policzsrednia(double tab[]) throws RemoteException; } 4
Implementacja odległego interfejsu Serwer musi zawierać klasę dziedziczącą z klasy UnicastRemoteObject implementującą odległy interfejs Klasa ta może zawierać więcej metod ale klient może wywoływać tylko te zawarte w interfejsie 5
Usługa - serwer import java.rmi.*; import java.rmi.server.*; import java.net.*; public class ObliczSrednia extends UnicastRemoteObject implements Srednia { public ObliczSrednia() throws RemoteException{ super(); } public Double policzsrednia(double tab[]) throws RemoteException{ double s=0.0; for (int j=0;j<tab.length;j++){ s=s+tab[j]; } return (new Double(s/tab.length)); } } 6
Serwer import java.rmi.*; import java.rmi.server.*; import java.net.*; public class Serwer { public static void main(string args[]){ if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try{ ObliczSrednia obiekt = new ObliczSrednia(); Naming.rebind("osrednia", obiekt); }catch (RemoteException e){ System.out.println("Wyjątek: "+e); }catch (MalformedURLException e){ System.out.println("Zly adres: "+e); 7
RmiRegistry Na hoście na którym mamy serwer (lub serwery) z rmi rmiregistry domyślnie na porcie 1099 lub na podanym jako parametr rmiregistry nr_port Do rejestru odwołują się metody klasy java.rmi.naming lookup() zwraca obiekt zdalny bind() wiąże obiekt zdalny z nazwą rebind() unbind() list() 8
Klient import java.rmi.*; import java.util.*; public class Client{ public static void main(string args[]){ System.setSecurityManager( new RMISecurityManager()); try{ Srednia s=(srednia)naming.lookup("rmi://localhost/osrednia"); double tab[]={10.0,11.1,12.3}; Double d = s.policzsrednia(tab); System.out.println("Srednia z kolejnych"+n+"wartości wynosi: "+d); }catch (Exception e){ System.out.println("Wystąpił wyjątek: "+ e); }}} java -Djava.rmi.server.codebase=file:/c:/users/2/ -Djava.security.policy=java.policy.txt Client 9
Sekwencja zdarzeń Remote Method Call Program Klienta Lookup Get Reference Serwer RMI zdalne metody Register Name RmiRegistry 10
Komunikacja 11 11
Komunikacja Stub czyli Namiastka: Klient używa obiektu stub w którym są zapisane sygnatury metod obiektu odległego Skeleton czyli szkielet: odpowiada stub po stronie serwera przypisuje odwołania do implementacji Jeżeli przekazujemy obiekt przez wartość, to klasa tego obiektu musi implementować interfejs Serializable. Jeśli przekazujemy obiekt przez referencja, to klasa tego obiektu musi implementować interfejs Remote. 12
Tworzenie namiastki i szkieletu rmic (RMI compiler) dla naszego przykładu niepotrzebne bo mamy interfejs, nie mam żadnej klasy rmic nazwa generuje pliki _stub.class Należy go przegrać do klienta Jest to konieczne gdy przesyła się obiekty np. 13
Przykład 2 public class Osoba implements java.io.serializable { private int id; private int wiek; private String nazwisko; public Osoba(int id, int wiek, String nazwisko) { this.id = id; this.wiek = wiek; this.nazwisko = nazwisko; } public void drukuj() { System.out.println("ID: " + id); System.out.println("Wiek: "+ wiek); System.out.println("Nazwisko: " + nazwisko); } } import java.rmi.*; public interface IOsoba extends Remote{ public Osoba pobierzosoba(int n) throws RemoteException; } 14
Przykład 2 cd.. public class POsoba extends UnicastRemoteObject implements IOsoba { Osoba tab[]=new Osoba[10]; public POsoba() throws RemoteException{ for (int i=0;i<tab.length;i++) tab[i]=new Osoba(i,10+i*2,"Nowak"+i); } public Osoba pobierzosoba(int n) throws RemoteException{ System.out.println("Pobiera sie osobe o id:"+n); return (tab[n]);}} odpalamy rmic i przegrywamy POsoba_Stub.class do klienta public class Client{ public static void main(string args[]){ System.setSecurityManager( new RMISecurityManager()); try{ IOsoba s=(iosoba)naming.lookup("rmi://localhost/posoba"); for (int i=0;i<9;i++) s.pobierzosoba(i).drukuj(); }catch (Exception e){system.out.println("wystąpił wyjątek: "+ e); }}} 15
Co to jest CORBA CORBA - Common Object Request Broker Architecture technologia zapewniająca komunikację pomiędzy obiektami pracującymi w heterogenicznych (różnorodnych) systemach komputerowych obiekty pełniące dowolne funkcje mogą być zaimplementowane w różnych językach programowania, na dowolnej platformie sprzętowej, pod kontrolą różnych systemów operacyjnych. Standard CORBA opracowany przez OMG (Object Management Group): aktualnie już jest trzecia wersja standardu stworzony według zasady najpierw standard, potem implementacja 16
Ważne skróty Stub Kod proxy (pieniek ) wygenerowany przez kompilator IDL, który wysyła żądanie do ORB. Inaczej jest to klasa która udaje, że jej metody są wykonywane lokalnie Skeleton szkielet interfejsu (klasy serwera wygenerowane przez kompilator IDL). BOA (ang. Basic Object Adapter) Interfejs którego serwer używa w celu połączenia się z ORB ORB (ang. Object Request BRoker) Pseudo-obiekt, który jest zawsze dostępny zarówno po stronie klienta jak i serwera. ORB jest zwykle aplikacją serwera kontrolującą odpowiedni port. Aplikacja klienta podłącza się do ORB, wysyła żądanie i odbiera od niego odpowiedzi. IDL (ang. Interface Definition Language). Język służący do opisu intefejsu komunikacyjnego pomiędzy klientem a serwerem. Marshaling (szeregowanie) proces konwersji danych z formatu zależnego od języka do formatu niezależnego od języka IIOP (Internet Inter-Orb Protocol) protokół wykorzystywany do komunikacji 17
Podstawowa struktura C C++ Java Ada Cobol IDL code Small talk Klient: pieńki Serwer: szkielety ORB IIOP(Internet Inter ORB protocol) ORB Klient jest zwolniony z rozpatrywania jakichkolwiek środków komunikacji pomiędzy klientem i serwerem. Z jego punktu widzenia obiekty znajdują się bezpośrednio (wirtualnie) w jego przestrzeni adresowej. 18
Interface Definition Language (IDL) Język opisu interfejsu Model klas oparty na C++ Typy danych oparte na C++ Wsparcie dla przestrzeni nazw czy pakietów Przykład: module Tutorial { module GettingStarted { }; }; interface Adder { }; double add(in double arg0,in double arg1 ); 19
Co nam daje CORBA Możliwość budowania wydajnych aplikacji rozproszonych Możliwość wywoływania zdalnych obiektów przez referencje Możliwość przesyłania obiektów przez wartość Wbudowane mapowanie podstawowych typów danych (łącznie z tablicami, kolekcjami) Niezależny od języka opis interfejsu (IDL) Wsparcie dla następujących języków C/C++,Java,.Net, Smalltalk, Lisp, Python, Cobol 20
Wielowarstowowy projekt w CORBIE ORB ORB DB ORB ORB ORB ORB Data Object DB TP Monitor ORB ORB ORB Warstwa klienta Warstwa biznesopwa (według: Orfali et al. Instatnt Corba ) Warstwa serwisowa 21
ORB co to jest? Biblioteka wykonywana w procesie Nasłuchuje na porcie TCP na połączenia Jeden port na każdy lokalny obiekt Otwiera porty TCP do innych obiektów N-portów: na każdą zdalną maszynę ORB jest samoopisujący: dostarcza metdane dla wszystkich obiektów i serwisów Aplikacje wyskorzystujące CORBę tworzą sieć ORB-ów komunikujących się za pomocą IIOP: Internet Inter-Orb Protocol na TCP Każdy klient może być jednocześnie i serwerem: Servant (ma IDL i szkielet) 22
Serwer nazw Name Server 2. Utrzymuje nazwy ORB 3.Resolve(name) 1. Bind(name) Klient Serwer ORB 4. Wywołanie serwisu ORB 23
CORBA problemy Nie do końca rozwiązany problem z komunikacją przez firewalle Brak uogólnionego modelu zabezpieczeń Konieczność opisania interfejsu w IDL 24 24
CORBA w Javie Wprowadzenie RMI over IIOP Możliwość wykorzystania protokołu IIOP zamiast JRMP (Java Remote Method Protocol ) do przekazywania obiektów w RMI Wersja 2.3 specyfikacji CORBA wprowadza: Możliwość przekazywania obiektów przez wartość Mapowanie z języka Java do IDL wspierające RMI Dzięki tym dwóm zamianom możliwe jest budowanie aplikacji rozproszonych opartych na interfejsie RMI wykorzystując jako kanał transportowy CORBA. Możliwe jest także wykorzystanie implementacji EJB nadbudowanej nad CORBA do bardziej rozbudowanych zastosowań. 25
CORBA -.Net przez IIOP Wywoływanie zdalnych obiektów JAVA w środowisku.net i odwrotnie Przekazywanie obiektów przez referencje Przekazywanie obiektów przez wartość Mapowanie podstawowych typów danych http://iiop-net.sourceforge.net 26 26
Java CORBA -.Net Wnioski Możliwość budowania rozproszonych multiplatforomowych aplikacji Rozszerzanie istniejącej rozproszonej architektury bez konieczności większych zmian Jednak bez rozwiązanego problemu bezpieczeństwa i komunikacji przez firewalle zastosowanie CORBA w niektórych systemach jest problematyczne (prace na tym zagadnieniem trwają) 27 27
Komunikacja Java-.Net Co jest potrzebne: Bibliotek IIOPChannel (projekt IIOP.Net) Parser CLS do IDL (IIOP.Net) Parser IDL do CLS (IIOP.Net) ORB dla Java Sun ORB orbd dołączony do Javy JacORB rozbudowany ORB dla Java (open source) 28
Java Server -.Net Client 1. Stworzenie interfejsu Package Tutorial.Java2Net; import java.rmi.remote; import java.rmi.remoteexception; public interface ZrobCos extends Remote { public String Zrob(String arg) throws RemoteException; } 2. Implementacja klasy Package Tutorial.Java2Net; import java.rmi.remote; import java.rmi.remoteexception; import javax.rmi.portableremoteobject; public class ZrobCosImpl extends PortableRemoteObject implements ZrobCos { public ZrobCosImpl() throws java.rmi.remoteexception { super(); } public String Zrob(String arg) throws RemoteException { return Wywolenie metody zdalnej +arg; } } 29
Java Server -.Net Client 3. Implementacja Serwera import javax.naming.initialcontext; import javax.naming.context; import javax.rmi.portableremoteobject; import java.util.*; public class Server { public static void main(string[] args) { try{ Properties env = new Properties(); String ORBAdress = "localhost";//adres ip ORBa int ORBPort = 8087; env.put("java.naming.factory.initial","com.sun.jndi.cosnaming.cnctxfactory"); env.put("java.naming.provider.url","iiop://"+orbadress+":"+orbport); } ZrobCosImpl zdalnyobiekt = new ZrobCosImpl (); Context initialnamingcontext = new InitialContext(env); initialnamingcontext.rebind("zdalnyobiekt", zdalnyobiekt); System.out.println("Server Ready..."); }catch(exception e) { System.out.println("Error: "+e);} } 30
Java Server -.Net Client 4. Kompilacja javac -classpath. Server.java 5. Wytworzenie Stub i Skeleton rmic -classpath. -iiop Tutorial.GettingStarted.AdderImpl 6. Wygenerowanie IDL dla klienta rmic -classpath. -idl Tutorial.GettingStarted.AdderImpl Poniżej wygenerowany plik idl: #include "orb.idl" module Tutorial { module Java2Net { ::CORBA::WStringValue Zrob( in ::CORBA::WStringValue arg0 ); }; }; }; - Potrezba plików (do dalszej konwersji) orb.idl i rm.idl 31
Java Server -.Net Client 7. Mapowanie do CLS Korzystamy z narzedzia IDLToCLSCompliler IDLToClsCompiler ZrobCos.dll Tutorial\Java2Net\ZrobCos.idl Wynikiem będzie bibliotek ZrobCos.dll z stubem dla.net Bibliotekę tą należy dodać do projektu w.net 8. Implementacja Klienta //verte 32
Java Server -.Net Client using System; using System.Runtime.Remoting.Channels; using Ch.Elca.Iiop; using Ch.Elca.Iiop.Services; using omg.org.cosnaming; namespace Tutorial.Java2Net { public class NClient { [STAThread] public static void Main(string[] args) { try { string nameservicehost = "localhost"; int nameserviceport = 1050; IiopClientChannel channel = new IiopClientChannel(); ChannelServices.RegisterChannel(channel); CorbaInit init = CorbaInit.GetInit(); NamingContext nameservice = init.getnameservice(nameservicehost, nameserviceport); NameComponent[] name = new NameComponent[] { new NameComponent("adder", "") }; // get the reference to the remote object ZrobCos remobj = (ZrobCos)nameService.resolve(name); Console.WriteLine(remObj.Zrob( Test )); } catch (Exception e) {Console.WriteLine("exception: " + e);} }} 33
Java Server -.Net Client 9. Uruchomienie 1. Uruchomienie ORB (przy okazji pełni rolę nameserwera) start orbd -ORBInitialPort 1050 2. Uruchomienie Serwera java Server 3. Uruchomienie Klienta NClient.exe 34
XML wymiana 35
Geneza XML SGML powstał jako język znaczników do transferu dokumentów (1986) Lata 60: GML (IBM) oi GenCode (GCA) Jest podstawą dla wielu innych języków XML, HTML itp. Głównym celem jest unifikacja formatu transferu danych i dokumentów: XML jest standardem W3C Pochodzenie XML XML powstał jako standardowy język do reprezentowania danych SGML HTML XML CSS XSLT 36
Edytor tekstowy XML Notepad msdn.microsoft.com/xml/notepad/ ALTOV A XML Liquid XML studio Internet Explorer 5 Netscape Navigator 6 FireFox, Java Standard Extension for XML, java.sun.com/products/xml SAX: Simple API for XML, http://www.megginson.com/sax/. Xalan, Xerces http://xml.apache.org. XT, jawowska impl. XSLT http://www.jclark.com/xml/xt.html. MSXML 37
XML tworzy strukturę zawartości HTML: <P> Jan 15, 2000 </P> XML: <OrderDate> Jan 15, 2000 </OrderDate> XML nie wyświetla i nie przekształca danych XML oddziela dane od procesu formatowania i przekształceń HTML i XML wywodzą się od SGML XML składa się ze znaczników i atrybutów Znaczniki mogą być zagnieżdżane Reprezentują elementy, ich właściwości oraz hierarchię <ROOT> <Orders OrderID="10643" CustomerID="ALFKI" EmployeeID="6" OrderDate="1997-08-25T00:00:00" RequiredDate="1997-09-22T00:00:00" ShippedDate="1997-09-02T00:00:00" /> </ROOT> 38
plik tekstowy znaczniki początkowy ujęty w znaki < > końcowe ujęte w </ > znaczniki puste <Ala ma="kota"/> rozróżniane małe i duże litery mogą występować atrybuty przy znaczniku, ale ujęte w cudzysłowia budowa dokumentu: prolog element główny elementy podrzędne <?xml version="1.0" encoding="iso-8859-1"?> <note> <from>jani</from> <to>tove</to> <message type="text"> Remember me this weekend</message> </note> 39
Zagnieżdżanie znaczników Sekcja CDATA <i><u>ąę</i></u> - źle pozwala włączyć tekst, który ma być zignorowany przez parser parser przekazuje jej zawartość sekcji CDATA może zawierać nawiasy kątowe i znaki ampersand, które w zwykłej zawartości tekstowej są niedozwolone <![CDATA[Hej! to & jest <właśnie> sekcja cdata.]]> Instrukcje przetwarzania instrukcje dla procesora XML w obrębie <??>, ale nie instrukcja <?xml?> są poza specyfikacją XML mogą słuźyć do obsługi np. skryptów <?javascript alert("to jest <tylko> przykład.");?> Komentarze <!-- <bez> komentarza --> Znaki specjane (encje) < > ' " & P ñ 40
XML jest przekształcany do struktury drzewa Węzły drzewa zawierają dane Dokument Elementy Tekst... } Atrybuty Tekst Tekst 41
Przekształcanie XML do postaci węzłów Namespace uri= root Comment customer list customer id customer id 345 120 name orders first last order date order date Jane Doe 07/16/98 07/23/98 42
Przestrzenie nazw pozwalają używać dowolnie wielu słowników znaczników w jednym dokumencie potrzebne w każdym dokumencie, który używa więcej niż jednego słownika znaczników (zbioru nazw znaczników) po co? <Author>Słowacki</Author> to autor rachunku, czy autor książki? Jak używać? atrybut xmlns:x nazwą-aliasem przestrzeni (prefiksem) wartość tego atrybutu jest jej właściwym identyfikatorem (URI) <bn:book xmlns:bn="http://apps.bn.com/ns"> <bn:author>słowacki</bn:author> </bn:book> można także tworzyć przestrzenie nazw domyślne: <Book xmlns="http://apps.bn.com/ns"> <Author>Słowacki</Author> </Book> zarezerwowane: xml i xmlns 43
<xsl:stylesheet xmlns:xsl="http://www.w3.org/xslt/transform/1.0" xmlns:test="http://test.pop.pl"> <xsl:template match= przyklad > <test:template> <xsl:apply-templates/> </test:template> </xsl:template> </xsl:stylesheet> Domyślna przestrzeń nazw: <reln xmlns="http://www.w3.org/tr/rec-mathml/"> <eq/><cn>3</cn><cn>4</cn> </reln> Lokalna przestrzeń nazw: <reln xmlns="http://www.w3.org/tr/rec-mathml/"> <eq/><cn>3</cn><cn>5</cn> <notatka xmlns="">i jaki jest wynik?</notatka> </reln> 44
DTD - definicja typu dokumentu określa prawidłową składnię wywodzi się z SGML-a specyficzna składnia, 10 typów danych brak kontroli tekstowej zawartości elementów Przeniesienie zadania sprawdzania poprawności z tworzonej aplikacji na narzędzie walidujące daje spore oszczędności. Wg. Roger L. Costello, aż 60% tworzonego kodu dotyczy weryfikacji poprawności danych. Lista elementów: <!ELEMENT nazwa (opis_rodzaju_zawartości)>? 0 lub 1 wystąpienie, * 0 lub więcej wystąpień, + 1 lub więcej wystąpień,, sekwencja, alternatywa, () grupowanie, #PCDATA zawartość tekstowej, EMPTY zawartość pusta. 45
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE słownik PUBLIC "-//COS//DICTIONARY//PL" "http://www.cos.pl/katalog/test.dtd"> <słownik> <hasło id= dom datazapisu= 2003-01-30 > <pojęcie>dom</pojęcie> <objaśnienie>obiekt mieszkalny</objaśnienie> </hasło> <hasło id= domek datazapisu= 2003-02-01 > <pojęcie>domek</pojęcie> <objaśnienie>forma zdrobniała od <link hasło= dom >dom</link> </objaśnienie> </hasło> </słownik> jedynie podstawowa kontrola nad strukturą dokumentów, zbyt wysokopoziomowe typy danych, bardzo ogólne metody definiowania częstości wystąpień, mało obiektowe, nierozszerzalne definicje, składnia różna od składni opisywanej zawartości, problemy z namespace. 46
Wprowadzenie do XML Schema XML Schema służy do definiowania struktury dokumentu XML (pełni podobną funkcję jak DTD). XML Schema pozwala na: zdefiniowanie elementów dokumentu zdefiniowanie atrybutów poszczególnych elementów Określenie, które elementy są zagnieżdżone (hierarchia elementów) określenie kolejności elementów zdefiniowanie wartości elementow (pusty czy zawiera tekst?) określenie typu wartości elementów i atrybutów zdefiniowanie domyślnych i stałych wartości elementów i atrybutów 47
Wprowadzenie do XML Schema Dokument XML note.xml : <?xml version="1.0"?> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend!</body> </note> 48
Wprowadzenie do XML Schema Dokument note.xsd, definiujący elementy w note.xml : <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.example.org/xmlschema" targetnamespace="http://www.examples.com" xmlns="http://www.examples.com" elementformdefault="qualified"> <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> 49
Elementy typu prostego Elementy typu prostego, to elementy, które nie mogą zawierać atrybutów czy innych elementów. Niektóre z typów prostych są wbudowane w XML Schema. Najbardziej popularne typy wbudowane to: xs.integer xs.date xs.string xs.decimal xs.time xs.boolean Aby zdefiniować element typu prostego należy użyć składni : <xs:element name="xxx" type="yyy"/> gdzie xxx to nazwa elementu, a yyy to typ elementu. 50
Elementy typu prostego Przykład zdefiniowania elementu typu prostego Elementy w dokumencie XML <lastname>refsnes</lastname> <age>36</age> <dateborn>1970-03-27</dateborn> Zdefiniowane elementy typu prostego w XML Schema <xs:element name="lastname" type="xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/> 51
Wyprowadzenie nowego typu prostego Nowe typy proste są definiowane przez wyporowadzane ich z już istniejących typów prostych (wbudowanych lub wyprowadzonych). Nowy typ prosty możemy wyprowadzić poprzez ograniczenie istniejącego typu prostego, co skutkuje ograniczeniem zbioru przyjmowanych wartości dla typu do jego podzbioru. Element simpletype służy do definiowania nazwy nowego typu prostego, element restriction do wskazania istniejącego (bazowego) typu prostego oraz do określenia aspektów (facets), które służą do ograniczenia zakresu wartości. <xs:simpletype name="myinteger"> <xs:restriction base="xs:integer"> <xs:mininclusive value="10000"/> <xs:maxinclusive value="99999"/> </xs:restriction> </xs:simpletype> 52
Atrybuty Wszystkie atrybuty są typu prostego. Aby zdefiniować atrybut należy użyc składni <xs:element name="xxx" type="yyy"/> gdzie xxx to nazwa atrybutu, a yyy to typ atrybutu. Przykład zdefiniowania atrybutu: Element XML zawierający atrybut <lastname lang="en">smith</lastname> Definicja atrybutu w XML Schema <xs:attribute name="lang" type="xs:string"/> 53
Elementy typu złożonego Elementy typu złożonego to takie, które mogą zawierać atrybuty bądź inne elementy. Nowe typy złożone są definiowane za pomocą elementu complextype i definicje te zazwyczaj zawierają zbiór deklaracji elementów, referencji do elementów oraz deklaracji atrybutów. Elementy typu złożonego można wyróżnić ze względu na zawartosć: pusta (elemnty złożone zawieraja tylko atrybuty) prosta ( elementy złożone zawieraja tylko elementy typu prostego i atrybuty) elementowa( elementy złożone zawierają tylko inne elementy) mieszana ( elementy złożone zawieraja inne elementy i atrybuty) 54
Elementy typu złożonego Przykład zdefiniowania typu złożonego: <xs:complextype name="usaddress" > <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="street" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="state" type="xs:string"/> <xs:element name="zip" type="xs:decimal"/> </xs:sequence> <xs:attribute name="country" type="xs:nmtoken" fixed="us"/> </xs:complextype> Każdy element pojawiający się w dokumencie instancji o typie zadeklarowanym jako USAddress musi składać się z pięciu elementów i jednego atrybutu. Te elementy muszą być nazwane name, street, city, state oraz zip i dodatkowo elementy te muszą pojawić się dokładnie w kolejności (sequence), w której zostały zadeklarowane. 55
Elementy typu złożonego Element simplecontent służy do definiowania elementów typu złożonego o zawartości prostej. Używając simplecontent należy ograniczyć (restriction) bądź rozszerzyć (extension) element. <xs:element name="shoesize" type="shoetype"/> <xs:complextype name="shoetype"> <xs:simplecontent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simplecontent> </xs:complextype> Deklarując element złożony o zawartości mieszanej atrybut mixed elementu comlextype musi mieć wartość true. <xs:complextype mixed="true"> 56
Element <any> Element <any> umożliwia rozszerzenie dokumentu XML o elementy, które nie są zdefiniowane w opisującym go dokumencie XML Schema Przykład użycia elementu <any> : <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> Wystąpienie <any> umożliwia rozszerzenie elementu person o jakikolwiek inny element. 57
Element <anyattribute> Element <anyattibute> umożliwia rozszerzenie dokumentu XML o atrybuty, które nie są zdefiniowane w dokumencie XML Schema Przykład użycia elementu <anyattribute>: <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> Wystąpienie <anyattribute> umożliwia dodanie jakiejkolwiek liczby atrybutów do elementu person. 58
Uniwersalny format danych proste reguły bazowanie na tekście zaakceptowany standard wspomaganie obsługi tego formatu Isniejące aplikacje MathML (Mathematical Markup Language) XHTML SMIL (Standardized Multimedia Integration Language) CML (Chemical Markup Language) umożliwia graficzne przedstawianie związków chemicznych AML (Astronomy Markup Language) BSML (Biosequence ML) genetyka XBRL (Extensible Business Reporting Language) promowany przez największe instytucje i firmy nowy standard wymiany danych finansowych w Internecie WML, VML, SVG 59