#!/usr/bin/python3 import copy import os import sys #import lxml.etree as etree #from lxml.builder import ElementMaker from lxml import etree import docing from nitpo import Nitpo class Xpaths(Nitpo): def __init__(self, do_verbose=False): """subscription profiles""" super().__init__() ns = self.const['ns'] self.N = {'n': self.const['ns']} self.nsmap = {None: ns} self.do_verbose = do_verbose def has_it(self, doc, xp): count = len(doc.xpath(xp, namespaces=self.N)) if count == 0: return True return False def txt(self, doc): string = etree.tostring(doc, prettyprint=True).decode() return string def zero_or_one(self, doc, xp): outs = doc.xpath(xp, namespaces=self.N) if len(outs) == 0: return None if len(outs) == 1: return outs[0] err = self.txt(doc) + ' must not have several ' + xp raise Exception(err) def live_surk(self, doc, repcode): live_xp = '/n:profile/n:live/n:surk[@repcode="' + repcode + '"]' return self.zero_or_one(doc, live_xp) def live_surks(self, doc): xp = '/n:profile/n:live/n:surk' outs = doc.xpath(xp, namespaces=self.N) return outs def get_emad(self, ele): xp = '@emad' emads = ele.xpath(xp, namespaces={'n': self.const['ns']}) if len(emads) > 0: return emads[0] print_ele = etree.tostring(ele, pretty_print=True).decode() print_err = "xpaths: no emad in \n" + print_ele print(print_err, file=sys.stderr) return None def get_spro_OLD(self, ele, repcode=None): # omnibus if repcode is None: xp = '//@spro' # normal subscription else: xp = f"//n:surk[@repcode='{repcode}']/@spro" spros = ele.xpath(xp, namespaces={'n': self.const['ns']}) if len(spros) > 0: return spros[0] print_ele = etree.tostring(ele, pretty_print=True).decode() print_err = f"xpath: no spro by '{xp}' in \n" + print_ele raise Exception(print_err) # print(print_err, file=sys.stderr) return None def get_spro(self, ele, repcode=None): xp = f"//n:surk[@repcode='{repcode}']/@spro" spros = ele.xpath(xp, namespaces={'n': self.const['ns']}) if len(spros) > 0: return spros[0] if len(spros) == 0: # omnibus case xp = '//n:surk/@spro' spros = ele.xpath(xp, namespaces={'n': self.const['ns']}) if len(spros) > 0: return spros[0] print_ele = etree.tostring(ele, pretty_print=True).decode() print_err = f"xpath: no spro by '{xp}' in \n" + print_ele print(print_err, file=sys.stderr) return None