From d0581628e38d9d6ee096db7ad87a03d4dfcbaa89 Mon Sep 17 00:00:00 2001 From: "bit4bit@riseup.net" Date: Wed, 27 May 2020 16:14:01 +0000 Subject: [PATCH] facho/facho.xml (FachoXML.get_element_text): usa xpath de lxml para consulta FossilOrigin-Name: ddd3843510da9f31ba5963f8a119b689bfee3a62db572dffed14d623a5a0c761 --- facho/facho.py | 26 +++++++++++++++++++++----- tests/test_facho.py | 12 ++++++++++++ tests/test_fe_form.py | 1 + 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/facho/facho.py b/facho/facho.py index 47026ef..f800ef8 100644 --- a/facho/facho.py +++ b/facho/facho.py @@ -85,6 +85,16 @@ class LXMLBuilder: def set_text(self, elem, text): elem.text = text + def xpath(self, elem, xpath): + print('xpath:' + xpath) + print('elem:'+ self.tostring(elem)) + elems = elem.xpath(xpath, namespaces=self.nsmap) + print('xpath elemnts:' + str(elems)) + if elems: + return elems[0] + + return None + def get_text(self, elem): return elem.text @@ -99,7 +109,7 @@ class FachoXML: """ Decora XML con funciones de consulta XPATH de un solo elemento """ - def __init__(self, root, builder=None, nsmap=None): + def __init__(self, root, builder=None, nsmap=None, fragment_prefix=''): if builder is None: self.builder = LXMLBuilder(nsmap) else: @@ -112,6 +122,7 @@ class FachoXML: else: self.root = root + self.fragment_prefix = fragment_prefix self.xpath_for = {} self.extensions = [] @@ -132,8 +143,11 @@ class FachoXML: self.builder.append(elem, new_element) def fragment(self, xpath, append=False): + nodes = xpath.split('/') + nodes.pop() + root_prefix = '/'.join(nodes) parent = self.find_or_create_element(xpath, append=append) - return FachoXML(parent, nsmap=self.nsmap) + return FachoXML(parent, nsmap=self.nsmap, fragment_prefix=root_prefix) def register_alias_xpath(self, alias, xpath): self.xpath_for[alias] = xpath @@ -186,7 +200,8 @@ class FachoXML: def set_element(self, xpath, content, **attrs): xpath = self._normalize_xpath(xpath) format_ = attrs.pop('format_', '%s') - elem = self.find_or_create_element(xpath) + append_ = attrs.pop('append_', False) + elem = self.find_or_create_element(xpath, append=append_) if content: self.builder.set_text(elem, format_ % content) for k, v in attrs.items(): @@ -194,8 +209,9 @@ class FachoXML: return elem def get_element_text(self, xpath, format_=str): - xpath = self._normalize_xpath(xpath) - text = self.builder.get_text(self.find_or_create_element(xpath)) + xpath = self.fragment_prefix + self._normalize_xpath(xpath) + elem = self.builder.xpath(self.root, xpath) + text = self.builder.get_text(elem) return format_(text) def tostring(self): diff --git a/tests/test_facho.py b/tests/test_facho.py index 449c348..6c75abc 100644 --- a/tests/test_facho.py +++ b/tests/test_facho.py @@ -139,4 +139,16 @@ def test_facho_xml_get_element_text(): line.set_element('/Line/Quantity', 5) assert line.get_element_text('/Line/Quantity', format_=int) == 5 +def test_facho_xml_get_element_text_next_child(): + xml = facho.FachoXML('Invoice') + xml.set_element('/Invoice/ID', 'ABC123') + + assert xml.get_element_text('/Invoice/ID') == 'ABC123' + + line = xml.fragment('/Invoice/Line') + line.set_element('/Line/Quantity', 5) + line = xml.fragment('/Invoice/Line', append=True) + line.set_element('/Line/Quantity', 6) + assert line.get_element_text('/Line[2]/Quantity', format_=int) == 6 + diff --git a/tests/test_fe_form.py b/tests/test_fe_form.py index 8e674eb..ce4b5c2 100644 --- a/tests/test_fe_form.py +++ b/tests/test_fe_form.py @@ -106,3 +106,4 @@ def test_invoicesimple_zip(simple_invoice): with zipfile.ZipFile(zipdata) as dianzip: xml_data = dianzip.open(name_invoice).read().decode('utf-8') assert xml_data == str(xml_invoice) +