from browser import document def export_to_xml(model): xml_document = export_entry(model.entry) serializer = __new__(XMLSerializer()) return serializer.serializeToString(xml_document); def export_entry(entry): parser = __new__(DOMParser()) doc = parser.parseFromString("", "text/xml") entry_xml = doc.firstChild # create head head = doc.createElement("head") entry_xml.appendChild(head) status = doc.createElement("status") status.textContent = entry.status head.appendChild(status) headword = doc.createElement("headword") headword_lemma = doc.createElement("lemma") headword_lemma.textContent = entry.headword headword.appendChild(headword_lemma) head.appendChild(headword) grammar = doc.createElement("grammar") grammar_category = doc.createElement("category") grammar_category.textContent = entry.grammar grammar.appendChild(grammar_category) head.appendChild(grammar) comment = doc.createElement("comment") comment.textContent = entry.comment head.appendChild(comment) head.appendChild(_export_label_list(doc, entry.labels)) variants = doc.createElement("variantList") head.appendChild(variants) for v in entry.variants: variant = doc.createElement("variant") variant.textContent = v variants.appendChild(variant) # now lets do body body = doc.createElement("body") entry_xml.appendChild(body) sense_list = doc.createElement("senseList") body.appendChild(sense_list) for sense in entry.senses: sense_list.appendChild(export_sense(doc, sense)) return doc def export_sense(doc, sense): sense_xml = doc.createElement("sense") sense_xml.appendChild(_export_label_list(doc, sense.labels)) definition_list = doc.createElement("definitionList") sense_xml.appendChild(definition_list) definition = doc.createElement("definition") definition.textContent = sense.definition definition.setAttribute("type", "indicator") definition_list.appendChild(definition) translation_container_list = doc.createElement("translationContainerList") sense_xml.appendChild(translation_container_list) for cidx, cluster in enumerate(sense.translations): for translation in cluster: translation_container = export_translation(doc, translation) translation_container.setAttribute("cluster", str(cidx + 1)) translation_container_list.appendChild(translation_container) example_container_list = doc.createElement("exampleContainerList") sense_xml.appendChild(example_container_list) for example in sense.examples: example_container = doc.createElement("exampleContainer") example_container_list.appendChild(example_container) example_xml = doc.createElement("example") example_xml.textContent = example.example example_container.appendChild(example_xml) translation_container = doc.createElement("translationContainer") example_container.appendChild(translation_container) for t in example.translations: translation = doc.createElement("translation") translation.textContent = t translation_container.appendChild(translation) return sense_xml def export_translation(doc, translation): translation_xml = doc.createElement("translationContainer") actual_t = doc.createElement("translation") actual_t.textContent = translation.translation if translation.source: actual_t.setAttribute("source", translation.source) translation_xml.appendChild(actual_t) explanation = doc.createElement("explanation") explanation.textContent = translation.explanation translation_xml.appendChild(explanation) translation_xml.appendChild(_export_label_list(doc, translation.tags)) return translation_xml def _export_label_list(doc, lst): result = doc.createElement("labelList") for key, value in lst: label_el = doc.createElement("label") label_el.textContent = value label_el.setAttribute('type', key) result.appendChild(label_el) return result