Download presentation
Presentation is loading. Please wait.
Published byMorgan Parker Modified over 9 years ago
1
XML pre programátorov 7. víkend s Linuxom 5. – 6. október 2002 Žilina Stanislav Meduna ETM Aktiengesellschaft stano@meduna.org
2
Obsah Čo je to XML Základné princípy Oblasti využitia Príklad dokumentu Objektové a udalostné rozhrania libxml2 Príklad parsera
3
Č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
4
Extensible XML definuje iba štruktúru Žiadne preddefinované značky Konkrétne značky sú vecou aplikácie Dokonalá rozšíriteľnosť
5
Markup Stromová štruktúra Značky –Elementy –Atribúty Obsah (vlastné informácie) Entity
6
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,...
7
Oblasti použitia Publikovanie dokumentov Uchovávanie štruktúrovaných údajov Protokoly pre výmenu informácií (napr. SOAP) Dobré pre profesný životopis :-)
8
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
9
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
10
Zoznam distribúcií – model FreeOnly DistList Distro Packaging VendorVersionCodeNamePackage File Name Version Release Free 0..n 0..1 0..n
11
Zoznam distribúcií – DTD (1) <!ATTLIST Distro FreeOnly (%bool;) "false" Packaging (rpm|deb|tgz|other|none) "rpm" >
12
Zoznam distribúcií – DTD (2) <!ATTLIST Package Name CDATA #REQUIRED Version CDATA #REQUIRED Release CDATA "" Free (%bool;) "true" >
13
Zoznam distribúcií – dokument (1) Red Hat 7.3 Valhalla /usr/share/pixmaps/redhat/shadowman-32.png Debian Potato
14
Zoznam distribúcií – dokument (2)... Red Hat 7.3 Valhalla /usr/share/pixmaps/redhat/shadowman-32.png...
15
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
16
libxml2 Linux / Unix / Windows MIT licencia Obyčajné C Objektové aj udalostné rozhranie Mnoho pohodlných vlastností
17
DOM FreeOnly Document DistList Packaging VendorCodeName Root element Distro children parent next prev children properties next content Valhalla rpm
18
SAX – stavový automat DistList Distro Vendor Version CodeName startElement endElement Package Vendor
19
SAX – callbacky <Distro FreeOnly="false" Packaging="rpm" > Red Hat startElement("Distro", { "FreeOnly", "false", "Packaging", "rpm", NULL }) startElement("DistList", { NULL }) startElement("Vendor", { NULL }) characters("Red Hat") endElement("Vendor“)
20
Libxml2 – DOM parser (1) #include int main(int argc, char **argv) { xmlDocPtr doc; xmlNodePtr distro, diEl; xmlAttrPtr attr; xmlKeepBlanksDefault(0); doc = xmlParseFile("distros.xml"); distro = xmlDocGetRootElement(doc)->children; Document DistList Root El Distro children
21
Libxml2 – DOM parser (2) while (distro) { if (!strcmp(distro->name, "Distro")) { diEl = distro->children; while (diEl) { if (! strcmp(diEl->name, "Vendor") || ! strcmp(diEl->name, "CodeName")) printf("%s ", diEl->children->content); diEl = diEl->next; } attr = distro->properties; while (attr) { if (! strcmp(attr->name, "Packaging")) printf("%s ", attr->children->content); attr = attr->next; } distro = distro->next; printf("\n"); } FreeOnly Vendor Distro next children properties
22
Libxml2 – DOM parser (3) diEl = distro->children; while (diEl) { if (! strcmp(diEl->name, "Vendor") || ! strcmp(diEl->name, "CodeName")) printf("%s ", diEl->children->content); diEl = diEl->next; } attr = distro->properties; while (attr) { if (! strcmp(attr->name, "Packaging")) printf("%s ", attr->children->content); attr = attr->next; } VendorCodeName next FreeOnlyPackaging next
23
Libxml2 – SAX parser (1) static enum { PARSER_START, PARSER_DISTLIST, PARSER_DISTRO, … } parserState = PARSER_START; …
24
Distro Vendor Version static void distStartElement(void *state, const xmlChar *name, const xmlChar **attrs) { switch (parserState) { … case PARSER_DISTRO: if (! strcmp(name, "Vendor")) { parserState = PARSER_VENDOR; } else if (! strcmp(name, "Version")) { parserState = PARSER_VERSION; … Libxml2 – SAX parser (2)
25
Distro Vendor Version static void distEndElement(void *state, const xmlChar *name) { switch (parserState) { … case PARSER_VENDOR: case PARSER_VERSION: parserState = PARSER_DISTRO; … } Libxml2 – SAX parser (3)
26
static xmlSAXHandler distListParser = { … 0, /* startDocument */ 0, /* endDocument */ (startElementSAXFunc) distStartElement, /*startEl*/ (endElementSAXFunc) distEndElement, /*endEl*/ 0, /* reference */ (charactersSAXFunc) distCharacters, /* characters */ … }; int main(int argc, char **argv) { xmlSAXParseFile(&distListParser, "distros.xml", 0); return 0; } Libxml2 – SAX parser (4)
27
Libxml2 http://xmlsoft.orghttp://xmlsoft.org Benoît Marchal: XML v příkladech, Computer Press 2000 ISBN 80-7226-332-3, http://www.vltava.cz http://www.vltava.cz Prednáška http://www.meduna.org/xmlpreprog http://www.meduna.org/xmlpreprog –Fólie (HTML, PowerPoint) –Kompilovateľné príklady Zdroje
28
Stanislav Meduna ETM Aktiengesellschaft stano@meduna.org
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.