docs: def etree(self, data, root=None):
          '''Convert data structure into a list of etree.Element'''
          result = self.list() if root is None else root
          if isinstance(data, (self.dict, dict)):
              for key, value in data.items():
                  if isinstance(value, (self.dict, dict)):
                      elem = self.element(key)
                      if elem is None:
                          continue
                      result.append(elem)
  
                      if 'attributes' in value:
                          for k, v in value['attributes'].items():
                              elem.set(k, self._tostring(v))
                      # else:
                      #     raise ValueError('Cobra requires "attributes" key for each element')
  
                      if 'children' in value:
                          for v in value['children']:
                              self.etree(v, root=elem)
                  else:
                      elem = self.element(key)
                      if elem is None:
                          continue
                      elem.text = self._tostring(value)
                      result.append(elem)
          else:
              if root is not None:
                  root.text = self._tostring(data)
              else:
                  elem = self.element(self._tostring(data))
                  if elem is not None:
                      result.append(elem)
  
          return result