* prepare for refactor
This commit is contained in:
-127
@@ -16,13 +16,6 @@
|
|||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
xmlfile is a helper module for accessing XML files using
|
|
||||||
xml.dom.minidom.
|
|
||||||
|
|
||||||
XmlFile class further abstracts a dom object using the
|
|
||||||
high-level dom functions provided in xmlext module (and sorely lacking
|
|
||||||
in xml.dom :( )
|
|
||||||
|
|
||||||
autoxml is a metaclass for automatic XML translation, using
|
autoxml is a metaclass for automatic XML translation, using
|
||||||
a miniature type system. (w00t!) This is based on an excellent
|
a miniature type system. (w00t!) This is based on an excellent
|
||||||
high-level XML processing prototype that Gurer prepared.
|
high-level XML processing prototype that Gurer prepared.
|
||||||
@@ -791,123 +784,3 @@ class autoxml(oo.autosuper, oo.autoprop):
|
|||||||
types.FloatType : float,
|
types.FloatType : float,
|
||||||
types.LongType : long
|
types.LongType : long
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class XmlFile(object):
|
|
||||||
"""A class to help reading and writing an XML file"""
|
|
||||||
|
|
||||||
def __init__(self, tag):
|
|
||||||
self.rootTag = tag
|
|
||||||
self.newDOM()
|
|
||||||
|
|
||||||
def newDOM(self):
|
|
||||||
"""clear DOM"""
|
|
||||||
impl = mdom.getDOMImplementation()
|
|
||||||
self.dom = impl.createDocument(None, self.rootTag, None)
|
|
||||||
|
|
||||||
def unlink(self):
|
|
||||||
"""deallocate DOM structure"""
|
|
||||||
self.dom.unlink()
|
|
||||||
|
|
||||||
def rootNode(self):
|
|
||||||
"""returns root document element"""
|
|
||||||
return self.dom.documentElement
|
|
||||||
|
|
||||||
def readxml(self, fileName):
|
|
||||||
try:
|
|
||||||
self.dom = mdom.parse(fileName)
|
|
||||||
except ExpatError, inst:
|
|
||||||
raise Error(_("File '%s' has invalid XML: %s\n") % (fileName,
|
|
||||||
str(inst)))
|
|
||||||
|
|
||||||
def writexml(self, fileName):
|
|
||||||
f = codecs.open(fileName,'w', "utf-8")
|
|
||||||
f.write(self.dom.toprettyxml())
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
def verifyRootTag(self):
|
|
||||||
actual_roottag = self.rootNode().tagName
|
|
||||||
if actual_roottag != self.rootTag:
|
|
||||||
raise Error(_("Root tagname %s not identical to %s as expected") %
|
|
||||||
(actual_roottag, self.rootTag) )
|
|
||||||
|
|
||||||
# construction helpers
|
|
||||||
|
|
||||||
def newNode(self, tag):
|
|
||||||
return self.dom.createElement(tag)
|
|
||||||
|
|
||||||
def newTextNode(self, text):
|
|
||||||
return self.dom.createTextNode(text)
|
|
||||||
|
|
||||||
def newAttribute(self, attr):
|
|
||||||
return self.dom.createAttribute(attr)
|
|
||||||
|
|
||||||
# read helpers
|
|
||||||
|
|
||||||
def getNode(self, tagPath = ""):
|
|
||||||
"""returns the *first* matching node for given tag path."""
|
|
||||||
self.verifyRootTag()
|
|
||||||
return getNode(self.dom.documentElement, tagPath)
|
|
||||||
|
|
||||||
def getNodeText(self, tagPath):
|
|
||||||
"""returns the text of *first* matching node for given tag path."""
|
|
||||||
node = self.getNode(tagPath)
|
|
||||||
if not node:
|
|
||||||
return None
|
|
||||||
return getNodeText(node)
|
|
||||||
|
|
||||||
def getAllNodes(self, tagPath):
|
|
||||||
"""returns all nodes matching a given tag path."""
|
|
||||||
self.verifyRootTag()
|
|
||||||
return getAllNodes(self.dom.documentElement, tagPath)
|
|
||||||
|
|
||||||
def getChildren(self, tagpath):
|
|
||||||
""" returns the children of the given path"""
|
|
||||||
node = self.getNode(tagpath)
|
|
||||||
return node.childNodes
|
|
||||||
|
|
||||||
# get only elements of a given type
|
|
||||||
#FIXME: this doesn't work
|
|
||||||
def getChildrenWithType(self, tagpath, type):
|
|
||||||
""" returns the children of the given path, only with given type """
|
|
||||||
node = self.getNode(tagpath)
|
|
||||||
return filter(lambda x:x.nodeType == type, node.childNodes)
|
|
||||||
|
|
||||||
# get only child elements
|
|
||||||
def getChildElts(self, tagpath):
|
|
||||||
""" returns the children of the given path, only with given type """
|
|
||||||
node = self.getNode(tagpath)
|
|
||||||
try:
|
|
||||||
return filter(lambda x:x.nodeType == x.ELEMENT_NODE,
|
|
||||||
node.childNodes)
|
|
||||||
except AttributeError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
# write helpers
|
|
||||||
|
|
||||||
def addNode(self, tagPath, newnode = None):
|
|
||||||
"this adds the newnode under given tag path"
|
|
||||||
self.verifyRootTag()
|
|
||||||
return addNode(self.dom.documentElement, tagPath, newnode)
|
|
||||||
|
|
||||||
def addNodeUnder(self, node, tagPath, newnode = None):
|
|
||||||
"this adds the new stuff under node and then following tag path"
|
|
||||||
self.verifyRootTag()
|
|
||||||
return addNode(node, tagPath, newnode)
|
|
||||||
|
|
||||||
def addChild(self, newnode):
|
|
||||||
"add a new child node right under root element document"
|
|
||||||
self.dom.documentElement.appendChild(newnode)
|
|
||||||
|
|
||||||
def addText(self, node, text):
|
|
||||||
"add text to node"
|
|
||||||
node.appendChild(self.newTextNode(text))
|
|
||||||
|
|
||||||
def addTextNode(self, tagPath, text):
|
|
||||||
"add a text node with given tag path"
|
|
||||||
node = self.addNode(tagPath, self.newTextNode(text))
|
|
||||||
return node
|
|
||||||
|
|
||||||
def addTextNodeUnder(self, node, tagPath, text):
|
|
||||||
"add a text node under given node with tag path (phew)"
|
|
||||||
return self.addNodeUnder(node, tagPath, self.newTextNode(text))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user