9
9
import _rapidxml
10
10
11
11
class DictNodeIterator (object ):
12
- def __init__ (self , iterable ):
12
+ def __init__ (self ,
13
+ iterable ,
14
+ attribute_prefix ,
15
+ cdata_key ,
16
+ always_aslist ):
13
17
self ._iter = iterable
18
+ self .attribute_prefix = attribute_prefix
19
+ self .cdata_key = cdata_key
20
+ self .always_aslist = always_aslist
14
21
15
22
def __next__ (self ):
16
23
return self .next ()
17
24
18
25
def next (self ):
19
- return DictNode ().copy (next (self ._iter ))
26
+ return DictNode (self .attribute_prefix ,
27
+ self .cdata_key ,
28
+ self .always_aslist ).copy (next (self ._iter ))
20
29
21
30
def __iter__ (self ):
22
31
return self
23
32
24
33
25
34
class DictNode (_rapidxml .Node ):
26
- def __init__ (self , attribute_prefix = '@' , cdata_key = '#text' ):
35
+ def __init__ (self , attribute_prefix = '@' , cdata_key = '#text' , always_aslist = False ):
27
36
_rapidxml .Node .__init__ (self )
28
37
self .attribute_prefix = attribute_prefix
29
38
self .cdata_key = cdata_key
39
+ self .always_aslist = always_aslist
30
40
31
41
def get_nodes (self , name ):
32
42
node = self .first_node (name )
33
43
if node is None :
34
44
return None
35
- res = [DictNode (self .attribute_prefix , self .cdata_key ).copy (node )]
45
+ res = [DictNode (self .attribute_prefix ,
46
+ self .cdata_key ,
47
+ self .always_aslist ).copy (node )]
36
48
node = node .next_sibling (name )
37
- if node is None :
49
+ if node is None and not self . always_aslist :
38
50
return res [0 ]
39
51
while node is not None :
40
- res .append (DictNode (self .attribute_prefix , self .cdata_key ).copy (node ))
52
+ res .append (DictNode (self .attribute_prefix ,
53
+ self .cdata_key ,
54
+ self .always_aslist ).copy (node ))
41
55
node = node .next_sibling (name )
42
56
return res
43
57
@@ -47,7 +61,7 @@ def get_attributes(self, name):
47
61
return None
48
62
res = [attribute ]
49
63
attribute = attribute .next_attribute (name )
50
- if attribute is None :
64
+ if attribute is None and not self . always_aslist :
51
65
return res [0 ]
52
66
while attribute is not None :
53
67
res .append (attribute )
@@ -74,17 +88,23 @@ def __contains__(self, name):
74
88
return True
75
89
76
90
def __iter__ (self ):
77
- return DictNodeIterator (self .children )
91
+ return DictNodeIterator (self .children ,
92
+ self .attribute_prefix ,
93
+ self .cdata_key ,
94
+ self .always_aslist )
78
95
79
96
80
97
class RapidXml (DictNode , _rapidxml .Document ):
81
98
def __init__ (self ,
82
99
text = "" ,
83
100
from_file = False ,
84
101
attribute_prefix = '@' ,
85
- cdata_key = '#text' ):
86
- DictNode .__init__ (self , attribute_prefix , cdata_key )
102
+ cdata_key = '#text' ,
103
+ always_aslist = False ):
104
+ DictNode .__init__ (self , attribute_prefix , cdata_key , always_aslist )
87
105
_rapidxml .Document .__init__ (self , text , from_file )
88
106
89
107
def allocate_node (self , * args ):
90
- return DictNode ().copy (super (RapidXml , self ).allocate_node (* args ))
108
+ return DictNode (self .attribute_prefix ,
109
+ self .cdata_key ,
110
+ self .always_aslist ).copy (super (RapidXml , self ).allocate_node (* args ))
0 commit comments