From af76dda2d3c72d5712ae4559c38da2829398a27b Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Fri, 22 Nov 2013 11:03:58 +0400 Subject: [PATCH] Show only child namespaces With lxml.etree-based implementation show only child namespaces (calculated as combined namespaces minus parent's namespaces). --- xml | 21 +++++++++++++++------ xml-ANNOUNCE | 6 +++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/xml b/xml index 8bc536f..6cf2276 100755 --- a/xml +++ b/xml @@ -26,7 +26,7 @@ read-only. Implementation based on minidom doesn't understand namespaces, it just shows them among other attributes. ElementTree-based implementation doesn't show namespaces at all. Implementation based on lxml.etree shows namespaces in a -separate file "namespaces"; every child tag includes its parent's namespaces. +separate file "namespaces". It is useful to have a top-down view on an XML structure but it's especially convenient to extract text values from tags. One can get, for example, a @@ -37,7 +37,7 @@ The VFS was inspired by a FUSE xmlfs: https://github.com/halhen/xmlfs """ -__version__ = "0.6.0" +__version__ = "0.6.1" __author__ = "Oleg Broytman " __copyright__ = "Copyright (C) 2013 PhiloSoft Design" __license__ = "GPL" @@ -299,12 +299,21 @@ if use_lxml: def getlocalname(self, name): return etree.QName(name).localname + def _get_local_ns(self, node): + this_nsmap = node.nsmap + parent = node.getparent() + if parent is not None: + parents_nsmap = parent.nsmap + for key in parents_nsmap: + del this_nsmap[key] + return this_nsmap + def has_ns(self, node): - return bool(node.nsmap) + return bool(self._get_local_ns(node)) def ns2text(self, node): ns_accumulator = [] - for name, value in node.nsmap.items(): + for name, value in self._get_local_ns(node).items(): name = name.encode(default_encoding, "replace") value = value.encode(default_encoding, "replace") ns_accumulator.append("%s=%s" % (name, value)) @@ -360,10 +369,10 @@ def mcxml_copyout(): xml_error('There are no attributes') elif path_comp == 'namespaces': - if xmlvfs.has_ns(node): + if xmlvfs.supports_namespaces and xmlvfs.has_ns(element): text = xmlvfs.ns2text(node) else: - xml_error('There are no attributes') + xml_error('There are no namespaces') elif path_comp == 'text': text = xmlvfs.collect_text(node) diff --git a/xml-ANNOUNCE b/xml-ANNOUNCE index 8595910..b546987 100644 --- a/xml-ANNOUNCE +++ b/xml-ANNOUNCE @@ -5,6 +5,10 @@ WHAT IS IT View an XML file in Midnight Commander as a filesystem. +WHAT'S NEW in version 0.6.1 (2013-11-22) + With lxml.etree-based implementation show only child namespaces + (calculated as combined namespaces minus parent's namespaces). + WHAT'S NEW in version 0.6.0 (2013-11-22) Refactored _list() and attrs2text() to be completely generic. @@ -15,7 +19,7 @@ WHAT'S NEW in version 0.4.0 (2013-11-19) Added ElementTree-based implementation. WHAT'S NEW in version 0.3.0 (2013-11-16) - Initial release. + Initial release. Implementation based on minidom. WHERE TO GET -- 2.39.2