1 from __future__
import print_function
19 self.
_ncDict = kwargs.get (
'nameChangeDict', {})
28 if isinstance (key, str):
29 return self._attrs.get(key,
None)
43 if name.startswith(
'__'):
45 raise AttributeError (name)
46 return self._attrs.get (name,
None)
50 change = self._ncDict.get (name)
55 children = self.
_attrs[name]
56 if not isinstance(children, list):
58 self.
_attrs[name] = children
59 children.append(value)
69 items = sorted (self._attrs.items())
71 items.append((
'data', self.
_data))
72 return u'{%s}' %
', '.
join([
u'%s:%s' % (k,repr(v))
for k,v
in items])
81 return getattr (obj,
'__iter__',
False)
88 retval +=
'%s: ' % name
89 offset += len (name) + DataNode.spaces
91 if isinstance (obj, list):
94 print(
"value", value, value.__class__.__name__)
98 retval +=
'[\n ' +
' ' * offset
100 retval +=
',\n ' +
' ' * offset
102 if isinstance (value, DataNode):
103 retval += value.stringify (offset=tempoffset)
104 print(
" calling stringify for %s" % value)
105 elif DataNode.isiterable (value):
106 retval += DataNode._outputValues (value,
'', offset)
108 retval +=
"%s" % value
109 retval +=
'\n' +
' ' * (offset - 2) +
']\n' 111 retval += pprint.pformat(obj,
120 return _outputValues (self.
_data, name, offset)
121 retval =
' ' * offset
123 retval +=
'%s : %s\n' % \
125 pprint.pformat (self.
_data,
126 indent= offset+DataNode.spaces,
129 retval += pprint.pformat (self.
_data,
130 indent=offset+DataNode.spaces,
136 retval +=
'\n' +
' ' * offset
137 retval +=
'%s: ' % name
139 for key, value
in sorted (six.iteritems(self.
_attrs)):
142 tempspace = offset + 3
146 tempspace = offset + 3
147 if isinstance (value, DataNode):
148 retval += value.stringify (key, tempspace)
150 retval += DataNode._outputValues (value, key, tempspace)
154 tempspace = offset + 3
155 retval += DataNode._ouptputValues (self.
_data, name, tempspace)
156 retval +=
'\n ' +
' ' * offset +
'}' 163 non_id_char = re.compile(
'[^_0-9a-zA-Z]')
168 self.
_ncDict = kwargs.get (
'nameChangeDict', {})
177 for k, v
in attrs.items():
178 self.current._add_xml_attr (TreeBuilder._name_mangle(k), v)
183 self.current._data = text
184 if self.current.attributes():
190 self.current._add_xml_attr (TreeBuilder._name_mangle(name), obj)
193 self._text_parts.append(content)
199 '''Returns top level object''' 200 return self._root.attributes().
values()[0]
205 return TreeBuilder.non_id_char.sub(
'_', name)
208 regexList = [ (re.compile (
r'&'),
'&' ),
209 (re.compile (
r'<'),
'<' ),
210 (re.compile (
r'>'),
'>' ),
211 (re.compile (
r'"'),
'"e;' ),
212 (re.compile (
r"'"),
''' )
215 quoteRE = re.compile (
r'(\w\s*=\s*")([^"]+)"')
218 '''Changes all characters inside of the match''' 219 quote = match.group(2)
220 for regexTup
in regexList:
221 quote = regexTup[0].sub( regexTup[1], quote )
222 return match.group(1) + quote +
'"' 226 ''' Converts XML data into native Python object. Takes either 227 file handle or string as input. Does NOT fix illegal characters. 229 input source: Exactly one of the three following is needed 230 filehandle - input from file handle 231 contents - input from string 232 filename - input from filename 235 filtering - boolean value telling code whether or not to fileter 236 input selection to remove illegal XML characters 237 nameChangeDict - dictionaries of names to change in python object''' 240 filehandle = kwargs.get (
'filehandle')
241 contents = kwargs.get (
'contents')
242 filename = kwargs.get (
'filename')
243 if not filehandle
and not contents
and not filename:
244 raise RuntimeError(
"You must provide 'filehandle', 'contents', or 'filename'")
245 if filehandle
and contents
or \
246 filehandle
and filename
or \
247 contents
and filename:
248 raise RuntimeError(
"You must provide only ONE of 'filehandle', 'contents', or 'filename'")
251 filtering = kwargs.get (
'filtering')
257 filehandle = open (filename,
'r') 259 raise RuntimeError(
"Failed to open '%s'" % filename)
261 for line
in filehandle:
264 filehandle = filename =
'' 265 contents = quoteRE.sub (fixQuoteValue, contents)
267 ncDict = kwargs.get (
'nameChangeDict', {})
268 builder = TreeBuilder (nameChangeDict = ncDict)
270 xml.sax.parseString(contents, builder)
274 filehandle = open (filename,
'r') 276 raise RuntimeError(
"Failed to open '%s'" % filename)
277 xml.sax.parse(filehandle, builder)
278 return builder.topLevel()
def __init__(self, kwargs)
def startElement(self, name, attrs)
def _add_xml_attr(self, name, value)
def _outputValues(obj, name, offset)
S & print(S &os, JobReport::InputFile const &f)
def __getattr__(self, name)
static std::string join(char **cmd)
def __init__(self, kwargs)
def characters(self, content)
def __contains__(self, name)
def stringify(self, name='', offset=0)
def __getitem__(self, key)
def endElement(self, name)