17 self.
_ncDict = kwargs.get (
'nameChangeDict', {})
26 if isinstance (key, basestring):
27 return self._attrs.get(key,
None)
33 return self._attrs.has_key(name)
41 if name.startswith(
'__'):
43 raise AttributeError (name)
44 return self._attrs.get (name,
None)
48 change = self._ncDict.get (name)
53 children = self.
_attrs[name]
54 if not isinstance(children, list):
56 self.
_attrs[name] = children
57 children.append(value)
67 items = sorted (self._attrs.items())
69 items.append((
'data', self.
_data))
70 return u'{%s}' %
', '.
join([
u'%s:%s' % (k,repr(v))
for k,v
in items])
79 return getattr (obj,
'__iter__',
False)
86 retval +=
'%s: ' % name
87 offset += len (name) + DataNode.spaces
89 if isinstance (obj, list):
92 print "value", value, value.__class__.__name__
96 retval +=
'[\n ' +
' ' * offset
98 retval +=
',\n ' +
' ' * offset
100 if isinstance (value, DataNode):
101 retval += value.stringify (offset=tempoffset)
102 print " calling stringify for %s" % value
103 elif DataNode.isiterable (value):
104 retval += DataNode._outputValues (value,
'', offset)
106 retval +=
"%s" % value
107 retval +=
'\n' +
' ' * (offset - 2) +
']\n'
109 retval += pprint.pformat(obj,
118 return _outputValues (self.
_data, name, offset)
119 retval =
' ' * offset
121 retval +=
'%s : %s\n' % \
123 pprint.pformat (self.
_data,
124 indent= offset+DataNode.spaces,
127 retval += pprint.pformat (self.
_data,
128 indent=offset+DataNode.spaces,
134 retval +=
'\n' +
' ' * offset
135 retval +=
'%s: ' % name
137 for key, value
in sorted (self._attrs.iteritems()):
140 tempspace = offset + 3
144 tempspace = offset + 3
145 if isinstance (value, DataNode):
146 retval += value.stringify (key, tempspace)
148 retval += DataNode._outputValues (value, key, tempspace)
152 tempspace = offset + 3
153 retval += DataNode._ouptputValues (self.
_data, name, tempspace)
154 retval +=
'\n ' +
' ' * offset +
'}'
161 non_id_char = re.compile(
'[^_0-9a-zA-Z]')
166 self.
_ncDict = kwargs.get (
'nameChangeDict', {})
175 for k, v
in attrs.items():
176 self.current._add_xml_attr (TreeBuilder._name_mangle(k), v)
181 self.current._data = text
182 if self.current.attributes():
188 self.current._add_xml_attr (TreeBuilder._name_mangle(name), obj)
191 self._text_parts.append(content)
197 '''Returns top level object'''
198 return self._root.attributes().
values()[0]
203 return TreeBuilder.non_id_char.sub(
'_', name)
206 regexList = [ (re.compile (
r'&'),
'&' ),
207 (re.compile (
r'<'),
'<' ),
208 (re.compile (
r'>'),
'>' ),
209 (re.compile (
r'"'),
'"e;' ),
210 (re.compile (
r"'"),
''' )
213 quoteRE = re.compile (
r'(\w\s*=\s*")([^"]+)"')
215 def fixQuoteValue (match):
216 '''Changes all characters inside of the match'''
217 quote = match.group(2)
218 for regexTup
in regexList:
219 quote = regexTup[0].sub( regexTup[1], quote )
220 return match.group(1) + quote +
'"'
223 def xml2obj (**kwargs):
224 ''' Converts XML data into native Python object. Takes either
225 file handle or string as input. Does NOT fix illegal characters.
227 input source: Exactly one of the three following is needed
228 filehandle - input from file handle
229 contents - input from string
230 filename - input from filename
233 filtering - boolean value telling code whether or not to fileter
234 input selection to remove illegal XML characters
235 nameChangeDict - dictionaries of names to change in python object'''
238 filehandle = kwargs.get (
'filehandle')
239 contents = kwargs.get (
'contents')
240 filename = kwargs.get (
'filename')
241 if not filehandle
and not contents
and not filename:
242 raise RuntimeError,
"You must provide 'filehandle', 'contents', or 'filename'"
243 if filehandle
and contents
or \
244 filehandle
and filename
or \
245 contents
and filename:
246 raise RuntimeError,
"You must provide only ONE of 'filehandle', 'contents', or 'filename'"
249 filtering = kwargs.get (
'filtering')
255 filehandle = open (filename,
'r')
257 raise RuntimeError,
"Failed to open '%s'" % filename
259 for line
in filehandle:
262 filehandle = filename =
''
263 contents = quoteRE.sub (fixQuoteValue, contents)
265 ncDict = kwargs.get (
'nameChangeDict', {})
266 builder = TreeBuilder (nameChangeDict = ncDict)
268 xml.sax.parseString(contents, builder)
272 filehandle = open (filename,
'r')
274 raise RuntimeError,
"Failed to open '%s'" % filename
275 xml.sax.parse(filehandle, builder)
276 return builder.topLevel()
static std::string join(char **cmd)