Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions libcomxml/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
"""
Expand All @@ -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):
Expand Down
46 changes: 46 additions & 0 deletions tests/test_libcomxml.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,52 @@ def __init__(self):

self.assertXmlEqual(self.xml, str(l))

class TestElementIsEmptyMethod(XMLTest):

def setUp(self):
self.xml_empty = "<LegalLiterals/>"

self.xml = "<LegalLiterals>"
self.xml += "<LegalReference>Demo Text</LegalReference>"
self.xml += "</LegalLiterals>"

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):
Expand Down