xml
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| xml [2016/04/13 09:41] – [XML] djbuldog | xml [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| ====== XML ====== | ====== XML ====== | ||
| + | |||
| + | * XML | ||
| + | * každé XML má kořen - tj. hlavní element | ||
| + | * element je ohraničen startovací a ukončovací značkou | ||
| + | * například: | ||
| + | * například: | ||
| + | * element může mít atributy | ||
| + | * například: | ||
| + | * element může mít i návěští | ||
| + | * například: | ||
| + | * jako uzel se označuje element nebo hodnota elementu | ||
| + | |||
| + | * existuje více způsobů jak s XML pracovat, nejčastěji: | ||
| + | * pomocí parseru | ||
| + | * DOM (DOM = Document Object Model) - z XML vyrobí obraz (strom) v paměti. | ||
| + | * SAX (SAX = Simple API for XML) - postupně prochází XML a vyvolává události (uživatelské callback). | ||
| + | * pomocí [[http:// | ||
| + | * přímé procházení voláním funkcí (tj. dej další uzel, dej potomky, .. ) | ||
| {{: | {{: | ||
| ===== libXML2 ===== | ===== libXML2 ===== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | * podporuje SAX i Xpath | ||
| + | * měl jsem ale případ XML, kde mi ani jedno řešení nepřišlo vhodné | ||
| + | * použil jsem přímé procházení, | ||
| + | |||
| + | ===== Přímé procházení ===== | ||
| + | |||
| + | <code xml> | ||
| + | < | ||
| + | < | ||
| + | |||
| + | < | ||
| + | .. | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | .. | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <code c++> | ||
| + | void parseCfg(xmlDocPtr doc, xmlNodePtr cur) { | ||
| + | |||
| + | xmlChar *key; | ||
| + | |||
| + | cur = cur-> | ||
| + | while (cur != NULL) { | ||
| + | |||
| + | if (cur-> | ||
| + | |||
| + | if ((!xmlStrcmp(cur-> | ||
| + | key = xmlNodeListGetString(doc, | ||
| + | xmlFree(key); | ||
| + | } | ||
| + | |||
| + | if ((!xmlStrcmp(cur-> | ||
| + | parseMet(doc, | ||
| + | } | ||
| + | |||
| + | if ((!xmlStrcmp(cur-> | ||
| + | parsePref(doc, | ||
| + | } | ||
| + | |||
| + | } | ||
| + | cur = cur-> | ||
| + | } | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | int parseXmlBuf(const char *buf, int size) { | ||
| + | |||
| + | xmlDocPtr doc; | ||
| + | xmlNodePtr cur; | ||
| + | |||
| + | doc = xmlParseMemory(buf, | ||
| + | |||
| + | if (doc == NULL ) { | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | cur = xmlDocGetRootElement(doc); | ||
| + | |||
| + | if (cur == NULL) { | ||
| + | xmlFreeDoc(doc); | ||
| + | return 2; | ||
| + | } | ||
| + | |||
| + | // check if the buf is XML configuration (root equal to configuration} | ||
| + | if (xmlStrcmp(cur-> | ||
| + | xmlFreeDoc(doc); | ||
| + | return 3; | ||
| + | } | ||
| + | |||
| + | parseCfg(doc, | ||
| + | |||
| + | xmlFreeDoc(doc); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * ukázka parsování atributů | ||
| + | |||
| + | <code xml> | ||
| + | .. | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | .. | ||
| + | </ | ||
| + | |||
| + | <code cpp> | ||
| + | // look for parameters | ||
| + | while (cur != NULL) { | ||
| + | if (cur-> | ||
| + | |||
| + | if ((!xmlStrcmp(cur-> | ||
| + | |||
| + | // look for name and value of parameter | ||
| + | char *name = NULL; | ||
| + | char *value = NULL; | ||
| + | xmlAttr *attribute = NULL; | ||
| + | |||
| + | attribute = cur-> | ||
| + | while(attribute && attribute-> | ||
| + | |||
| + | if ((!xmlStrcmp(attribute-> | ||
| + | if (name) xmlFree(name); | ||
| + | name = (char*)xmlNodeListGetString(cur-> | ||
| + | } | ||
| + | if ((!xmlStrcmp(attribute-> | ||
| + | if (value) xmlFree(value); | ||
| + | value = (char*)xmlNodeListGetString(cur-> | ||
| + | } | ||
| + | |||
| + | attribute = attribute-> | ||
| + | } | ||
| + | |||
| + | if ((value)&& | ||
| + | if (!strcmp((char*)name," | ||
| + | ext_allowed = (!strcmp((char*)value," | ||
| + | } | ||
| + | } | ||
| + | |||
| + | if (name) xmlFree(name); | ||
| + | if (value) xmlFree(value); | ||
| + | } | ||
| + | } | ||
| + | cur = cur-> | ||
| + | } | ||
| + | </ | ||
| + | ===== Vyhledávání přes Xpath ===== | ||
xml.1460533272.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
