def setDOMBindingNode(self, doc, node): """ sets data on term given by node """ # set name(s) captionnodes=xml.getChildrenByTagName(node,'caption') if captionnodes: for langstringnode in xml.getChildrenByTagName(captionnodes[0],'langstring'): lang=langstringnode.getAttribute('language') or 'default' value=xml.getData(langstringnode) self.setTitle(value,lang=lang) descrnodes=xml.getChildrenByTagName(node,'description') if descrnodes: for langstringnode in xml.getChildrenByTagName(descrnodes[0],'langstring'): lang=langstringnode.getAttribute('language') or 'default' value=xml.getData(langstringnode) self.setDescription(value,lang=lang) # add mediadescriptors for medianode in xml.getChildrenByTagName(node,'mediaDescriptor'): loc = xml.getData(xml.getChildrenByTagName(medianode,'mediaLocator')[0]) id="media.%s" % text.text.convertStringToId(loc) self.invokeFactory('VdexMediaDescriptor',id) self[id].setDOMBindingNode(doc,medianode) # add terms for termnode in xml.getChildrenByTagName(node,'term'): key = xml.getData(xml.getChildrenByTagName(termnode,'termIdentifier')[0]) term=self.createTerm(key) term.setDOMBindingNode(doc,termnode)
def exportXMLBinding(self, sio=StringIO(), newl=VDEX_EXPORT_NEWL, addindent=VDEX_EXPORT_INDENT): """ exports whole vocabulary as IMS VDEX compliant XML """ # prepare minidom minidom =getDOMImplementation('minidom') doc=minidom.createDocument('', 'vdex', '') # build vdex base elroot = xml.getChildrenByTagName(doc,'vdex')[0] # attributes on base xml.setAttr(doc,elroot,'profileType',self.getProfileType()) xml.setAttr(doc,elroot,'xmlns', 'http://www.imsglobal.org/xsd/imsvdex_v1p0') if self.getOrderSignificant(): xml.setAttr(doc,elroot,'orderSignificant',self.getOrderSignificant()) if self.getRegistrationStatus(): xml.setAttr(doc,elroot,'isRegistered',self.getRegistrationStatus()) if self.getDefaultLanguage(): xml.setAttr(doc,elroot,'language',self.getDefaultLanguage()) # node id xml.appendText(doc,elroot,'vocabIdentifier',self.getVocabularyIdentifier() or self.absolute_url()) # node name with langstring elname=xml.appendNode(doc,elroot,'vocabName') for langstring in self.contentValues(): if langstring.meta_type == "VdexLangstring": langnode=langstring.getDOMBindingNode(doc) elname.appendChild(langnode) # all term node for term in self.contentValues(): if term.meta_type == "VdexTerm": node=term.getDOMBindingNode(doc) elroot.appendChild(node) # all realtionship nodes for rel in self.contentValues(): if rel.meta_type == "VdexRelationship": node=rel.getDOMBindingNode(doc) elroot.appendChild(node) doc.writexml(sio, newl='\n', addindent='\t') return sio
def importXMLBinding(self, data): """ imports IMS VDEX compliant XML """ # clean the house #self.manage_delObjects(self.objectIds()) # build a minidom from data #data=data.decode('latin-1') doc=minidom.parseString(data) elroot = xml.getChildrenByTagName(doc,'vdex')[0] # set values from attributes self.setProfileType(elroot.getAttribute('profileType')) value=elroot.getAttribute('orderSignificant') if value is not None: self.setOrderSignificant(value) value=elroot.getAttribute('language') if value: self.setDefaultLanguage(value) value=elroot.getAttribute('isRegistered') if value: self.setRegistrationStatus(value) # set identifier idnodes=xml.getChildrenByTagName(elroot,'vocabIdentifier') if idnodes: self.setVocabularyIdentifier(xml.getData(idnodes[0])) # set name(s) namenodes=xml.getChildrenByTagName(elroot,'vocabName') if namenodes: for langstringnode in xml.getChildrenByTagName(namenodes[0],'langstring'): lang=langstringnode.getAttribute('language') or None value=xml.getData(langstringnode) self.setTitle(value,lang=lang) # update portal_catalog indexes with the full vocabulary information self.reindexObject() # add terms reindexqueue = [] for termnode in xml.getChildrenByTagName(elroot,'term'): key = xml.getData(xml.getChildrenByTagName(termnode,'termIdentifier')[0]) term=self.createTerm(key) term.setDOMBindingNode(doc,termnode) reindexqueue.append(term.getId()) print "reindex new terms" for key in reindexqueue: self[key].reindexObject() print "set savepoint" sp = transaction.savepoint(optimistic=True)