In [12]:
import pandas as pd
import xml.etree.ElementTree as ET

In [13]:
'''
a shortcut to ET.SubElenment(parent, child).text ( and *.text = text )
'''
def add_node(parent, child, text):
    if type(text)==str:
        ET.SubElement(parent, child).text = text
    else:
        ET.SubElement(parent, child)

In [14]:
'''
pretty print xml from http://effbot.org/zone/element-lib.htm#prettyprint
'''
def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

In [15]:
# load features and variables from csv
features_all = pd.read_csv('./WEAP_default_features.csv')
variables_all = pd.read_csv('./WEAP_default_variables.csv')

In [27]:
# template name
tpl = ET.Element('template_definition')
tree = ET.ElementTree(tpl)
ET.SubElement(tpl, 'template_name').text = 'WEAP template'

In [28]:
'''
add layout
'''
layout = ET.SubElement(tpl, 'layout')
item = ET.SubElement(layout, 'item')
add_node(item, 'name', 'grouping')
value = ET.SubElement(item, 'value')
add_node(value, 'name', 'WEAP')
add_node(value, 'description', 'A template to mimick WEAP features and symbols')
categories = ET.SubElement(value, 'categories')

cats = features_all.category.unique()
for cat in cats:
    category = ET.SubElement(categories, 'category')
    for attr in ['name', 'description', 'displayname']:
        add_node(category, attr, cat)
    groups = ET.SubElement(category, 'groups')
    
    features = features_all[features_all.category==cat]
    for f in features.itertuples():
        group = ET.SubElement(groups, 'group')
        add_node(group, 'name', f.name)
        add_node(group, 'description', f.description)
        add_node(group, 'displayname', f.displayname)
        add_node(group, 'image', f.image)

In [35]:
'''
add resources
'''
resources = ET.SubElement(tpl, 'resources')

features = variables_all.feature.unique()
for feature in features:

    resource = ET.SubElement(resources, 'resource')

    # add resource layout info
    
    
    # add resource info
    add_node(resource, 'type', 'NODE')
    add_node(resource, 'name', feature)
    layout = ET.SubElement(resource, 'layout')
    item = ET.SubElement(layout, 'item')
    add_node(item, 'name', 'image')
    add_node(item, 'value', 'images\\'+feature+'.png')
    item = ET.SubElement(layout, 'item')
    add_node(item, 'name', 'group')
    add_node(item, 'value', feature)
    
    # add variables
    feature_variables = variables_all[variables_all.feature == feature]
    for v in feature_variables.itertuples():
        attr = ET.SubElement(resource, 'attribute')
        add_node(attr, 'name', v.variable)
        add_node(attr, 'default', v.default_value)
        add_node(attr, 'unit', v.unit)
        add_node(attr, 'scale', v.scale)
        add_node(attr, 'per_unit', v.per_unit)
        if v.has_dest=='TRUE':
            ET.SubElement(attr, 'to')
        if v.has_src=='TRUE':
            ET.SubElement(attr, 'from')

In [36]:
indent(tpl)

In [37]:
tree.write('./WEAP template/template/template.xml', xml_declaration=True, encoding='utf-8')

In [ ]: