XML pre programtorov 7 vkend s Linuxom 5
- Slides: 28
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 dokumentu • Objektové a udalostné rozhrania • libxml 2 • Príklad parsera
Č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ú vecou aplikácie • Dokonalá rozšíriteľnosť
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) - 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í (napr. SOAP) • Dobré pre profesný životopis : -)
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ý 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. 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 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 (#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. 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. 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 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 Objektové aj udalostné rozhranie Mnoho pohodlných vlastností
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 Code. Name
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. 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. 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) { 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, … } parser. State = PARSER_START; …
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. 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 = { … 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 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
- Znacznik pre /pre jest stosowany w celu wyświetlenia
- парсер для чего нужен
- Streaming xml parser
- Xray xml editor
- Xml
- Sax programming
- Sgbd xml
- Xml reporting tool
- Ramzes import faktur xml
- What is the gpa equivalent of hibernate.cfg.xml file
- Xml stands
- Parse xml in power automate
- I hate xml
- Reading basics
- Mal xml
- E language
- Xml 101
- What is xml used for
- Terasoluna
- Xml based web services
- Mismo xml
- Xml
- Java xml deserialization
- 자바 sax xml 파싱
- Xml 예시
- Xml format
- "xml webservices"
- Xml meaning
- Microsoft xml paper specification essentials pack