# HG changeset patch # User Andreas Nolda # Date 1706797914 -3600 # Thu Feb 01 15:31:54 2024 +0100 # Node ID e14572e99e530c4ee2cdd7ae15500404f7b07167 # Parent cf8df0aa233c772dcfcfbbd44c2a3a20decf2399 add support for namespace declarations on non-root elements diff --git a/ChangeLog.md b/ChangeLog.md --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,8 @@ +2024-02-01: + +* add support for namespace declarations on non-root elements +* bump version to 2.12 + 2023-11-04: * reformat code @@ -65,7 +70,7 @@ 2019-04-12: -* support for namespaces +* add support for namespaces * bump version to 2.0 2018-11-19: diff --git a/xgrep.py b/xgrep.py --- a/xgrep.py +++ b/xgrep.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 # xgrep.py -- search for elements in XML files, using XPath 1.0 expressions -# Andreas Nolda 2023-11-04 +# Andreas Nolda 2024-02-01 import sys import argparse @@ -11,7 +11,7 @@ from lxml import etree -version = "2.11" +version = "2.12" parser = argparse.ArgumentParser() @@ -60,7 +60,7 @@ def insert_default_ns(expr, nsmap): - if nsmap: + if "default" in nsmap: subexprs = re.split(r"(" r"/|" # / r"[a-z-]+::|" # axis:: @@ -210,9 +210,10 @@ tree = etree.parse(file, xml_parser) root = tree.getroot() # cf. https://stackoverflow.com/q/4210730: - nsmap = {key if key is not None - else "default": value - for key, value in root.nsmap.items()} + nsmaps = [element.nsmap for element in root.iter()] + nsmap = {key if key is not None else "default": value + for nsmap in nsmaps for key, value in nsmap.items()} + nsexpr = insert_default_ns(args.expr, nsmap) # add regexp namespace *after* inserting default namespace if args.regex: