dump: Apostrophe can be used as grouping character.
[pspp] / parse-xml.c
index 85fbaf05feee574064ef5c8ccedcbc7d3297d98c..9faa946f45a7ac64574312b8505d139d4e07f2ee 100644 (file)
@@ -67,7 +67,7 @@ print_attributes (xmlNode * a_node)
 {
   for (xmlNode *node = a_node; node; node = node->next)
     {
-      if (node->properties)
+      if (node->type == XML_ELEMENT_NODE)
         {
           printf ("%s", node->name);
           for (xmlAttr *attr = node->properties; attr; attr = attr->next)
@@ -79,6 +79,80 @@ print_attributes (xmlNode * a_node)
     }
 }
 
+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)
 {
@@ -103,10 +177,24 @@ main (int argc, char **argv)
 
   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