improved imports, added addtextelementsfromtuples() helper,

added sample XML in comments
(Boeing r1817)
This commit is contained in:
ahrenholz 2013-12-19 21:34:58 +00:00
parent ca332bd83a
commit bbbf775766

View file

@ -11,7 +11,7 @@ the main public interface here.
''' '''
import os, pwd import os, pwd
from xml.dom.minidom import parse, Document, Node from xml.dom.minidom import parse, Document, Node
from core import pycore from core.netns import nodes
from core.api import coreapi from core.api import coreapi
def addelementsfromlist(dom, parent, iterable, name, attr_name): def addelementsfromlist(dom, parent, iterable, name, attr_name):
@ -33,6 +33,13 @@ def addtextelementsfromlist(dom, parent, iterable, name, attrs):
''' XML helper to iterate through a list and add items to parent using tags ''' XML helper to iterate through a list and add items to parent using tags
of the given name, attributes specified in the attrs tuple, and having the of the given name, attributes specified in the attrs tuple, and having the
text of the item within the tags. text of the item within the tags.
Example: addtextelementsfromlist(dom, parent, ('a','b','c'), "letter",
(('show','True'),))
<parent>
<letter show="True">a</letter>
<letter show="True">b</letter>
<letter show="True">c</letter>
</parent>
''' '''
for item in iterable: for item in iterable:
element = dom.createElement(name) element = dom.createElement(name)
@ -42,6 +49,28 @@ def addtextelementsfromlist(dom, parent, iterable, name, attrs):
txt = dom.createTextNode(item) txt = dom.createTextNode(item)
element.appendChild(txt) element.appendChild(txt)
def addtextelementsfromtuples(dom, parent, iterable, attrs=()):
''' XML helper to iterate through a list of tuples and add items to
parent using tags named for the first tuple element,
attributes specified in the attrs tuple, and having the
text of second tuple element.
Example: addtextelementsfromtuples(dom, parent,
(('first','a'),('second','b'),('third','c')),
(('show','True'),))
<parent>
<first show="True">a</first>
<second show="True">b</second>
<third show="True">c</third>
</parent>
'''
for name, value in iterable:
element = dom.createElement(name)
for k,v in attrs:
element.setAttribute(k, v)
parent.appendChild(element)
txt = dom.createTextNode(value)
element.appendChild(txt)
def gettextelementstolist(parent): def gettextelementstolist(parent):
''' XML helper to parse child text nodes from the given parent and return ''' XML helper to parse child text nodes from the given parent and return
a list of (key, value) tuples. a list of (key, value) tuples.
@ -113,16 +142,16 @@ def getparamssetattrs(dom, param_names, target):
setattr(target, param_name, str(value)) setattr(target, param_name, str(value))
def xmltypetonodeclass(session, type): def xmltypetonodeclass(session, type):
''' Helper to convert from a type string to a class name in pycore.nodes.*. ''' Helper to convert from a type string to a class name in nodes.*.
''' '''
if hasattr(pycore.nodes, type): if hasattr(nodes, type):
return eval("pycore.nodes.%s" % type) return eval("nodes.%s" % type)
else: else:
return None return None
class CoreDocumentParser(object): class CoreDocumentParser(object):
def __init__(self, session, filename, start=False, def __init__(self, session, filename, start=False,
nodecls=pycore.nodes.CoreNode): nodecls=nodes.CoreNode):
self.session = session self.session = session
self.verbose = self.session.getcfgitembool('verbose', False) self.verbose = self.session.getcfgitembool('verbose', False)
self.filename = filename self.filename = filename
@ -240,7 +269,7 @@ class CoreDocumentParser(object):
for node in self.np.getElementsByTagName("Node"): for node in self.np.getElementsByTagName("Node"):
id, name, type = self.getcommonattributes(node) id, name, type = self.getcommonattributes(node)
if type == "rj45": if type == "rj45":
nodecls = pycore.nodes.RJ45Node nodecls = nodes.RJ45Node
else: else:
nodecls = self.nodecls nodecls = self.nodecls
n = self.session.addobj(cls = nodecls, objid = id, name = name, n = self.session.addobj(cls = nodecls, objid = id, name = name,
@ -546,7 +575,7 @@ class CoreDocumentWriter(Document):
''' '''
with self.session._objslock: with self.session._objslock:
for net in self.session.objs(): for net in self.session.objs():
if not isinstance(net, pycore.nodes.PyCoreNet): if not isinstance(net, nodes.PyCoreNet):
continue continue
self.addnet(net) self.addnet(net)
@ -636,7 +665,7 @@ class CoreDocumentWriter(Document):
''' '''
with self.session._objslock: with self.session._objslock:
for node in self.session.objs(): for node in self.session.objs():
if not isinstance(node, pycore.nodes.PyCoreNode): if not isinstance(node, nodes.PyCoreNode):
continue continue
self.addnode(node) self.addnode(node)
@ -833,7 +862,7 @@ class CoreDocumentWriter(Document):
addtextparamtoparent(self, meta, k, v) addtextparamtoparent(self, meta, k, v)
#addparamtoparent(self, meta, k, v) #addparamtoparent(self, meta, k, v)
def opensessionxml(session, filename, start=False, nodecls=pycore.nodes.CoreNode): def opensessionxml(session, filename, start=False, nodecls=nodes.CoreNode):
''' Import a session from the EmulationScript XML format. ''' Import a session from the EmulationScript XML format.
''' '''
doc = CoreDocumentParser(session, filename, start, nodecls) doc = CoreDocumentParser(session, filename, start, nodecls)