+#include <stdio.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+static void
+print_containment (xmlNode * a_node)
+{
+ for (xmlNode *node = a_node; node; node = node->next)
+ {
+ if (node->type == XML_ELEMENT_NODE)
+ {
+ const xmlNode *parent = node->parent;
+ if (parent->type == XML_ELEMENT_NODE)
+ printf ("%s %s\n", parent->name, node->name);
+ else if (parent->type == XML_DOCUMENT_NODE)
+ printf ("<root> %s\n", node->name);
+ }
+
+ print_containment (node->children);
+ }
+}
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2)
+ {
+ fprintf (stderr, "usage: %s FILE.xml\n", argv[0]);
+ exit (1);
+ }
+
+ LIBXML_TEST_VERSION;
+
+ xmlDoc *doc = xmlReadFile(argv[1], NULL, 0);
+ if (doc == NULL)
+ {
+ fprintf (stderr, "error: could not parse file %s\n", argv[1]);
+ exit (1);
+ }
+
+ xmlNode *root = xmlDocGetRootElement(doc);
+ print_containment(root);
+ xmlFreeDoc(doc);
+ xmlCleanupParser();
+
+ return 0;
+}