minor optimization more work on the python bindings, they now support

* xpath.c: minor optimization
* python/generator.py python/libxml.c python/libxml.py
  python/libxml_wrap.h: more work on the python bindings,
  they now support XPath and there is no evident leak
Daniel
diff --git a/python/libxml.py b/python/libxml.py
index 259a08b..476bb27 100644
--- a/python/libxml.py
+++ b/python/libxml.py
@@ -1,5 +1,11 @@
 import _libxml
 
+#
+# This class is the ancestor of all the Node classes. It provides
+# the basic functionalities shared by all nodes (and handle
+# gracefylly the exception), like name, navigation in the tree,
+# doc reference and content access
+#
 class xmlCore:
     def __init__(self, _obj=None):
         if _obj != None: 
@@ -17,7 +23,7 @@
 	    ret = _libxml.properties(self._o)
 	    if ret == None:
 	        return None
-	    return xmlNode(_obj=ret)
+	    return xmlAttr(_obj=ret)
 	elif attr == "children":
 	    ret = _libxml.children(self._o)
 	    if ret == None:
@@ -74,13 +80,25 @@
 	if ret == None:
 	    return None
 	return xmlNode(_obj=ret)
+    def get_properties(self):
+	ret = _libxml.properties(self._o)
+	if ret == None:
+	    return None
+	return xmlAttr(_obj=ret)
+    def get_doc(self):
+	ret = _libxml.doc(self._o)
+	if ret == None:
+	    return None
+	return xmlDoc(_obj=ret)
     def get_prev(self):
 	ret = _libxml.prev(self._o)
 	if ret == None:
 	    return None
 	return xmlNode(_obj=ret)
     def get_content(self):
-	return self.content()
+	return _libxml.xmlNodeGetContent(self._o)
+    def getContent(self):
+	return _libxml.xmlNodeGetContent(self._o)
     def get_name(self):
 	return _libxml.name(self._o)
     def get_type(self):
@@ -94,5 +112,36 @@
         _libxml.freeDoc(self._o)
 	    
 #
+# converters to present a nicer view of the XPath returns
+#
+def nodeWrap(o):
+    # TODO try to cast to the most appropriate node class
+    name = _libxml.name(o)
+    if name == "element" or name == "text":
+        return xmlNode(_obj=o)
+    if name == "attribute":
+        return xmlAttr(_obj=o)
+    if name[0:8] == "document":
+        return xmlDoc(_obj=o)
+    if name[0:8] == "namespace":
+        return xmlNs(_obj=o)
+    if name == "elem_decl":
+        return xmlElement(_obj=o)
+    if name == "attribute_decl":
+        return xmlAtribute(_obj=o)
+    if name == "entity_decl":
+        return xmlEntity(_obj=o)
+    if name == "dtd":
+        return xmlAttr(_obj=o)
+    return xmlNode(_obj=o)
+
+def xpathObjectRet(o):
+    if type(o) == type([]) or type(o) == type(()):
+        ret = map(lambda x: nodeWrap(x), o)
+	return ret
+    return o
+
+#
 # Everything below this point is automatically generated
 #
+