81 lines
2.2 KiB
Python
81 lines
2.2 KiB
Python
#!/usr/bin/env python
|
|
|
|
from xml.dom import minidom
|
|
|
|
def load(xmlfile, tag, has_name=True, do_array=None):
|
|
dom = minidom.parse(xmlfile)
|
|
xmlNodes = dom.getElementsByTagName(tag)
|
|
|
|
dictionary = {}
|
|
for xmlNode in xmlNodes:
|
|
mdic = {}
|
|
# Name is stored as a property and not a node.
|
|
if(has_name):
|
|
name = xmlNode.attributes["name"].value
|
|
|
|
# Process the nodes.
|
|
for bignode in filter(lambda x: x.nodeType==x.ELEMENT_NODE, xmlNode.childNodes):
|
|
# Load the nodes.
|
|
section = {}
|
|
array = []
|
|
for node in filter(lambda x: x.nodeType==x.ELEMENT_NODE,
|
|
bignode.childNodes):
|
|
if bignode.nodeName in do_array: # Big ugly hack to use list instead of array.
|
|
array.append(node.firstChild.data)
|
|
else: # Normal way (but will overwrite lists).
|
|
section[node.nodeName] = node.firstChild.data
|
|
|
|
if len(array) > 0:
|
|
mdic[bignode.nodeName] = array
|
|
else:
|
|
mdic[bignode.nodeName] = section
|
|
|
|
# Append the element to the dictionary.
|
|
dictionary[name] = mdic
|
|
|
|
dom.unlink()
|
|
return dictionary
|
|
|
|
def save(xmlfile, data, basetag, tag, has_name=True, do_array=None):
|
|
"""
|
|
do_array is a DICTIONARY, not a list here
|
|
"""
|
|
xml = minidom.Document()
|
|
|
|
base = xml.createElement(basetag)
|
|
|
|
for key, value in data.items():
|
|
|
|
elem = xml.createElement(tag)
|
|
if has_name:
|
|
elem.setAttribute("name", key)
|
|
|
|
for key2, value2 in value.items():
|
|
node = xml.createElement(key2)
|
|
|
|
# Check if it needs to parse an array instead of a dictionary.
|
|
if do_array != None and key2 in do_array.keys():
|
|
for text in value2:
|
|
node2 = xml.createElement(do_array[key2])
|
|
txtnode = xml.createTextNode(text)
|
|
node2.appendChild(txtnode)
|
|
node.appendChild(node2)
|
|
|
|
# Standard dictionary approach.
|
|
else:
|
|
for key3, value3 in value2.items():
|
|
node2 = xml.createElement(key3)
|
|
txtnode = xml.createTextNode(value3)
|
|
node2.appendChild(txtnode)
|
|
node.appendChild(node2)
|
|
|
|
elem.appendChild(node)
|
|
base.appendChild(elem)
|
|
xml.appendChild(base)
|
|
|
|
fp = open(xmlfile, "w")
|
|
xml.writexml(fp, "", "", "\n", "UTF-8")
|
|
|
|
xml.unlink()
|
|
|