Package translate :: Package misc :: Module xmlwrapper
[hide private]
[frames] | no frames]

Source Code for Module translate.misc.xmlwrapper

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  # 
  4  # Copyright 2004, 2005 Zuza Software Foundation 
  5  # 
  6  # This file is part of translate. 
  7  # 
  8  # translate is free software; you can redistribute it and/or modify 
  9  # it under the terms of the GNU General Public License as published by 
 10  # the Free Software Foundation; either version 2 of the License, or 
 11  # (at your option) any later version. 
 12  # 
 13  # translate is distributed in the hope that it will be useful, 
 14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  # GNU General Public License for more details. 
 17  # 
 18  # You should have received a copy of the GNU General Public License 
 19  # along with translate; if not, write to the Free Software 
 20  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 21   
 22  """simpler wrapper to the elementtree XML parser""" 
 23   
 24  try: 
 25      from xml.etree import ElementTree 
 26  except ImportError: 
 27      from elementtree import ElementTree 
 28  # this is needed to prevent expat-version conflicts with wx >= 2.5.2.2 
 29  from xml.parsers import expat 
 30   
 31  basicfixtag = ElementTree.fixtag 
 32   
 33   
34 -def makefixtagproc(namespacemap):
35 """this constructs an alternative fixtag procedure that will use appropriate names for namespaces...""" 36 37 def fixtag(tag, namespaces): 38 """given a decorated tag (of the form {uri}tag), return prefixed tag and namespace declaration, if any""" 39 if isinstance(tag, ElementTree.QName): 40 tag = tag.text 41 namespace_uri, tag = tag[1:].split("}", 1) 42 prefix = namespaces.get(namespace_uri) 43 if prefix is None: 44 if namespace_uri in namespacemap: 45 prefix = namespacemap[namespace_uri] 46 else: 47 prefix = "ns%d" % len(namespaces) 48 namespaces[namespace_uri] = prefix 49 xmlns = ("xmlns:%s" % prefix, namespace_uri) 50 else: 51 xmlns = None 52 return "%s:%s" % (prefix, tag), xmlns
53 return fixtag 54 55
56 -def splitnamespace(fulltag):
57 if '{' in fulltag: 58 namespace = fulltag[fulltag.find('{'):fulltag.find('}')+1] 59 else: 60 namespace = "" 61 tag = fulltag.replace(namespace, "", 1) 62 return namespace, tag
63 64
65 -class XMLWrapper:
66 """simple wrapper for xml objects""" 67
68 - def __init__(self, obj):
69 """construct object from the elementtree item""" 70 self.obj = obj 71 self.namespace, self.tag = splitnamespace(self.obj.tag) 72 self.attrib = {} 73 for fullkey, value in self.obj.attrib.iteritems(): 74 namespace, key = splitnamespace(fullkey) 75 self.attrib[key] = value
76
77 - def getchild(self, searchtag, tagclass=None):
78 """get a child with the given tag name""" 79 if tagclass is None: 80 tagclass = XMLWrapper 81 for childobj in self.obj.getiterator(): 82 # getiterator() includes self... 83 if childobj == self.obj: 84 continue 85 childns, childtag = splitnamespace(childobj.tag) 86 if childtag == searchtag: 87 child = tagclass(childobj) 88 return child 89 raise KeyError("could not find child with tag %r" % searchtag)
90
91 - def getchildren(self, searchtag, tagclass=None, excludetags=[]):
92 """get all children with the given tag name""" 93 if tagclass is None: 94 tagclass = XMLWrapper 95 childobjects = [] 96 for childobj in self.obj.getiterator(): 97 # getiterator() includes self... 98 if childobj == self.obj: 99 continue 100 childns, childtag = splitnamespace(childobj.tag) 101 if childtag == searchtag: 102 childobjects.append(childobj) 103 children = [tagclass(childobj) for childobj in childobjects] 104 return children
105
106 - def gettext(self, searchtag):
107 """get some contained text""" 108 return self.getchild(searchtag).obj.text
109
110 - def getxml(self, encoding=None):
111 return ElementTree.tostring(self.obj, encoding)
112
113 - def getplaintext(self, excludetags=[]):
114 text = "" 115 if self.obj.text != None: 116 text += self.obj.text 117 for child in self.obj._children: 118 simplechild = XMLWrapper(child) 119 if simplechild.tag not in excludetags: 120 text += simplechild.getplaintext(excludetags) 121 if self.obj.tail != None: 122 text += self.obj.tail 123 return text
124
125 - def getvalues(self, searchtag):
126 """get some contained values...""" 127 values = [child.obj.text for child in self.getchildren(searchtag)] 128 return values
129
130 - def __repr__(self):
131 """return a representation of the object""" 132 return self.tag+':'+repr(self.__dict__)
133
134 - def getattr(self, attrname):
135 """gets an attribute of the tag""" 136 return self.attrib[attrname]
137
138 - def write(self, file, encoding="UTF-8"):
139 """writes the object as XML to a file...""" 140 e = ElementTree.ElementTree(self.obj) 141 e.write(file, encoding)
142 143
144 -def BuildTree(xmlstring):
145 parser = ElementTree.XMLTreeBuilder() 146 parser.feed(xmlstring) 147 return parser.close()
148 149
150 -def MakeElement(tag, attrib={}, **extraargs):
151 return ElementTree.Element(tag, attrib, **extraargs)
152