[657] | 1 | |
---|
| 2 | # extremely simple XML writer |
---|
| 3 | # |
---|
| 4 | # This is to remove libxml2 dependency on platforms where it's |
---|
| 5 | # difficult to build |
---|
| 6 | # |
---|
| 7 | # 2003 Attila Tajti <attis@spacehawks.hu> |
---|
| 8 | |
---|
| 9 | class XMLDoc: |
---|
| 10 | |
---|
| 11 | def __init__(self, version): |
---|
| 12 | self.version = version |
---|
| 13 | self.root_element = None |
---|
| 14 | |
---|
| 15 | def saveFile(self, filename): |
---|
| 16 | f = file(filename, "w") |
---|
| 17 | f.write('<?xml version="' + self.version + '"?>\n') |
---|
| 18 | self.root_element._write(f, 0) |
---|
| 19 | |
---|
| 20 | def saveFormatFile(self, filename, fmt): |
---|
| 21 | self.saveFile(filename) |
---|
| 22 | |
---|
| 23 | def freeDoc(self): |
---|
| 24 | pass |
---|
| 25 | |
---|
| 26 | class XMLNode: |
---|
| 27 | |
---|
| 28 | def __init__(self, name): |
---|
| 29 | self.name = name |
---|
| 30 | self.props = [] |
---|
| 31 | self.children = [] |
---|
| 32 | self.content = None |
---|
| 33 | |
---|
| 34 | def docSetRootElement(self, doc): |
---|
| 35 | doc.root_element = self |
---|
| 36 | |
---|
| 37 | def newChild(self, namespace, name, content): |
---|
| 38 | if namespace: |
---|
| 39 | fullname = namespace + ':' + name |
---|
| 40 | else: |
---|
| 41 | fullname = name |
---|
| 42 | child = XMLNode(fullname) |
---|
| 43 | child.content = content |
---|
| 44 | self.children.append(child) |
---|
| 45 | return child |
---|
| 46 | |
---|
| 47 | def setProp(self, name, value): |
---|
| 48 | self.props.append((name, value)) |
---|
| 49 | |
---|
| 50 | def _write(self, f, indent): |
---|
| 51 | #istr = " " * indent |
---|
| 52 | istr = "\t" * indent |
---|
| 53 | |
---|
| 54 | # put together our tag |
---|
| 55 | tag = self.name |
---|
| 56 | for prop in self.props: |
---|
| 57 | name, value = prop |
---|
| 58 | tag += ' ' + name + '="' + value + '"' |
---|
| 59 | |
---|
| 60 | # print tag, or children between tags |
---|
| 61 | if self.children: |
---|
| 62 | f.write(istr + '<%s>\n' % tag) |
---|
| 63 | for child in self.children: |
---|
| 64 | child._write(f, indent + 1) |
---|
| 65 | f.write(istr + '</%s>\n' % self.name) |
---|
| 66 | else: |
---|
| 67 | f.write(istr + '<%s/>\n' % tag) |
---|
| 68 | |
---|
| 69 | def newDoc(version): |
---|
| 70 | return XMLDoc(version) |
---|
| 71 | |
---|
| 72 | def newNode(name): |
---|
| 73 | return XMLNode(name) |
---|
| 74 | |
---|
| 75 | |
---|