#!/usr/bin/env python3 import sys, rich, libxml2 if len(sys.argv) < 3: print(f"Usage: {sys.argv[0]} XML_FILENAME XPATH", file=sys.stderr) exit() try: doc = libxml2.parseFile(sys.argv[1]) ctxt = doc.xpathNewContext() res = ctxt.xpathEval(sys.argv[2]) out = [ dict( node = None if i.name in ("text", sys.argv[1]) else i.name, xpath = i.nodePath(), data = i.content, content = i.content, # /shrug attributes = {child.name: child.content for child in i.properties} if i.properties is not None else {}, ) for e, i in enumerate(res) ] rich.print_json(data=out) finally: doc.freeDoc() ctxt.xpathFreeContext()