

def parse_aws_xml(xml_stream, list_item_tags=None):
    "\n    Parse a stream of XML and return a nested dict.  The dict represents each\n    XML element with a key that matches the element's name and a value of\n    another dict if the element contains at least one child element, or the\n    element's text if it does not.\n\n    For each element whose name appears in the list_item_tags list, its dict\n    value will instead be a list that aggregates the values of every element\n    with that name.\n\n    This function is designed to parse XML from AWS services that include list\n    items alongside other elements, such as S3.\n\n    Examples:\n        <a><b>spam</b><c>eggs</c></a> -> {'a': {'b': 'spam', 'c': 'eggs'}}\n\n        <a>\n          <b>\n            <c>spam</c>\n          </b>          + ['b'] -> {'a': {'b': [{'c': 'spam'}, {'c': 'eggs'}]}}\n          <b>\n            <c>eggs</c>\n          </b>\n        </a>\n    "
    if (list_item_tags is None):
        list_item_tags = ()
    stack = [(None, {
        
    })]
    try:
        for (event, elem) in ElementTree.iterparse(xml_stream, events=('start', 'end')):
            tag = _strip_ns(elem.tag)
            if (event[0] == 's'):
                stack.append((tag, {
                    
                }))
            else:
                if (tag in list_item_tags):
                    stack[(- 2)][1].setdefault(tag, [])
                    if (stack[(- 1)][1] == {
                        
                    }):
                        if (elem.text is not None):
                            stack[(- 2)][1][tag].append(elem.text)
                        else:
                            stack[(- 2)][1][tag].append({
                                
                            })
                    else:
                        stack[(- 2)][1][tag].append(stack[(- 1)][1])
                elif (stack[(- 1)][1] == {
                    
                }):
                    if (elem.text is not None):
                        stack[(- 2)][1][tag] = elem.text
                    else:
                        stack[(- 2)][1][tag] = {
                            
                        }
                else:
                    stack[(- 2)][1][tag] = stack[(- 1)][1]
                stack.pop()
                elem.clear()
    except (ParseError, SyntaxError):
        raise ValueError('XML parse error')
    return stack[0][1]

dataset/ETHPy150Open boto/requestbuilder/requestbuilder/xmlparse.py parse_aws_xml/original