]> git.mxchange.org Git - flightgear.git/commitdiff
a utility to print an xml file as a property tree
authorehofman <ehofman>
Tue, 16 Jun 2009 12:30:39 +0000 (12:30 +0000)
committerTim Moore <timoore@redhat.com>
Tue, 23 Jun 2009 08:54:08 +0000 (10:54 +0200)
utils/xmlgrep/Makefile.am
utils/xmlgrep/printtree.c [new file with mode: 0644]

index 167f15a9dc37f14fba258f69cfe7edf24d0bcebf..084efb4eefc571946ec1cdef7b93d8e39b7ae42d 100644 (file)
@@ -12,6 +12,9 @@ testxml_LDADD = libxmlconf.a
 printxml_SOURCES = $(xml_SOURCE) printxml.c
 printxml_LDADD = libxmlconf.a
 
+printtree_SOURCES = $(xml_SOURCE) printtree.c
+printtree_LDADD = libxmlconf.a
+
 xmlgrep_SOURCES = $(xml_SOURCE) xmlgrep.c xml.c xml.h
 xmlgrep_LDADD = libxmlconf.a
 
diff --git a/utils/xmlgrep/printtree.c b/utils/xmlgrep/printtree.c
new file mode 100644 (file)
index 0000000..674a7d1
--- /dev/null
@@ -0,0 +1,82 @@
+
+#include <stdio.h>
+#include <malloc.h>
+
+#include "xml.h"
+
+void print_xml(void *, char *, int);
+
+int main(int argc, char **argv)
+{
+  if (argc < 1)
+  {
+    printf("usage: printtree <filename>\n\n");
+  }
+  else
+  {
+    void *rid;
+
+    rid = xmlOpen(argv[1]);
+    if (xmlErrorGetNo(rid, 0) != XML_NO_ERROR)
+    {
+       printf("%s\n", xmlErrorGetString(rid, 1));
+    }
+    else if (rid)
+    {
+      unsigned int i, num;
+      void *xid;
+      xid = xmlMarkId(rid);
+      num = xmlNodeGetNum(xid, "*");
+      for (i=0; i<num; i++)
+      {
+        if (xmlNodeGetPos(rid, xid, "*", i) != 0)
+        {
+          char name[4096] = "";
+          print_xml(xid, (char *)&name, 0);
+        }
+      }
+      free(xid);
+
+      xmlClose(rid);
+    }
+    else
+    {
+      printf("Error while opening file for reading: '%s'\n", argv[1]);
+    }
+  }
+}
+
+void print_xml(void *id, char *name, int len)
+{
+  void *xid = xmlMarkId(id);
+  unsigned int i, num;
+  
+  num = xmlNodeGetNum(xid, "*");
+  if (num == 0)
+  {
+    char *s;
+    s = xmlGetString(xid);
+    if (s)
+    {
+      printf("%s = %s\n", name, s);
+      free(s);
+    }
+  }
+  else
+  {
+    unsigned int i, q;
+
+    name[len++] = '/';
+    for (i=0; i<num; i++)
+    {
+      if (xmlNodeGetPos(id, xid, "*", i) != 0)
+      {
+        int res, i = 4096 - len;
+        res = xmlNodeCopyName(xid, (char *)&name[len], i);
+        print_xml(xid, name, len+res);
+      }
+      else printf("error\n");
+    }
+  }
+}