def parse(self, node): '''Parse the XML DOM node as a query document. ''' if 'query' != node.nodeName: raise ValueError('Expected query but got "%s"' % node.nodeName) self.mimeAccept, self.results = [], [] for child in node.childNodes: if child.nodeType == xml.dom.Node.ELEMENT_NODE: if child.nodeName == u'queryAttributes': self.header = QueryHeader(node=child) elif child.nodeName == u'resultModeID': self.resultModeID = xmlutils.text(child) elif child.nodeName == u'queryPropogationType': self.propType = xmlutils.text(child) elif child.nodeName == u'queryPropogationLevels': self.propLevels = xmlutils.text(child) elif child.nodeName == u'queryMimeAccept': self.mimeAccept.append(xmlutils.text(child)) elif child.nodeName == u'queryMaxResults': self.maxResults = int(xmlutils.text(child)) elif child.nodeName == u'queryKWQString': self.keywordQuery = xmlutils.text(child) elif child.nodeName == u'querySelectSet': self.selects = _parseQueryElements(child) elif child.nodeName == u'queryFromSet': self.froms = _parseQueryElements(child) elif child.nodeName == u'queryWhereSet': self.wheres = _parseQueryElements(child) elif child.nodeName == u'queryResultSet': self.resultSet = QueryResult(node=child)
def _parseProfileElement(node): '''Construct an appropriate profile element from the given DOM node. ''' if node.nodeName != u'profElement': raise ValueError('Expected profElement element but got "%s"' % node.nodeName) settings = dict(elemId=u'UNKNOWN', elemDesc=u'UNKNOWN', elemType=u'UNKNOWN', elemUnit=u'UNKNOWN', elemEnumFlag=u'F', elemComment=u'UNKNOWN') values, syns = [], [] for child in filter(lambda node: node.nodeType == xml.dom.Node.ELEMENT_NODE, node.childNodes): text = xmlutils.text(child) if child.nodeName == u'elemValue': values.append(text) elif child.nodeName == u'elemSynonym': syns.append(text) else: settings[str(child.nodeName)] = text if 'elemName' not in settings: raise ValueError('profElement requires elemName but none specified') if 'elemEnumFlag' not in settings: raise ValueError('profElement requires elemEnumFlag but none specified') # Normally I'd treat only those XML elements where elemEnumFlag as T as possibly producing # unspecified or enumerated, and F producing *only* ranged elements. But PDS profile # servers are producing profile elements with F for elemEnumFlag and yet NO elemMinValue # and elemMaxValue. If they're using the Java profile code, I'd call that a bug in that # code. If they're not, then I'd say they're producing profiles incorrectly. if settings['elemEnumFlag'] == 'T': if len(values) == 0: return UnspecifiedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment']) else: return EnumeratedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment'], values) else: if 'elemMinValue' not in settings or 'elemMaxValue' not in settings: return UnspecifiedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment']) else: return RangedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment'], float(settings['elemMinValue']), float(settings['elemMaxValue']))
def _parseProfileElement(node): '''Construct an appropriate profile element from the given DOM node. ''' if node.nodeName != u'profElement': raise ValueError('Expected profElement element but got "%s"' % node.nodeName) settings = dict(elemId=u'UNKNOWN', elemDesc=u'UNKNOWN', elemType=u'UNKNOWN', elemUnit=u'UNKNOWN', elemEnumFlag=u'F', elemComment=u'UNKNOWN') values, syns = [], [] for child in filter( lambda node: node.nodeType == xml.dom.Node.ELEMENT_NODE, node.childNodes): text = xmlutils.text(child) if child.nodeName == u'elemValue': values.append(text) elif child.nodeName == u'elemSynonym': syns.append(text) else: settings[str(child.nodeName)] = text if 'elemName' not in settings: raise ValueError('profElement requires elemName but none specified') if 'elemEnumFlag' not in settings: raise ValueError( 'profElement requires elemEnumFlag but none specified') # Normally I'd treat only those XML elements where elemEnumFlag as T as possibly producing # unspecified or enumerated, and F producing *only* ranged elements. But PDS profile # servers are producing profile elements with F for elemEnumFlag and yet NO elemMinValue # and elemMaxValue. If they're using the Java profile code, I'd call that a bug in that # code. If they're not, then I'd say they're producing profiles incorrectly. if settings['elemEnumFlag'] == 'T': if len(values) == 0: return UnspecifiedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment']) else: return EnumeratedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment'], values) else: if 'elemMinValue' not in settings or 'elemMaxValue' not in settings: return UnspecifiedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment']) else: return RangedProfileElement(settings['elemName'], settings['elemDesc'], settings['elemType'], settings['elemUnit'], syns, settings['elemComment'], float(settings['elemMinValue']), float(settings['elemMaxValue']))