Чтение XML

xmlText=open("!/fml.xml").read().decode("cp866")
xml=QDomDocument()
xml.setContent(xmlText.encode("utf8"))
#доступ к элементу по известному пути
buyer=getDomElements(xml,"document/buyer")
print getDomElementText(xml,"document/buyer")
#доступ к атрибуту элемента по известному пути
print getDomElements(xml,"document")[0].attribute("contentEncoding")
#или так:
print getDomElementAttr(z,"SUMOPER","ed")
#обход всех вложенных элементов
for x in xrange(buyer[0].childNodes().count()):
    #имя элемента
    print buyer[0].childNodes().at(x).toElement().tagName()
    #значение элемента
    print unicode(buyer[0].childNodes().at(x).toElement().text())
    #значение элемента - еще один вариант
    print getDomElementText(xml,"document/buyer/%s" % buyer[0].childNodes().at(x).toElement().tagName())



и сами магические getDomElements , getDomElementText и getDomElementAttr 
def getDomElements(xmlDom,xmlPath):
    el=xmlDom
    pathList=xmlPath.split("/")
    for x in xrange(len(pathList)):
        tmp=el.elementsByTagName(pathList[x])
        if tmp.count()>0:
            if x<len(pathList)-1:
                el=el.elementsByTagName(pathList[x]).at(0).toElement()
            else:
                el=[]
                for y in xrange(tmp.count()):
                    el.append(tmp.at(y).toElement())
        else:
            return []
    return el

def getDomElementText(xmlDom,xmlPath):
    el=getDomElements(xmlDom,xmlPath)
    if el:
        if isinstance(el, list):
            return unicode(el[0].text())
        else:
            return unicode(el.text())
    else:
        return "" 

def getDomElementAttr(xmlDom,xmlPath,attr):
	eList=getDomElements(xmlDom,xmlPath)
	if eList:
		return eList[0].attribute(attr)
	else:
		return ""