Uživatelské nástroje

Nástroje pro tento web


xml

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
xml [2016/04/13 09:43] – [libXML2] djbuldogxml [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: ''<element1>..</element1>'' - neprázdný element s názvem element1
 +      * například: ''<element1/>'' - prázdný element s názvem element1
 +    * element může mít atributy
 +      * například: ''<element1 atr1='hodnota' atr2=\'hodnota2'>..</element1>''
 +    * element může mít i návěští
 +      * například: ''<namespace1:element1/>''
 +    * 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://www.w3schools.com/xsl/xpath_intro.asp|xpath]] - vyhledání elementů výrazem
 +    * přímé procházení voláním funkcí (tj. dej další uzel, dej potomky, .. )
  
 {{:xml-decision-diag.png?500|http://stackoverflow.com/questions/9387610/what-xml-parser-should-i-use-in-c}} {{:xml-decision-diag.png?500|http://stackoverflow.com/questions/9387610/what-xml-parser-should-i-use-in-c}}
Řádek 7: Řádek 25:
   * [[http://xmlsoft.org/tutorial/index.html|tutoriál vhodný pro začátek]]   * [[http://xmlsoft.org/tutorial/index.html|tutoriál vhodný pro začátek]]
   * [[http://www.xmlsoft.org/html/index.html|programátorská dokumentace]]   * [[http://www.xmlsoft.org/html/index.html|programátorská dokumentace]]
 +
 +  * 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í, viz následující příklad
 +
 +===== Přímé procházení =====
 +
 +<code xml>
 +<configuration>
 +<timestamp>2016-04-01 10:00</timestamp>
 +
 +<methods>
 +..
 +</methods>
 +
 +<syssettings>
 +..
 +</syssettings>
 +
 +</configuration>
 +</code>
 +
 +<code c++>
 +void parseCfg(xmlDocPtr doc, xmlNodePtr cur) {
 +
 +    xmlChar *key;
 +
 +    cur = cur->xmlChildrenNode;
 +    while (cur != NULL) {
 +
 +        if (cur->type == XML_ELEMENT_NODE) {
 +
 +            if ((!xmlStrcmp(cur->name, (const xmlChar *)"timestamp"))) {
 +                key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
 +                xmlFree(key);
 +            }
 +
 +            if ((!xmlStrcmp(cur->name, (const xmlChar *)"methods"))) {
 +                parseMet(doc, cur->xmlChildrenNode);
 +            }
 +
 +            if ((!xmlStrcmp(cur->name, (const xmlChar *)"syssettings"))) {
 +                parsePref(doc, cur->xmlChildrenNode);
 +            }
 +
 +        }
 +        cur = cur->next;
 +    }
 +    return;
 +}
 +
 +int parseXmlBuf(const char *buf, int size) {
 +
 +    xmlDocPtr doc;
 +    xmlNodePtr cur;
 +
 +    doc = xmlParseMemory(buf,size);
 +
 +    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->name, (const xmlChar *) "configuration")) {
 +        xmlFreeDoc(doc);
 +        return 3;
 +    }
 +
 +    parseCfg(doc, cur);
 +
 +    xmlFreeDoc(doc);
 +    return 0;
 +}
 +</code>
 +
 +  * ukázka parsování atributů
 +
 +<code xml>
 +..
 +<parameter name="PerspectiveSeason" value="183"/>
 +<parameter name="LockConfig" value="0"/>
 +<parameter name="extServices" value="1"/>
 +<parameter name="currentMaxThreads" value="2"/>
 +<parameter name="resolveFilter" value="LAN"/>
 +..
 +</code>
 +
 +<code cpp>
 +   // look for parameters
 +    while (cur != NULL) {
 +        if (cur->type == XML_ELEMENT_NODE) {
 +
 +            if ((!xmlStrcmp(cur->name, (const xmlChar *)"parameter"))) {
 +
 +                // look for name and value of parameter
 +                char *name = NULL;
 +                char *value = NULL;
 +                xmlAttr *attribute = NULL;
 +
 +                attribute = cur->properties;
 +                while(attribute && attribute->name && attribute->children) {
 +
 +                    if ((!xmlStrcmp(attribute->name, (const xmlChar *)"name"))) {
 +                        if (name) xmlFree(name);
 +                        name = (char*)xmlNodeListGetString(cur->doc, attribute->children, 1);
 +                    }
 +                    if ((!xmlStrcmp(attribute->name, (const xmlChar *)"value"))) {
 +                        if (value) xmlFree(value);
 +                        value = (char*)xmlNodeListGetString(cur->doc, attribute->children, 1);
 +                    }
 +
 +                    attribute = attribute->next;
 +                }
 +
 +                if ((value)&&(name)) {
 +                    if (!strcmp((char*)name,"extServices")) {
 +                        ext_allowed = (!strcmp((char*)value,"1"));
 +                    }
 +                }
 +
 +                if (name) xmlFree(name);
 +                if (value) xmlFree(value);
 +            }
 +        }
 +        cur = cur->next;
 +    }
 +</code>
 +===== Vyhledávání přes Xpath =====
 +
xml.1460533418.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki