import xml.etree.ElementTree as ET

class Node:
    def __init__(self, node):
        self.parent = None
        self.axChildren = []
        self.axDescendantsOrSelf = []
        self.node = []
        for n in node:
            if n.tag == 'node':
                self.node.append(Node(n))
        self.begin = int(node.get("begin", "-1"))
        self.cat   = node.get("cat", "")
        self.graad = node.get("graad", "")
        self.id    = int(node.get("id", "-1"))
        self.index = int(node.get("index", "0"))
        self.lemma = node.get("lemma", "")
        self.pt    = node.get("pt", "")
        self.word  = node.get("word", "")
    def walk(self, indexed):
        # deze node
        if self.index > 0 and (self.pt != "" or self.cat != ""):
            while self.index >= len(indexed):
                indexed.append(None)
            indexed[self.index] = self
        self.axDescendantsOrSelf = [self]
        # subnodes
        for n in self.node:
            # kijk naar boven
            n.parent = self
            # descent
            n.walk(indexed)
            # kijk naar beneden
            self.axChildren.append(n)
            self.axDescendantsOrSelf.extend(n.axDescendantsOrSelf)

class DocType:
    def __init__(self, xmlfile):
        self.doc = ET.parse(xmlfile)
        self.root = self.doc.getroot()
        for e in self.root:
            if e.tag == 'node':
                self.node = Node(e)
            elif e.tag == 'sentence':
                self.sentence = e.text
                self.sentid = e.get("sentid", "")
        self.indexed = []
        self.node.walk(self.indexed)
    def run(self, expression):
        return expression.do([], self)

#doc = DocType('../data/WR-P-E-I-0000020972.p.4.s.61.xml')
#print(doc)
