'Create an instance of this descriptor from the supplied data.
Does not require that xml_data be parseable--just stores it and exports
as-is if not.
Takes an extra, optional, parameter--the error that caused an
issue.  (should be a string, or convert usefully into one).'

@classmethod
def from_xml(cls, xml_data, system, id_generator, error_msg=None):

    try:
        xml_obj = etree.fromstring(xml_data)
        if (xml_obj.tag == 'error'):
            xml_data = xml_obj.text
            error_node = xml_obj.find('error_msg')
            if (error_node is not None):
                error_msg = error_node.text
            else:
                error_msg = None
    except etree.XMLSyntaxError:
        error_msg = exc_info_to_str(sys.exc_info())
    return cls._construct(system, xml_data, error_msg, location=id_generator.create_definition('error'))
