Project

General

Profile

1
# XML DOM tree manipulation
2

    
3
from xml.dom import Node
4

    
5
def name_of(node): return node.tagName.lower()
6

    
7
def get_id(node): return node.getAttribute('id')
8

    
9
def set_id(node, id_): node.setAttribute('id', id_)
10

    
11
class NodeElemIter:
12
    def __init__(self, node): self.child = node.firstChild
13
    
14
    def __iter__(self): return self
15
    
16
    def curr(self):
17
        while self.child != None:
18
            if self.child.nodeType == Node.ELEMENT_NODE: return self.child
19
            self.child = self.child.nextSibling
20
        raise StopIteration
21
    
22
    def next(self):
23
        child = self.curr()
24
        self.child = self.child.nextSibling
25
        return child
26

    
27
def first_elem(node): return NodeElemIter(node).next()
28

    
29
class NodeElemReverseIter:
30
    def __init__(self, node): self.child = node.lastChild
31
    
32
    def __iter__(self): return self
33
    
34
    def curr(self):
35
        while self.child != None:
36
            if self.child.nodeType == Node.ELEMENT_NODE: return self.child
37
            self.child = self.child.previousSibling
38
        raise StopIteration
39
    
40
    def next(self):
41
        child = self.curr()
42
        self.child = self.child.previousSibling
43
        return child
44

    
45
def last_elem(node): return NodeElemReverseIter(node).next()
46

    
47
class NodeParentIter:
48
    def __init__(self, node): self.node = node
49
    
50
    def __iter__(self): return self
51
    
52
    def curr(self):
53
        if self.node != None and self.node.nodeType == Node.ELEMENT_NODE:
54
            return self.node
55
        raise StopIteration
56
    
57
    def next(self):
58
        node = self.curr()
59
        self.node = self.node.parentNode
60
        return node
61

    
62
def is_text(node):
63
    for child in NodeElemIter(node): return False # has an element node
64
    return True
65

    
66
def value(node):
67
    if node.firstChild != None: return node.firstChild.nodeValue.strip()
68
    else: return node.nodeValue
69

    
70
def set_value(doc, node, value):
71
    if node.nodeType == Node.ELEMENT_NODE:
72
        node.appendChild(doc.createTextNode(value))
73
    else: node.nodeValue = value
74

    
75
def by_tag_name(node, name, last_only=False):
76
    # last_only optimization returns last (most recently inserted) matching node
77
    children = []
78
    for child in NodeElemReverseIter(node):
79
        if child.tagName == name:
80
            children.append(child)
81
            if last_only: break
82
    return children
(8-8/9)