'Parses XML string and returns object representation of relevant info.
Args:
xml_str: The XML string.
Returns:
A QueueXml object containing information about task queue
specifications from the XML.
Raises:
AppEngineConfigException: In case of malformed XML or illegal inputs.'

def ProcessXml(self, xml_str):

    try:
        self.errors = []
        xml_root = ElementTree.fromstring(xml_str)
        if (xml_parser_utils.GetTag(xml_root) != 'queue-entries'):
            raise AppEngineConfigException('Root    tag    must    be    <queue-entries>')
        self.queue_xml = QueueXml()
        self.queue_xml.queues = []
        self.queue_xml.total_storage_limit = xml_parser_utils.GetChildNodeText(xml_root, 'total-storage-limit')
        for child in xml_parser_utils.GetNodes(xml_root, 'queue'):
            self.ProcessQueueNode(child)
        if self.errors:
            raise AppEngineConfigException('\n'.join(self.errors))
        return self.queue_xml
    except ElementTree.ParseError as e:
        raise AppEngineConfigException(('Bad    input    --    not    valid    XML:    %s' % e))
