Index: /trunk/ippTools/src/pxtree.c
===================================================================
--- /trunk/ippTools/src/pxtree.c	(revision 14588)
+++ /trunk/ippTools/src/pxtree.c	(revision 14589)
@@ -134,2 +134,25 @@
     return true;
 }
+
+pxNode *pxTreeFromMetadata(psMetadata *md)
+{
+    psHash *nodeNames = psHashAlloc(10);
+
+    psMetadataIterator *iter = psMetadataIteratorAlloc(md, 0, NULL);
+    psMetadataItem *item = NULL;
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        if (!(item->type == PS_DATA_STRING)) {
+            continue;
+        }
+        pxNode *parent = psHashLookup(nodeNames, item->data.str);
+        pxNode *node = pxNodeAlloc(item->name, parent);
+        psHashAdd(nodeNames, item->name, node);
+        psFree(node);
+    }
+    psFree(iter);
+
+    pxNode *root = psHashLookup(nodeNames, "root");
+    psFree(nodeNames);
+
+    return root;
+}
Index: /trunk/ippTools/src/pxtree.h
===================================================================
--- /trunk/ippTools/src/pxtree.h	(revision 14588)
+++ /trunk/ippTools/src/pxtree.h	(revision 14589)
@@ -57,4 +57,6 @@
 bool pxNodeHasGrandChildren(pxNode *node);
 
+pxNode *pxTreeFromMetadata(psMetadata *md);
+
 
 /*
