'Use `node` to construct a new block.
Arguments:
node (etree.Element): The xml node to parse into an xblock.
runtime (:class:`.Runtime`): The runtime to use while parsing.
keys (:class:`.ScopeIds`): The keys identifying where this block
will store its data.
id_generator (:class:`.IdGenerator`): An object that will allow the
runtime to generate correct definition and usage ids for
children of this block.
Returns (XBlock): The newly parsed XBlock'

@classmethod
def parse_xml(cls, node, runtime, keys, id_generator):

    url_name = cls._get_url_name(node)
    def_id = id_generator.create_definition(node.tag, url_name)
    usage_id = id_generator.create_usage(def_id)
    aside_children = []
    if is_pointer_tag(node):
        (definition_xml, filepath) = cls.load_definition_xml(node, runtime, def_id)
        aside_children = runtime.parse_asides(definition_xml, def_id, usage_id, id_generator)
    else:
        filepath = None
        definition_xml = node
        dog_stats_api.increment(DEPRECATION_VSCOMPAT_EVENT, tags=['location:xmlparser_util_mixin_parse_xml'])
    (definition, children) = cls.load_definition(definition_xml, runtime, def_id, id_generator)
    if is_pointer_tag(node):
        definition['filename'] = [filepath, filepath]
    metadata = cls.load_metadata(definition_xml)
    dmdata = definition.get('definition_metadata', '')
    if dmdata:
        metadata['definition_metadata_raw'] = dmdata
        try:
            metadata.update(json.loads(dmdata))
        except Exception as err:
            log.debug('Error    in    loading    metadata    %r', dmdata, exc_info=True)
            metadata['definition_metadata_err'] = str(err)
    definition_aside_children = definition.pop('aside_children', None)
    if definition_aside_children:
        aside_children.extend(definition_aside_children)
    cls.apply_policy(metadata, runtime.get_policy(usage_id))
    field_data = {}
    field_data.update(metadata)
    field_data.update(definition)
    field_data['children'] = children
    field_data['xml_attributes']['filename'] = definition.get('filename', ['', None])
    kvs = InheritanceKeyValueStore(initial_values=field_data)
    field_data = KvsFieldData(kvs)
    xblock = runtime.construct_xblock_from_class(cls, ScopeIds(None, node.tag, def_id, usage_id), field_data)
    if aside_children:
        asides_tags = [x.tag for x in aside_children]
        asides = runtime.get_asides(xblock)
        for asd in asides:
            if (asd.scope_ids.block_type in asides_tags):
                xblock.add_aside(asd)
    return xblock
