XML pre programtorov 7 vkend s Linuxom 5

  • Slides: 28
Download presentation
XML pre programátorov 7. víkend s Linuxom 5. – 6. október 2002 Žilina Stanislav

XML pre programátorov 7. víkend s Linuxom 5. – 6. október 2002 Žilina Stanislav Meduna ETM Aktiengesellschaft stano@meduna. org

Obsah • Čo je to XML • Základné princípy • Oblasti využitia • Príklad

Obsah • Čo je to XML • Základné princípy • Oblasti využitia • Príklad dokumentu • Objektové a udalostné rozhrania • libxml 2 • Príklad parsera

Čo je XML • EXtensible Markup Language • Jazyk pre popis informácií – pre

Čo je XML • EXtensible Markup Language • Jazyk pre popis informácií – pre ľudí – pre programy • Sám o sebe nerobí vôbec nič • Je na aplikácii dať dátam význam

Extensible • XML definuje iba štruktúru • Žiadne preddefinované značky • Konkrétne značky sú

Extensible • XML definuje iba štruktúru • Žiadne preddefinované značky • Konkrétne značky sú vecou aplikácie • Dokonalá rozšíriteľnosť

Markup • Stromová štruktúra • Značky – Elementy – Atribúty • Obsah (vlastné informácie)

Markup • Stromová štruktúra • Značky – Elementy – Atribúty • Obsah (vlastné informácie) • Entity

Language • Presne definované pravidlá – Správna syntax (well-formed) – Správna štruktúra (valid) -

Language • Presne definované pravidlá – Správna syntax (well-formed) – Správna štruktúra (valid) - DTD, Xschema • Možnosť automatickej kontroly • Súvisiace štandardy – Namespaces, XSL, XLink, XPointer, . . .

Oblasti použitia • Publikovanie dokumentov • Uchovávanie štruktúrovaných údajov • Protokoly pre výmenu informácií

Oblasti použitia • Publikovanie dokumentov • Uchovávanie štruktúrovaných údajov • Protokoly pre výmenu informácií (napr. SOAP) • Dobré pre profesný životopis : -)

Prečo používať XML? • Formát čitateľný pre človeka aj stroj • Netreba písať „zase

Prečo používať XML? • Formát čitateľný pre človeka aj stroj • Netreba písať „zase ďalší parser“ • Jednoduché rozširovanie • Multiplatformný štandard • Súvisiace štandardy riešia niektoré obvyklé aplikácie

Definícia typu dokumentu • Aké elementy existujú • Aké sú ich atribúty • Aký

Definícia typu dokumentu • Aké elementy existujú • Aké sú ich atribúty • Aký je ich povolený obsah • Kontrola správnosti štruktúry • „Návod“ pre spracovanie • Pomôcka pre čitateľa

Zoznam distribúcií – model Dist. List 0. . n Distro 0. . 1 Free.

Zoznam distribúcií – model Dist. List 0. . n Distro 0. . 1 Free. Only Packaging 0. . n Vendor Version Code. Name Package 0. . n File Name Version Release Free

Zoznam distribúcií – DTD (1) <? xml version="1. 0" encoding="ISO-8859 -1"? > <!-- Priklad

Zoznam distribúcií – DTD (1) <? xml version="1. 0" encoding="ISO-8859 -1"? > <!-- Priklad pre 7. vikend s Linuxom --> <!ENTITY % bool "true | false"> <!ELEMENT Dist. List (Distro*)> <!ELEMENT Distro (Vendor, Version? , Code. Name? , Package*)> <!ATTLIST Distro Free. Only (%bool; ) "false" Packaging (rpm|deb|tgz|other|none) "rpm" >

Zoznam distribúcií – DTD (2) <!ELEMENT Vendor (#PCDATA)> <!ELEMENT Version (#PCDATA)> <!ELEMENT Code. Name

Zoznam distribúcií – DTD (2) <!ELEMENT Vendor (#PCDATA)> <!ELEMENT Version (#PCDATA)> <!ELEMENT Code. Name (#PCDATA)> <!ELEMENT Package (File*)> <!ATTLIST Package Name CDATA #REQUIRED Version CDATA #REQUIRED Release CDATA "" Free (%bool; ) "true" > <!ELEMENT File (#PCDATA)>

Zoznam distribúcií – dokument (1) <? xml version="1. 0" encoding="ISO-8859 -1"? > <!DOCTYPE Dist.

Zoznam distribúcií – dokument (1) <? xml version="1. 0" encoding="ISO-8859 -1"? > <!DOCTYPE Dist. List SYSTEM "distros. dtd"> <Dist. List> <Distro Free. Only="false" Packaging="rpm"> <Vendor>Red Hat</Vendor> <Version>7. 3</Version> <Code. Name>Valhalla</Code. Name> <Package Name="basesystem" Version="7. 0" Release="2"/> <Package Name="redhat-logos" Version="2. 5. 12" Release="1" Free="false"> <File>/usr/share/pixmaps/redhat/shadowman-32. png</File> </Package> </Distro> <Distro Free. Only="true" Packaging="deb"> <Vendor>Debian</Vendor> <Code. Name>Potato</Code. Name> </Distro> </Dist. List>

Zoznam distribúcií – dokument (2). . . <Distro Free. Only="false" Packaging="rpm"> <Vendor>Red Hat</Vendor> <Version>7.

Zoznam distribúcií – dokument (2). . . <Distro Free. Only="false" Packaging="rpm"> <Vendor>Red Hat</Vendor> <Version>7. 3</Version> <Code. Name>Valhalla</Code. Name> <Package Name="basesystem" Version="7. 0" Release="2"/> <Package Name="redhat-logos" Version="2. 5. 12" Release="1" Free="false"> <File>/usr/share/pixmaps/redhat/shadowman-32. png</File> </Package> </Distro>. . .

Parsery • DOM (Document Object Model) – – Strom v pamäti Jednoduchá práca Potrebuje

Parsery • DOM (Document Object Model) – – Strom v pamäti Jednoduchá práca Potrebuje viac pamäti Jednoduchá modifikácia a zápis • SAX (Simple API for XML) – – Callbacky do používateľovho kódu Stavy (a spotreba pamäti) sú vecou používateľa Zložitejšia práca Lepšia kontrola

libxml 2 • • • Linux / Unix / Windows MIT licencia Obyčajné C

libxml 2 • • • Linux / Unix / Windows MIT licencia Obyčajné C Objektové aj udalostné rozhranie Mnoho pohodlných vlastností

DOM Document children parent Distro Root element Dist. List next children Vendor properties Free.

DOM Document children parent Distro Root element Dist. List next children Vendor properties Free. Only prev next Distro Code. Name content next Valhalla Packaging content rpm

SAX – stavový automat Dist. List end. Element start. Element Distro Package Vendor Version

SAX – stavový automat Dist. List end. Element start. Element Distro Package Vendor Version Code. Name

SAX – callbacky <Dist. List> <Distro Free. Only="false" Packaging="rpm" start. Element("Dist. List", { NULL

SAX – callbacky <Dist. List> <Distro Free. Only="false" Packaging="rpm" start. Element("Dist. List", { NULL }) start. Element("Distro", { "Free. Only", "false", "Packaging", "rpm", NULL }) > <Vendor> start. Element("Vendor", { NULL }) Red Hat characters("Red Hat") </Vendor> end. Element("Vendor“)

Libxml 2 – DOM parser (1) #include <libxml/parser. h> #include <libxml/tree. h> #include <stdio.

Libxml 2 – DOM parser (1) #include <libxml/parser. h> #include <libxml/tree. h> #include <stdio. h> int main(int argc, char **argv) { xml. Doc. Ptr doc; xml. Node. Ptr distro, di. El; xml. Attr. Ptr attr; Document Root El Dist. List children Distro xml. Keep. Blanks. Default(0); doc = xml. Parse. File("distros. xml"); distro = xml. Doc. Get. Root. Element(doc)->children;

Libxml 2 – DOM parser (2) while (distro) { if (!strcmp(distro->name, "Distro")) { di.

Libxml 2 – DOM parser (2) while (distro) { if (!strcmp(distro->name, "Distro")) { di. El = distro->children; while (di. El) { if (! strcmp(di. El->name, "Vendor") || ! strcmp(di. El->name, "Code. Name")) printf("%s ", di. El->children->content); di. El = di. El->next; } attr = distro->properties; while (attr) { if (! strcmp(attr->name, "Packaging")) printf("%s ", attr->children->content); attr = attr->next; } } distro = distro->next; printf("n"); } Distro next Distro children Vendor properties Free. Only

Libxml 2 – DOM parser (3) di. El = distro->children; while (di. El) {

Libxml 2 – DOM parser (3) di. El = distro->children; while (di. El) { if (! strcmp(di. El->name, "Vendor") || ! strcmp(di. El->name, "Code. Name")) printf("%s ", di. El->children->content); di. El = di. El->next; next } Vendor Code. Name attr = distro->properties; while (attr) { if (! strcmp(attr->name, "Packaging")) printf("%s ", attr->children->content); attr = attr->next; next } Free. Only Packaging }

Libxml 2 – SAX parser (1) static enum { PARSER_START, PARSER_DISTLIST, PARSER_DISTRO, … }

Libxml 2 – SAX parser (1) static enum { PARSER_START, PARSER_DISTLIST, PARSER_DISTRO, … } parser. State = PARSER_START; …

Libxml 2 – SAX parser (2) static void dist. Start. Element(void *state, const xml.

Libxml 2 – SAX parser (2) static void dist. Start. Element(void *state, const xml. Char *name, const xml. Char **attrs) { Distro switch (parser. State) { Vendor … case PARSER_DISTRO: if (! strcmp(name, "Vendor")) { Version parser. State = PARSER_VENDOR; } else if (! strcmp(name, "Version")) { parser. State = PARSER_VERSION; …

Libxml 2 – SAX parser (3) static void dist. End. Element(void *state, const xml.

Libxml 2 – SAX parser (3) static void dist. End. Element(void *state, const xml. Char *name) { switch (parser. State) { Distro … Vendor case PARSER_VENDOR: case PARSER_VERSION: Version parser. State = PARSER_DISTRO; … }

Libxml 2 – SAX parser (4) static xml. SAXHandler dist. List. Parser = {

Libxml 2 – SAX parser (4) static xml. SAXHandler dist. List. Parser = { … 0, /* start. Document */ 0, /* end. Document */ (start. Element. SAXFunc) dist. Start. Element, /*start. El*/ (end. Element. SAXFunc) dist. End. Element, /*end. El*/ 0, /* reference */ (characters. SAXFunc) dist. Characters, /* characters */ … }; int main(int argc, char **argv) { xml. SAXParse. File(&dist. List. Parser, "distros. xml", 0); } return 0;

Zdroje • Libxml 2 http: //xmlsoft. org • Benoît Marchal: XML v příkladech, Computer

Zdroje • Libxml 2 http: //xmlsoft. org • Benoît Marchal: XML v příkladech, Computer Press 2000 ISBN 80 -7226 -332 -3, http: //www. vltava. cz • Prednáška http: //www. meduna. org/xmlpreprog – Fólie (HTML, Power. Point) – Kompilovateľné príklady

Stanislav Meduna ETM Aktiengesellschaft stano@meduna. org

Stanislav Meduna ETM Aktiengesellschaft stano@meduna. org