"""Parse a response from WebDAV Requirements: ElementTree """ import traceback, string, StringIO, types #import elementtree as et from elementtree.ElementTree import Element, SubElement, QName#, dump from elementtree import ElementTree STR_XMLSRC0 = r'D:\Dev\UtilWebDAV output.xml' STR_XMLSRC1 = r'D:\Dev\UtilWebDAV output index.xml' STR_XMLSRC2 = r'D:\Dev\UtilWebDAV output 2003-11-27 15.50.44-0800.xml' STR_XMLSRC3 = r'D:\Dev\UtilWebDAV output index.html.xml' STR_PROPSTAT_PROP = '%s/%s' % (QName('DAV:', 'propstat').text, QName('DAV:', 'prop').text) STR_HREF = '%s/%s' % (QName('DAV:', 'response').text, QName('DAV:', 'href').text) def Test_A(): try: et_tree = ElementTree(file=STR_XMLSOURCEFILE) objRoot = et_tree.getroot() #iterate through Response elements #lResponses = objRoot.findall('response') #{DAV:}response vQName = QName('DAV:', 'response') lResponses = objRoot.findall(vQName.text) print 'lResponses has %s elements [%s]' % (len(lResponses), vQName.text) for vEachElem in lResponses: print '\n[%s]' % vEachElem print '\t%s' % vEachElem.findtext(QName('DAV:', 'href').text) vProp = vEachElem.findall(STR_PROPSTAT_PROP) for vSubProp in vProp[0].getchildren(): #getiterator(): if len(vSubProp.getchildren()) > 0: print '%s\t{%s subs}' % (vSubProp.tag, len(vSubProp.getchildren())) else: print '%s\t%s' % (vSubProp.tag, vSubProp.text) except: print traceback.print_exc() def Test_B(): """use XPath subset to get a value""" try: et_tree = ElementTree(file=STR_XMLSRC2) objRoot = et_tree.getroot() elemHREF = objRoot.find('./{DAV:}response/{DAV:}href') #'./{DAV:}response' works if elemHREF != None: print elemHREF.tag, elemHREF.text elemResType = objRoot.find('./{DAV:}response/{DAV:}propstat/{DAV:}prop/{DAV:}resourcetype') if elemResType != None: #has child? print elemResType.tag, elemResType.text #search for collection subelement elemResTypeCol = elemResType.find('{DAV:}collection') if elemResTypeCol == None: print 'resourcetype != collection' else: print 'resourcetype == collection' #if len(elemResType.getchildren()) == 1: ##it's a collection? #print elemResType.getchildren()[0].tag #else: ##not a collection #print 'not a collection' elemContentType = objRoot.find('./{DAV:}response/{DAV:}propstat/{DAV:}prop/{DAV:}getcontenttype') if elemContentType != None: print elemContentType.tag, elemContentType.text except: print traceback.print_exc() def GetAnyValue(ioXML=None, strXPath=''): """retrieve any value""" try: if type(ioXML) in types.StringTypes: ioXML = StringIO.StringIO(ioXML) et_tree = ElementTree.parse(ioXML) objRoot = et_tree.getroot() #elemResType = objRoot.find('./{DAV:}response/{DAV:}propstat/{DAV:}prop/{DAV:}resourcetype') elemX = objRoot.find(strXPath) if elemX == None: #canna find! return None else: #return text value return elemX.text except: print traceback.print_exc() return None def IsACollection(ioXML=None): try: if type(ioXML) in types.StringTypes: ioXML = StringIO.StringIO(ioXML) et_tree = ElementTree.parse(ioXML) objRoot = et_tree.getroot() #elemResType = objRoot.find('./{DAV:}response/{DAV:}propstat/{DAV:}prop/{DAV:}resourcetype') elemResType = objRoot.find(string.join(['.', QName('DAV:', 'response').text, QName('DAV:', 'propstat').text, QName('DAV:', 'prop').text, QName('DAV:', 'resourcetype').text], '/')) if elemResType == None: #can't find it - "err" out return None else: elemCol = elemResType.find(QName('DAV:', 'collection').text) if elemCol == None: return False else: return True except: print traceback.print_exc() return None def __getroot(ioXML=None): try: if type(ioXML) in types.StringTypes: ioXML = StringIO.StringIO(ioXML) et_tree = ElementTree.parse(ioXML) return et_tree.getroot() except: print traceback.print_exc() return None def GetListOfXFromResponse(ioXML=None, strXPath=''): """retrieve any node under response via XPath""" try: assert ioXML != None, 'incoming XML doesn\'t exist' objRoot = __getroot(ioXML) if objRoot == None: #some err return None #get list of whatever lElems = objRoot.findall(strXPath) lReturn = [] for eachElem in lElems: lReturn.append(eachElem.text) return lReturn except: print traceback.print_exc() return None if __name__ == '__main__': #Test_A() #Test_B() #flXML = file(STR_XMLSRC2, 'r') strXMLPath = STR_XMLSRC0 print '\nIsACollection for [%s]\n\t%s' % (strXMLPath, IsACollection(open(strXMLPath, 'r'))) vX = GetListOfXFromResponse(open(strXMLPath, 'r'), STR_HREF) print 'GetListOfXFromResponse result\n%s' % vX