#include <libxml/tree.h>
static void
-print_containment (xmlNode * a_node)
+print_containment (xmlNode *node)
{
- for (xmlNode *node = a_node; node; node = node->next)
+ for (; node; node = node->next)
{
- const xmlNode *parent = node->parent;
- if (parent->type == XML_ELEMENT_NODE)
- printf ("%s ", parent->name);
- else
- printf ("<root> ");
-
if (node->type == XML_ELEMENT_NODE)
- printf ("%s", node->name);
- else if (node->type == XML_TEXT_NODE)
- printf("<text>");
- else if (node->type == XML_CDATA_SECTION_NODE)
- printf("<cdata>");
- else
- printf("<other>");
+ {
+ printf ("%s", node->name);
+ for (xmlNode *child = node->children; child; child = child->next)
+ {
+ putchar (' ');
+ if (child->type == XML_ELEMENT_NODE)
+ {
+ printf ("%s", child->name);
- putchar('\n');
+ int n = 0;
+ while (child->next
+ && child->next->type == XML_ELEMENT_NODE
+ && !strcmp((char *) child->name, (char *) child->next->name))
+ {
+ child = child->next;
+ n++;
+ }
+ if (n > 0)
+ putchar ('+');
+ }
+ else if (child->type == XML_TEXT_NODE)
+ printf ("<text>");
+ else if (child->type == XML_CDATA_SECTION_NODE)
+ printf ("<cdata>");
+ else
+ printf ("<%d>", child->type);
+ }
+ putchar ('\n');
+ }
print_containment (node->children);
}
}
+static void
+print_labels (xmlNode *node)
+{
+ for (; node; node = node->next)
+ {
+ if (node->type == XML_ELEMENT_NODE
+ && !strcmp((char *) node->name, "label")
+ && node->parent->type == XML_ELEMENT_NODE
+ && !strcmp((char *) node->parent->name, "container"))
+ {
+ for (xmlNode *child = node->children; child; child = child->next)
+ if (child->type == XML_TEXT_NODE)
+ puts ((char *) child->content);
+ }
+
+ print_labels (node->children);
+ }
+}
+
static void
print_attributes (xmlNode * a_node)
{
for (xmlNode *node = a_node; node; node = node->next)
{
- for (xmlAttr *attr = node->properties; attr; attr = attr->next)
- printf ("%s %s\n", node->name, attr->name);
+ if (node->type == XML_ELEMENT_NODE)
+ {
+ printf ("%s", node->name);
+ for (xmlAttr *attr = node->properties; attr; attr = attr->next)
+ printf (" %s", attr->name);
+ putchar ('\n');
+ }
print_attributes (node->children);
}
}
+static void
+print_string(xmlChar *s)
+{
+ for (char *p = (char *) s; *p; p++)
+ if (*p == '\n')
+ printf ("\\n");
+ else
+ putchar (*p);
+}
+
+static void
+print_cdata (xmlNode * a_node)
+{
+ for (xmlNode *node = a_node; node; node = node->next)
+ {
+ if (node->type == XML_CDATA_SECTION_NODE)
+ {
+ print_string (node->content);
+ putchar ('\n');
+ }
+
+ print_cdata (node->children);
+ }
+}
+
+static void
+print_attribute (xmlNode *node, const char *attr)
+{
+ for (; node; node = node->next)
+ {
+ const char *s = (char *) xmlGetProp (node, (xmlChar *) attr);
+ if (s)
+ printf ("%s %s=%s\n", node->name, attr, s);
+
+ print_attribute (node->children, attr);
+ }
+}
+
+static __attribute__((unused)) xmlNode *
+find_page_setup (xmlNode *node)
+{
+ for (; node; node = node->next)
+ {
+ if (node->name && !strcmp ((char *) node->name, "pageSetup"))
+ return node;
+
+ xmlNode *ps = find_page_setup (node->children);
+ if (ps)
+ return ps;
+ }
+ return NULL;
+}
+
+static void
+print_text (xmlNode *node)
+{
+ for (; node; node = node->next)
+ {
+ if (node->type == XML_ELEMENT_NODE)
+ {
+ printf ("%s", node->name);
+ for (xmlNode *child = node->children; child; child = child->next)
+ if (child->type == XML_TEXT_NODE)
+ {
+ putchar (' ');
+ print_string (child->content);
+ }
+ putchar ('\n');
+ }
+
+ print_text (node->children);
+ }
+}
+
static void
usage (void)
{
xmlNode *root = xmlDocGetRootElement(doc);
+#if 0
+ /* Limit what we look at to pageSetup node and below. */
+ root = find_page_setup(root);
+ if (!root)
+ return 0;
+ root->next = NULL;
+#endif
+
if (!strcmp(argv[2], "containment"))
print_containment (root);
else if (!strcmp(argv[2], "attributes"))
print_attributes (root);
+ else if (!strcmp(argv[2], "cdata"))
+ print_cdata (root);
+ else if (!strcmp(argv[2], "text"))
+ print_text (root);
+ else if (!strncmp(argv[2], "attr:", 5))
+ print_attribute (root, argv[2] + 5);
+ else if (!strcmp(argv[2], "labels"))
+ print_labels (root);
else
usage ();