facho/facho.xml (FachoXML.get_element_text): usa xpath de lxml para consulta
FossilOrigin-Name: ddd3843510da9f31ba5963f8a119b689bfee3a62db572dffed14d623a5a0c761
This commit is contained in:
parent
f6705c77fa
commit
d0581628e3
@ -85,6 +85,16 @@ class LXMLBuilder:
|
|||||||
def set_text(self, elem, text):
|
def set_text(self, elem, text):
|
||||||
elem.text = 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):
|
def get_text(self, elem):
|
||||||
return elem.text
|
return elem.text
|
||||||
|
|
||||||
@ -99,7 +109,7 @@ class FachoXML:
|
|||||||
"""
|
"""
|
||||||
Decora XML con funciones de consulta XPATH de un solo elemento
|
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:
|
if builder is None:
|
||||||
self.builder = LXMLBuilder(nsmap)
|
self.builder = LXMLBuilder(nsmap)
|
||||||
else:
|
else:
|
||||||
@ -112,6 +122,7 @@ class FachoXML:
|
|||||||
else:
|
else:
|
||||||
self.root = root
|
self.root = root
|
||||||
|
|
||||||
|
self.fragment_prefix = fragment_prefix
|
||||||
self.xpath_for = {}
|
self.xpath_for = {}
|
||||||
self.extensions = []
|
self.extensions = []
|
||||||
|
|
||||||
@ -132,8 +143,11 @@ class FachoXML:
|
|||||||
self.builder.append(elem, new_element)
|
self.builder.append(elem, new_element)
|
||||||
|
|
||||||
def fragment(self, xpath, append=False):
|
def fragment(self, xpath, append=False):
|
||||||
|
nodes = xpath.split('/')
|
||||||
|
nodes.pop()
|
||||||
|
root_prefix = '/'.join(nodes)
|
||||||
parent = self.find_or_create_element(xpath, append=append)
|
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):
|
def register_alias_xpath(self, alias, xpath):
|
||||||
self.xpath_for[alias] = xpath
|
self.xpath_for[alias] = xpath
|
||||||
@ -186,7 +200,8 @@ class FachoXML:
|
|||||||
def set_element(self, xpath, content, **attrs):
|
def set_element(self, xpath, content, **attrs):
|
||||||
xpath = self._normalize_xpath(xpath)
|
xpath = self._normalize_xpath(xpath)
|
||||||
format_ = attrs.pop('format_', '%s')
|
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:
|
if content:
|
||||||
self.builder.set_text(elem, format_ % content)
|
self.builder.set_text(elem, format_ % content)
|
||||||
for k, v in attrs.items():
|
for k, v in attrs.items():
|
||||||
@ -194,8 +209,9 @@ class FachoXML:
|
|||||||
return elem
|
return elem
|
||||||
|
|
||||||
def get_element_text(self, xpath, format_=str):
|
def get_element_text(self, xpath, format_=str):
|
||||||
xpath = self._normalize_xpath(xpath)
|
xpath = self.fragment_prefix + self._normalize_xpath(xpath)
|
||||||
text = self.builder.get_text(self.find_or_create_element(xpath))
|
elem = self.builder.xpath(self.root, xpath)
|
||||||
|
text = self.builder.get_text(elem)
|
||||||
return format_(text)
|
return format_(text)
|
||||||
|
|
||||||
def tostring(self):
|
def tostring(self):
|
||||||
|
@ -139,4 +139,16 @@ def test_facho_xml_get_element_text():
|
|||||||
line.set_element('/Line/Quantity', 5)
|
line.set_element('/Line/Quantity', 5)
|
||||||
assert line.get_element_text('/Line/Quantity', format_=int) == 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
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,3 +106,4 @@ def test_invoicesimple_zip(simple_invoice):
|
|||||||
with zipfile.ZipFile(zipdata) as dianzip:
|
with zipfile.ZipFile(zipdata) as dianzip:
|
||||||
xml_data = dianzip.open(name_invoice).read().decode('utf-8')
|
xml_data = dianzip.open(name_invoice).read().decode('utf-8')
|
||||||
assert xml_data == str(xml_invoice)
|
assert xml_data == str(xml_invoice)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user