Uživatelské nástroje

Nástroje pro tento web


xml

Toto je starší verze dokumentu!


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í xpath - vyhledání elementů výrazem
    • přímé procházení voláním funkcí (tj. dej další uzel, dej potomky, .. )

http://stackoverflow.com/questions/9387610/what-xml-parser-should-i-use-in-c

libXML2

  • 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í

<configuration>
<timestamp>2016-04-01 10:00</timestamp>
 
<methods>
..
</methods>
 
<syssettings>
..
</syssettings>
 
</configuration>
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;
}
  • ukázka parsování atributů
..
<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"/>
..
   // 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;
    }

Vyhledávání přes Xpath

xml.1462787114.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki