Source code for rofunc.utils.robolab.formatter.urdf_parser.xml_reflection.basics
import collections
import string
import yaml
from lxml import etree
[docs]def xml_string(rootXml, addHeader=True):
# Meh
xmlString = etree.tostring(rootXml, pretty_print=True, encoding="unicode")
if addHeader:
xmlString = '<?xml version="1.0"?>\n' + xmlString
return xmlString
[docs]def dict_sub(obj, keys):
return dict((key, obj[key]) for key in keys)
[docs]def node_add(doc, sub):
if sub is None:
return None
if type(sub) == str:
return etree.SubElement(doc, sub)
elif isinstance(sub, etree._Element):
doc.append(sub) # This screws up the rest of the tree for prettyprint
return sub
else:
raise Exception("Invalid sub value")
[docs]def pfloat(x):
return str(x).rstrip(".")
[docs]def xml_children(node):
children = node.getchildren()
def predicate(node):
return not isinstance(node, etree._Comment)
return list(filter(predicate, children))
[docs]def isstring(obj):
try:
return isinstance(obj, basestring)
except NameError:
return isinstance(obj, str)
[docs]def to_yaml(obj):
"""Simplify yaml representation for pretty printing"""
# Is there a better way to do this by adding a representation with
# yaml.Dumper?
# Ordered dict: http://pyyaml.org/ticket/29#comment:11
if obj is None or isstring(obj):
out = str(obj)
elif type(obj) in [int, float, bool]:
return obj
elif hasattr(obj, "to_yaml"):
out = obj.to_yaml()
elif isinstance(obj, etree._Element):
out = etree.tostring(obj, pretty_print=True)
elif type(obj) == dict:
out = {}
for (var, value) in obj.items():
out[str(var)] = to_yaml(value)
elif hasattr(obj, "tolist"):
# For numpy objects
out = to_yaml(obj.tolist())
elif isinstance(obj, collections.Iterable):
out = [to_yaml(item) for item in obj]
else:
out = str(obj)
return out
[docs]class SelectiveReflection(object):
[docs] def get_refl_vars(self):
return list(vars(self).keys())
[docs]class YamlReflection(SelectiveReflection):
[docs] def to_yaml(self):
raw = dict((var, getattr(self, var)) for var in self.get_refl_vars())
return to_yaml(raw)
def __str__(self):
# Good idea? Will it remove other important things?
return yaml.dump(self.to_yaml()).rstrip()