Libxml

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

XML-Dateien erzeugen

#include <libxml/tree.h>
#include <stdio.h>

int
main(void) 
{
  xmlDoc *doc = xmlNewDoc("1.0");
  if(! doc) {
    fprintf(stderr, "unable to allocate new xml document");
    return 1;
  }

  xmlNs *ns = xmlNewNs(NULL, "http://brokenpipe.de/", "bpipe");
  if(! ns) {
    fprintf(stderr, "unable to register own namespace");
    return 1;
  }

  xmlNode *root = xmlNewNode(ns, "rootnode");
  if(! root) {
    fprintf(stderr, "unable to allocate future root node");
    return 1;
  }

  /* write out xmlns:bpipe= declarator on root node */
  root->nsDef = ns;

  xmlDocSetRootElement(doc, root);

  xmlNode *childnode = xmlNewChild(root, ns, "child", "blablub");
  if(! childnode) {
    fprintf(stderr, "unable to allocate child node");
    return 1;
  }

  xmlNewProp(childnode, "content", "text");
  xmlNewProp(childnode, "foo", "bar");

  if(! xmlNewChild(childnode, ns, "text", "inhalt")) {
    fprintf(stderr, "unable to allocate text sub-node");
    return 1;
  }

  xmlSaveFormatFile("-", doc, 1);
  return 0;
}

obenstehendes Programm sollte folgende Ausgabe von sich geben:

 <?xml version="1.0"?>
<bpipe:rootnode xmlns:bpipe="http://brokenpipe.de/">
  <bpipe:child content="text" foo="bar">blablub<bpipe:text>inhalt</bpipe:text></bpipe:child>
</bpipe:rootnode>


Elemente wieder lesen

#include <libxml/tree.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/parser.h>

#include <stdio.h>

int
main(void) 
{
    xmlDoc *doc = xmlParseFile("zerties.xml");
    if(! doc) {
        fprintf(stderr, "unable to read input file\n");
        return 1;
    }

    xmlXPathInit();

    xmlXPathContext *ctx = xmlXPathNewContext(doc);
    if(! ctx) {
      fprintf(stderr, "unable to create context\n");
      return 1;
    }

    xmlXPathRegisterNs(ctx, "bpipe", "http://brokenpipe.de/");

    const xmlChar *xpath_expr = "/bpipe:rootnode/bpipe:child/bpipe:text/text()";
    xmlXPathObject *obj = xmlXPathEvalExpression(xpath_expr, ctx);

    if(! obj) {
      fprintf(stderr, "xmlXPathEvalExpression call failed.\n");
      return 1;
    }

    printf("Ergebnis: %s\n", xmlXPathCastToString(obj));
    return 0;
}

Abfrage von Attributen

Selbstverständlich können mit XPath auch Attribute abgefragt werden. Um zum Beispielt das Attribut foo aus dem obenstehend abgedruckten XML-File zu extrahieren, ist folgende XPath-Expression zu verwenden:

const xmlChar *xpath_expr = "/bpipe:rootnode/bpipe:child/@foo";

Anstelle von @foo kann auch attribute::foo verwendet werden. Achtung, zwei Doppelpunkte, ansonsten würde es sich um den Namespace attribute handeln...

Weiterführende Informationen zum Thema XPath findet ihr hier: XPath Tutorial des W3C

Compilen ...

  CFLAGS="`xml2-config --cflags` -Wall -W -ggdb"
  LDFLAGS="`xml2-config --libs`"