Desková hra - Práce se soubory ============================== [listopad 2010] Požadavky --------- - po načtení souboru musí být hra (aplikace) ve stejném stavu jako při uložení = uložit stav desky, nastavení hráčů, hráče na tahu -> historii tahů, stav undo/redo ... započatý tah lidského hráče, stav výběru nejlepšího tahu, stav replay, ... - robustnost - korektní reakce na nekorektní vstup, např. poškozený načítaný soubor - formát souboru čitelný pro člověka - např. TXT, XML, ne serializace objektů do binární podoby - doporučení platformově nezávislé samostatné implementace (mimo logiku i UI) Kontroly načítaného souboru --------------------------- - syntax - má soubor správný formát?, kontrola parsováním - sémantika - jsou v souboru logicky správné informace pro hru?, kontrola inicializací a přehráním hry (z historie tahů, bez zobrazování) TXT --- - libovolný formát - standarní API prog. jazyka nebo systému pro práci se soubory, např. pro C/C++ funkce fopen, fread, fwrite apod. XML (eXtensible Markup Language) -------------------------------- - značkovací = vyznačení struktury dokumentu pomocí značek - rozšiřitelný = pevná syntaxe značek pro strukturování dokumentu, ale bez významu značek (sémantiky, narozdíl od HTML), rozšíření o význam značek (jazyky založené na XML) - jazyk = metajazyk pro vytváření jazyků? - standardní (W3C, World Wide Web Consortium) human readable (textový) rozšiřitelný jazyk (formát) pro tvorbu vlastních jazyků (formátů) s jednoduchou syntaxí a snadnou implementací - standardní jazyky založené na XML: XHTML, XSL, XML Schema, XPath, XQuery (rodina XML), SVG, MathML, SOAP, ... (W3C), DocBook, WML, RSS/Atom, XML-RPC, *Office, XUL, Jabber (jiní) - flexibilní reprezentace čehokoliv (dat. formáty, volání procedur, ...), použitelný ve většině průmyslových odvětví (zejména IT) -> standardní univerzální datový formát Syntaxe XML ........... - pro znalce HTML: podobné HTML, ale přísnější - textové značky (tagy) vymezují elementy, obsah elementu začíná startovacím tagem a povinně končí koncovým tagem nebo prázdný tag obsah - vnořování elementů obsahtext - nekřížení elementů (startovací a koncový tag ve stejném elementu) NE: text - jediný nejvyšší kořenový element - element může mít atributy s hodnotami ve startovacím tagu, hodnoty uvedené v uvozovkách nebo apostrofech (možné vnořit) - jména elementů a atributů podle specifikace: musí začínat písmenem, pak mohou být čísla, tečky, dvojtečky, pomlčky a podtržítka, i diakritika (obecně Unicode znak) - znakové entity pro speciální znaky (<, >, atd.) <, >, &, ", ' - numerické entity pro všechny znaky &, & - case-sensitive, všechny znaky z použité znakové sady (výchozí Unicode) -> syntakticky správný dokument = well-formed dokument - hlavička (deklarace) s použitou znakovou sadou - komentáře - kdekoliv mezi elementy, nelze zakomentovat atributy elementu NE: /> Parsery ....... - pro programátory: čtení a zápis textových souborů -> standardizovaná rozhraní (API) pro práci s dokumentem implementovaná v knihovnách (parserech) - př. Xerces (Java, C++), JAXP (Java), libxml2 (C, C++), M$ XML parser (C++ COM objekt), .NET System.Xml XmlReader (.NET jazyky), S-XML, XMLisp (Common Lisp) SAX (Simple API for XML) - přístup k dokumentu na základě řízení událostí (event-driven přístup) vyvolaných při sekvenčním průchodu dokumentem - rozhraní pro definici callback funkcí (nebo metod objektu handleru) jako reakcí na události vyvolané parserem (začátek, obsah, konec elementu, komentář, atd.) - výhody: rychlost, malá spotřeba paměti - nevýhody: zpracování na jeden průchod, vlastní stavové proměnné v programu, pouze čtení dokumentu! DOM (Document Object Model) - dokument reprezentován jako stromová hierarchie objektů reprezentujících elementy, atributy, textový obsah atd. - celá hierarchie v paměti - obecné rozhraní (funkce) pro procházení a modifikaci dokumentu document.getElementById("elementID") - výhody: jednoduchý (objektový) náhodný přístup -> editory, prohlížeče, pohodlnější přístup k dokumentu - nevýhody: nižší rychlost, paměťová náročnost Data-binding - elementy a atributy jako datové struktury programovacího jazyka - automaticky vygenerovaný kód Programovací jazyky Java - rozhraní JAX (Java API for XML): JAXP (... Processing) - zpracování (DOM, SAX, XSLT), JAXB (Java Architecture for XML Binding) - data-binding a další - JAXP: standarní API pro XML, metody pro vytvoření parseru - aplikace nazávislé na implementaci parseru .NET/C# - stejné knihovny pro všechny .NET jazyky, jmenný prostor System.Xml (dříve knihovna M$XML) - ucelené a komplexní řešení - třídy XmlReader (pull SAX, DOM rozhraní), XmlWriter - XmlReader: abstraktní, implementace XmlTextReader, XmlNodeReader a XmlValidatingReader, ale i vlastní Common Lisp - mnoho různých parserů, http://www.cliki.net/XML - např. S-XML (SAX, DOM, data-binding pomocí XML-ELEMENT struktur), XMLisp (data-binding XML na CLOS objekty), XMLS (jednoduché mapování XML na s-výrazy), CL-XML (SAX, DOM, CLOS data-binding) - Common Lisp binding for DOM C/C++ - libxml2 (C): DOM, SAX (push i pull), mnoho jazykových mutací: libxml++ (C++), lxml (Python), XML::LibXML (Perl), Libxml-Ruby (Ruby) a další, mnoho platforem (portabilní, open source) - nový XmlTextReader podobný .NET - Xerces (C++): DOM, SAX, data-binding do C++, mnoho platforem (open source) Další - PHP (funkce xml_*, XMLReader), Perl (XML::Parser), atd. Schémata (schémové jazyky) .......................... - libovolné značky v XML znamenají příliš volnosti, potřeba známé struktury (sémantiky) -> odvození nového značkovacího jazyka (založeného na XML) pomocí jeho schématu zapsaného pomocí schémového jazyka - jednoznačně formálně definuje značkovací jazyk (datový formát) založený na XML, definice gramatiky jazyka - vyjadřuje typ XML dokumentu, požadavky na značky, jejich strukturu a obsah (jaké elementy, atributy a obsah), někdy také datové typy - hlavní použití: validace oproti schématu = ověření, zda XML vyhovuje schématu (má správnou sémantiku), nutná při výměně a čtení XML dokumentu, podpora parsery - může sloužit i jako dokumentace definovaného jazyka, zdroj pro vytvoření objektového modelu při data-bindingu, apod. - př. schémata XHTML, XSL, SVG, MathML, DocBook, WML, RSS/Atom, ... - přímo ve standardu XML jazyk DTD (Document Type Definition): široká podpora parsery, stačí na použití XML jako strukturovaného formátu, ale nevýhody pro IS a web (zejména chybějící datové typy a jmenné prostory, není XML jazyk) - W3C XML Schema (WXS, XSD, 2001): velká podpora, dostačující, ale složité a obecné, základ: vše je datový typ, hierarchie zabudovaných jednoduchých typů, definice (vlastních) typů, XML jazyk - RelaxNG (RNG, RNC): elegentní, založeno na vzorech, celé schéma vzor, definice (pod)vzorů, XML (RNG) a kompatkní (RNC, úspornější) zápis - navzájem převoditelné, kontextové modelování obsahu vzoru - převod schémat: trang, XML Authority - XML parsery: validace oproti schématu, dnes většina podporuje všechny