From f53c4313bf7b3b54b076c14ac50a66d916febdf3 Mon Sep 17 00:00:00 2001 From: saul-timoteo Date: Mon, 10 Nov 2025 11:33:54 +0100 Subject: [PATCH] FIX better empty value detection --- libcomxml/core/__init__.py | 11 +++++++-- tests/test_libcomxml.py | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/libcomxml/core/__init__.py b/libcomxml/core/__init__.py index 2b6bc16..a40740e 100644 --- a/libcomxml/core/__init__.py +++ b/libcomxml/core/__init__.py @@ -96,7 +96,7 @@ def _parse_list(self, element, value): for val in value: if isinstance(val, XmlField): val.parent = element.tag - self.parse_value(element, val) + self._parse_value(element, val) elif isinstance(val, XmlModel): val.build_tree() element.append(val.doc_root) @@ -220,6 +220,13 @@ def __init__(self, name, root, drop_empty=True): def set_xml_encoding(self, encoding): self.xml_enc = encoding + def element_is_empty(self, element): + return ( + (element.text is None or element.text.strip() == "") and + len(element) == 0 and + len(element.attrib) == 0 + ) + def build_tree(self): """Bulids the tree with all the fields converted to Elements """ @@ -243,7 +250,7 @@ def build_tree(self): for item in field: if isinstance(item, XmlField): ele = item.element() - if self.drop_empty and len(ele) == 0: + if self.drop_empty and self.element_is_empty(ele): continue self.doc_root.append(ele) elif isinstance(item, XmlModel): diff --git a/tests/test_libcomxml.py b/tests/test_libcomxml.py index 99904a0..8d16743 100644 --- a/tests/test_libcomxml.py +++ b/tests/test_libcomxml.py @@ -321,6 +321,52 @@ def __init__(self): self.assertXmlEqual(self.xml, str(l)) +class TestElementIsEmptyMethod(XMLTest): + + def setUp(self): + self.xml_empty = "" + + self.xml = "" + self.xml += "Demo Text" + self.xml += "" + + def test_element_is_empty(self): + + class LegalLiterals(XmlModel): + _sort_order = ('legalliterals', 'legalreference') + + def __init__(self): + self.legalliterals = XmlField('LegalLiterals') + self.legalreference = [] + super(LegalLiterals, self).__init__('LegalLiterals', 'legalliterals') + + class LegalReference(XmlField): + + def __init__(self, value=None): + super(LegalReference, self).__init__('LegalReference', value=value) + + #There is no value inside legal literal: the legal reference is empty + legalliterals = LegalLiterals() + text = '' + legalreference = LegalReference(value=text) + legalliterals.legalreference = [legalreference] + is_empty = legalliterals.element_is_empty(legalliterals.legalreference[0].element()) + self.assertTrue(is_empty) + + legalliterals.build_tree() + self.assertXmlEqual(self.xml_empty, str(legalliterals)) + + #There is a value inside legal literal: the legal reference is not empty + legalliterals = LegalLiterals() + text = 'Demo Text' + legalreference = LegalReference(value=text) + legalliterals.legalreference = [legalreference] + is_empty = legalliterals.element_is_empty(legalliterals.legalreference[0].element()) + self.assertFalse(is_empty) + + legalliterals.build_tree() + self.assertXmlEqual(self.xml, str(legalliterals)) + class Namespaces(XMLTest): def setUp(self):