Lephisto/utils/resedit/data.py

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()