facho/facho.xml (FachoXML.get_element_text): usa xpath de lxml para consulta
FossilOrigin-Name: ddd3843510da9f31ba5963f8a119b689bfee3a62db572dffed14d623a5a0c761
This commit is contained in:
		| @@ -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) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user