Skip to content

Instantly share code, notes, and snippets.

@Lysander
Last active December 22, 2015 02:28
Show Gist options
  • Select an option

  • Save Lysander/6403242 to your computer and use it in GitHub Desktop.

Select an option

Save Lysander/6403242 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# coding: utf-8
import xml.etree.ElementTree as etree
from pprint import pprint
data = """
<data>
<parts>
<part name="komplexes Teil">
<elem keyref="a"/>
<elem keyref="b"/>
<elem keyref="c"/>
</part>
<part name="simples Teil">
<elem keyref="b"/>
<elem keyref="c"/>
</part>
</parts>
<elements>
<elem key="a" name="abc"/>
<elem key="b" name="def"/>
<elem key="c" name="ghi"/>
</elements>
</data>
"""
class Element:
def __init__(self, key, name):
self.key = key
self.name = name
def __str__(self):
return "Element {}: {}".format(self.key, self.name)
def get_parts(root, elements):
parts = {}
for node in root.findall(".//parts/part"):
# Hier benutzen wir das Mapping key -> Element-Objekt, um die
# Teilemengen aus Element-Objekten aufzubauen
part = [elements[part_node.attrib["keyref"]] for part_node in node]
parts[node.attrib["name"]] = part
return parts
def get_elements(root):
elements = {}
for node in root.findall(".//elements/elem"):
element = Element(node.attrib["key"], node.attrib["name"])
elements[element.key] = element
return elements
def parse_from_xml(data):
root = etree.fromstring(data)
elements = get_elements(root)
return get_parts(root, elements)
def main():
parts = parse_from_xml(data)
print("Habe {} Parts gefunden".format(len(parts)))
for key, part in parts.items():
print("Part '{}':".format(key))
for element in part:
print(" - {}".format(element))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment