9 NetMsgs XML parser module. 63 import xml.parsers.expat
as expat
66 import NetMsgsBase
as nmBase
72 """ XML Parser Exception Class. """ 78 msg - Exception message string. 80 Exception.__init__(self, msg)
88 """ RoadNarrows Net Messages XML Parser Class. 90 The NetMsgsXmlParser class parses a RoadNarrows netmsgs XML specification. 91 The parsed information is available to the calling program. 107 def __init__(self, filename=None, debug=0, **kwargs):
108 """ Initialize NetMsgsXmlParser instance. 111 filename - XML file name. 112 debug - Set debugging level: 0 == off, 1, 2, 3. 113 kwargs - Optional XML overrides: 114 encoding - Message encoding. One of itv flat. 115 endian - Byte order. One of big little native. 116 ns - Message namespace (name prefix). 117 brief - Brief description. 127 self.
mXmlOverrides[
'encoding'] = kwargs.get(
'encoding',
None)
140 '_root': [
'netmsgs' ],
141 'netmsgs': [
'meta',
'field_types',
'msg_types' ],
142 'meta': [
'brief',
'ns',
'prologue',
'epilogue' ],
143 'field_types': [
'ftypedef' ],
144 'ftypedef': [
'fielddef' ],
145 'msg_types': [
'msgdef' ],
146 'msgdef': [
'fielddef',
'pad' ],
147 'fielddef': [
'min',
'max',
'const',
'fielddef' ]
190 'netmsgs': {
'encoding':
'itv',
'endian':
'big' },
191 'meta': {
'brief':
"Net Messages",
193 'c': {
'prologue':
"",
'epilogue':
""},
194 'h': {
'prologue':
"",
'epilogue':
""},
195 'python':{
'prologue':
"",
'epilogue':
""}},
196 'field_types': {nmBase.NMKeyOrder:[]},
197 'msg_types': {nmBase.NMKeyOrder:[]},
217 def _InitElemOList(self, elemList, olist):
218 """ Make an ordered list of XML element names. 220 Names are derieved from the XML tree. 223 elemList - List of element names 228 for elem
in elemList:
229 if elem
not in olist:
231 if self.XmlTree.has_key(elem):
242 """ x.__getitem__(dbkey) <==> x[dbkey] 246 return self.
mDB[dbkey]
251 """ x.__setitem__(dbkey, val) <==> x[dbkey]=val 253 Set new or overwrite existing database entry. 255 self.
mDB[dbkey] = val
260 """ Get database entry. 263 dbkey - Parsed data key. 268 return self.
mDB[dbkey]
273 """ Get full database dictionary. 283 """ Get the full list of database keys. 288 return self.mDB.keys()
293 """ Get the full list of XML element names. 295 The list is in preferred output order. 298 List of element names. 305 """ Get the NetMsgs XML file name. 320 """ Parse the Xml XML data specified in the given file. 323 filename - README XML file name. 327 self.
mBaseName = os.path.basename(filename)
333 """ Parse the Xml XML data listed in the current file. 336 self.
Error(
'No filename')
337 self.
Debug(1,
"Parsing RN NetMsgs XML file %s" % (self.
mFileName))
344 self._XmlParser.returns_unicode =
False 355 self._XmlParser.ParseFile(fp)
356 except expat.ExpatError
as e:
363 """ Reset the XML parser. 378 """ Post-parse configuration and validation. """ 379 for k,v
in self.mXmlOverrides.iteritems():
382 elif k ==
'encoding':
383 if v
not in nmBase.NMEncoding:
384 self.
XmlError(
"XML Override: %s='%s'" % (k, v),
385 "unknown message encoding")
387 self.
mDB[
'netmsgs'][k] = v
389 if v
not in nmBase.NMEndian:
390 self.
XmlError(
"XML Override: %s='%s'" % (k, v),
391 "unknown message field byte order")
393 self.
mDB[
'netmsgs'][k] = v
395 if not nmBase.IsIdentifier(v):
396 self.
XmlError(
"XML Override: %s='%s'" % (k, v),
397 "namespace value must be an identifier")
399 self.
mDB[
'meta'][k] = v
401 self.
mDB[
'meta'][k] = v
414 """ XML Parser handler called back at start of DTD processing. 416 self.
XmlDebug(1,
"start-of-dtd-parse",
417 "base=%s" % repr(base),
418 "systemId=%s" % repr(systemId),
419 "publicId=%s" % repr(publicId))
420 self._XmlParser.ExternalEntityParserCreate(context)
426 has_internal_subset):
427 """ XML Parser handler called back at start of DOCTYPE processing. 429 self.
XmlDebug(1,
"start-of-DOCTYPE",
430 "doctypeName=%s" % repr(doctypeName),
431 "systemId=%s" % repr(systemId),
432 "publicId=%s" % repr(publicId),
433 "has_internal=%s" % repr(has_internal_subset))
438 systemId, publicId, notationName):
439 """ XML Parser handler called back at start of DTD ENTITY processing. 442 "entityName=%s" % repr(entityName))
447 """ XML Parser handler called back at start of DTD ELEMENT processing. 450 "name=%s" % repr(name),
451 "model=%s" % repr(model))
456 """ XML Parser handler called back at start of element. 460 attrs - Dictionary of element attributes. 462 self.
XmlDebug(1,
"start-of-element",
"<%s> attrs=%s" % (elem, repr(attrs)))
465 cb = self.XmlCbStartElem.get(elem)
469 self.
XmlError(
"<%s>" % (elem),
"unrecognized element")
474 """ XML Parser handler called back at end of element. 476 The associated database element(s) are set with the converted data. 477 The data must conform to the requirements of the element. 482 self.
XmlDebug(1,
"end-of-element",
"<%s> data=" % (elem))
488 cb = self.XmlCbEndElem.get(elem)
490 cb(elem, data, **attrs)
493 self.
Error(
"Bug: Lost track of elements: Expected <%s>, got <%s>" % \
499 """ XML Parser handler called back for each line of element data. 502 data - Unstructured element data. 504 self.
XmlDebug(2,
"char data:", repr(data))
510 """ XML Parser handler called back for each end of a comment block. 513 comment - Comment text sans '<!-' and '-->'. 515 self.
XmlDebug(1,
"comment:", repr(comment))
519 """ Start-Of-Element callback for the 'netmsgs' top element. 523 attrs - Element attributes. 525 encoding = attrs.get(
'encoding',
'itv').lower()
526 endian = attrs.get(
'endian',
'big').lower()
527 if encoding
not in nmBase.NMEncoding:
528 self.
XmlError(
"<%s encoding='%s'>" % (elem, encoding),
529 "unknown message encoding")
530 if endian
not in nmBase.NMEndian:
531 self.
XmlError(
"<%s endian='%s'>" % (elem, endian),
532 "unknown message field byte order")
533 self.
mDB[elem][
'encoding'] = encoding
534 self.
mDB[elem][
'endian'] = endian
539 """ Start-Of-Element callback for a major XML section. 543 attrs - Element attributes. 549 """ End-Of-Element callback for a major XML section. 554 attrs - Element attributes. 561 """ End Callback for the 'meta' general data sub-elements. 563 The associated XML parser database entries are updated with the current 569 attrs - Element attributes. 572 if not nmBase.IsIdentifier(data):
573 self.
XmlError(
"<%s>%s</%s>" % (elem, data, elem),
574 "namespace value must be an identifier")
575 self.
mDB[
'meta'][elem] = data
580 """ End-Of-Element callback for the 'meta' language-specific data 583 The associated XML parser database entries are updated with the current 589 attrs - Element attributes. 591 lang = attrs.get(
'lang')
594 "required '%s' attribute not specified." % (attr))
595 self.
mDB[
'meta'][lang][elem] = data
600 """ Start-Of-Element callback for the 'ftypedef' element. 602 The associated XML parser database entries are updated with the current 607 attrs - Element attributes. 611 fsize = attrs.get(
'size')
612 if self.
mDB[
'field_types'].has_key(ftid):
613 self.
XmlError(
"<%s ftid='%s'>" % (elem, ftid),
614 "field type id already exists.")
615 self.
mDB[
'field_types'][nmBase.NMKeyOrder] += [ftid]
616 self.
mDB[
'field_types'][ftid] = {
'disposition':
'active',
'ftype': ftype}
618 if ftype
in [
'string',
'vector']:
619 self.
mDB[
'field_types'][ftid][
'size'] = fsize
621 self.
XmlWarning(
"<%s ftid='%s' size='%s'>" % (elem, ftid, fsize),
622 "size attribute ignored.")
623 if ftype ==
'vector':
624 self.
mDB[
'field_types'][ftid][
'vtype'] = vtype
625 elif ftype ==
'struct':
626 self.
mDB[
'field_types'][ftid][
'fields'] = {nmBase.NMKeyOrder: []}
632 """ End-Of-Element callback for the 'ftypedef' element. 634 The associated XML parser database entries are updated with the current 640 attrs - Element attributes. 647 """ Start-Of-Element callback for the 'msgdef' element. 649 The associated XML parser database entries are updated with the current 654 attrs - Element attributes. 656 msgid = self.
XmlChkTokenId(elem,
'msgid', attrs.get(
'msgid'))
657 if self.
mDB[
'msg_types'].has_key(msgid):
658 self.
XmlError(
"<%s msgid='%s'>" % (elem, msgid),
659 "messsage definition id already exists.")
661 self.
mDB[
'msg_types'][nmBase.NMKeyOrder] += [msgid]
662 self.
mDB[
'msg_types'][msgid] = {
'disposition': dispo,
664 'fields': {nmBase.NMKeyOrder:[]} }
670 """ End-Of-Element callback for the 'msgdef' element. 672 The associated XML parser database entries are updated with the current 678 attrs - Element attributes. 685 """ Start-Of-Element callback for the 'fielddef' element. 687 The associated XML parser database entries are updated with the current 692 attrs - Element attributes. 696 if pattr[
'ftype'] !=
'struct':
698 "field definition not allowed in current context.")
699 fname = self.
XmlChkTokenId(elem,
'fname', attrs.get(
'fname'))
701 fsize = attrs.get(
'size')
703 if self._DbCurFieldDict.has_key(fname):
704 self.
XmlError(
"<%s fname='%s'>" % (elem, fname),
705 "field definition name already exists in current context.")
709 if ftype
in [
'string',
'vector']:
712 self.
XmlWarning(
"<%s fname='%s' size='%s'>" % (elem, fname, fsize),
713 "size attribute ignored.")
715 if ftype ==
'vector':
717 elif ftype ==
'struct':
724 """ End-Of-Element callback for the 'fielddef' element. 726 The associated XML parser database entries are updated with the current 732 attrs - Element attributes. 735 fname = attrs.get(
'fname')
742 """ End-Of-Element callback for the 'fielddef' 'const' sub-element. 744 The associated XML parser database entries are updated with the current 749 attrs - Element attributes. 752 pftype = pattr[
'ftype']
753 if self.
IsSimple(pftype)
or pftype ==
'string':
755 elif pftype ==
'vector' and \
761 "element ignored in <fielddef fname='%s'> context." % (pfname))
766 """ End-Of-Element callback for the 'fielddef' min/max limits sub-elements. 768 The associated XML parser database entries are updated with the current 774 attrs - Element attributes. 777 pftype = pattr[
'ftype']
780 elif pftype ==
'vector' and \
785 "element ignored in <fielddef fname='%s'> context." % (pfname))
790 """ Start-Of-Element callback for the 'pad' element. 792 The associated XML parser database entries are updated with the current 797 attrs - Element attributes. 800 count = attrs.get(
'count',
'1')
801 fname =
"%s%d" % (nmBase.NMKeyPad, inst)
813 """ Create a Product XML file from the given parsed or set data. 816 filename - Product XML file name. 817 comment - Comment string. 819 fp = open(filename,
'w')
825 """ Create a Product XML file from the given parsed or set data. 828 fp - Opened for writing file pointer. 829 comment - Comment string. 834 fp.write(
"%s\n" % (comment))
836 now = time.localtime()
837 fp.write(
"%d.%02d.%02d %02d:%02d:%02d\n" % \
838 ( now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min,
848 """ Write out XML tree. 851 fp - Opened for writing file pointer. 852 level - element level (depth) 853 elemList - element level (depth) 865 """ Pretty print database dictionary of parsed XML values. """ 866 now = time.localtime()
870 print "# %s" % (comment)
871 print "# %s database dump." % (self.__class__)
872 print "# Input XML file: %s" % (self.
mFileName)
873 print "# Date: %d.%02d.%02d %02d:%02d:%02d" % \
874 (now.tm_year, now.tm_mon, now.tm_mday,
875 now.tm_hour, now.tm_min, now.tm_sec)
878 sections = self.mDB.keys()
881 print "%s:\n{" % (dbkey)
882 print " encoding: %s" % (self.
mDB[dbkey][
'encoding'])
883 print " endian: %s" % (self.
mDB[dbkey][
'endian'])
885 sections.remove(dbkey)
888 print "%s:\n{" % (dbkey)
889 print " brief: %s" % (repr(self.
mDB[dbkey][
'brief']))
890 print " ns: %s" % (repr(self.
mDB[dbkey][
'ns']))
891 for lang
in [
'h',
'c',
'python']:
892 print " %s:prologue: %s" % (lang, self.
mDB[dbkey][lang][
'prologue'])
893 print " %s:epilogue: %s" % (lang, self.
mDB[dbkey][lang][
'epilogue'])
895 sections.remove(dbkey)
897 dbkey =
'field_types' 898 print "%s:\n{" % (dbkey)
900 (nmBase.NMKeyOrder, repr(self.
mDB[dbkey][nmBase.NMKeyOrder]))
901 for ftid
in self.
mDB[dbkey][nmBase.NMKeyOrder]:
904 sections.remove(dbkey)
907 print "%s:\n{" % (dbkey)
909 (nmBase.NMKeyOrder, repr(self.
mDB[dbkey][nmBase.NMKeyOrder]))
910 for msgid
in self.
mDB[dbkey][nmBase.NMKeyOrder]:
913 sections.remove(dbkey)
916 for dbkey
in sections:
917 print "%s:" % (dbkey)
918 print " %s" % (repr(self.
mDB[dbkey]))
923 """ Pretty print database fields sub-dictionary of parsed XML values. 926 indent - Indentation. 927 fields - mDB[...]['fields'] sub-dictionary. 930 print "%*s%s:" % (indent,
'', dbkey)
931 print "%*s{" % (indent,
'')
933 print "%*s%s: %s" % (indent,
'', \
934 nmBase.NMKeyOrder, repr(fields[nmBase.NMKeyOrder]))
935 for fname
in fields[nmBase.NMKeyOrder]:
938 print "%*s}" % (indent,
'')
943 """ Pretty print database fielddef sub-dictionary of parsed XML values. 946 indent - Indentation. 947 fields - mDB[...]['fields'] sub-dictionary. 949 sections = fielddef.keys()
950 if 'fields' in sections:
951 sections.remove(
'fields')
952 print "%*s%s:" % (indent,
'', fname)
953 print "%*s{" % (indent,
'')
955 for k
in [
'ftype',
'vtype',
'size',
'const',
'min',
'max',
'count']:
956 if fielddef.has_key(k):
961 if fielddef.has_key(
'fields'):
964 print "%*s}" % (indent,
'')
969 """ Pretty print value. 974 value - dictionary or other value type. 976 print "%*s%s: " % (indent,
'', name),
977 if type(val) == dict:
978 print "\n%*s{" % (indent,
'')
979 for k,v
in val.iteritems():
981 print "%*s}" % (indent,
'')
993 """ Parse and validate XML element id attribute. 996 elem - Element name value. 997 attr - Element attribute name. 998 id - Element attribute value. 1005 "required '%s' attribute not specified." % (attr))
1006 elif not nmBase.IsIdentifier(id):
1007 self.
XmlError(
"<%s %s='%s'>" % (elem, attr, id),
1008 "'%s' not an identifier." % (attr))
1014 """ Parse and validate XML element ftype attribute. 1017 elem - Element name value. 1018 ftype - Element ftype raw attribute value. 1021 Returns ('vector', vtype) if vector. 1022 Returns (ftype, None) otherwise. 1026 "required 'ftype' attribute not specified.")
1029 if not nmBase.NMBuiltInFieldTypes.has_key(vtype)
and \
1030 not self.
mDB[
'field_types'].has_key(vtype):
1031 self.
XmlError(
"<%s ftype='%s%s'>" % \
1032 (elem, vtype, nmBase.NMVectorSuffix),
1033 "vector field type is unknown.")
1035 if not nmBase.NMBuiltInFieldTypes.has_key(ftype)
and \
1036 not self.
mDB[
'field_types'].has_key(ftype):
1037 self.
XmlError(
"<%s ftype='%s'>" % (elem, ftype),
1038 "field type is unknown.")
1044 """ Parse XML element ftype token. 1047 token - Element ftype token raw value. 1050 Returns ('vector', vtype) if vector. 1051 Returns (ftype, None) otherwise. 1056 elif token[-2:] == nmBase.NMVectorSuffix:
1062 ftype = nmBase.NMAliasMap.get(ftype, ftype)
1063 vtype = nmBase.NMAliasMap.get(vtype, vtype)
1064 return (ftype, vtype)
1069 """ Parse and validate XML element 'disposition' attribute. 1072 elem - Element name value. 1073 dispo - Element attribute value. 1078 enity = [
'active',
'deprecated']
1081 elif dispo
not in enity:
1082 self.
XmlError(
"<%s %s='%s'>" % (elem,
'disposition', dispo),
1083 "attribute value not one of: %s" % repr(enity))
1089 """ Get current field definition context. 1092 Returns (pid, pinfo) - the parent element id/name and parent 1093 (implicit) field attributes. 1096 if elemParen[
'elem'] ==
'ftypedef':
1097 pid = elemParen[
'attrs'][
'ftid']
1098 pftype = elemParen[
'attrs'][
'ftype']
1099 elif elemParen[
'elem'] ==
'msgdef':
1100 pid = elemParen[
'attrs'][
'msgid']
1102 elif elemParen[
'elem'] ==
'fielddef':
1103 pid = elemParen[
'attrs'][
'fname']
1104 pftype = elemParen[
'attrs'][
'ftype']
1109 return pid, {
'ftype': pftype,
'vtype': pvtype}
1114 """ Returns True (False) is field type is (not) simple. 1117 ftype - (Derived) field type. 1119 if nmBase.NMBuiltInFieldTypes.has_key(ftype):
1120 if nmBase.NMBuiltInFieldTypes[ftype][
'comp'] ==
'simple':
1124 while self.
mDB[
'field_types'].has_key(ftype):
1125 ftype = self.
mDB[
'field_types'][ftype][
'ftype']
1126 if nmBase.NMBuiltInFieldTypes.has_key(ftype):
1127 if nmBase.NMBuiltInFieldTypes[ftype][
'comp'] ==
'simple':
1136 """ Push element name on stack of elements. 1139 elem - Element name. 1140 attrs - Element attributes. 1145 elemParent =
'_root' 1146 if elem
not in self.
XmlTree[elemParent]:
1148 "element not a valid child element of <%s>." % (elemParent))
1149 self.
_XmlElemStack += [{
'elem':elem,
'attrs':attrs,
'data':
''}]
1156 """ Pop element from stack of elements. 1169 """ Push field definitions dictionary on top of stack." 1172 fielddict - Field definitions dictionary. 1181 """ Pop field definitions dictionary from top of stack. 1194 """ Get the parent element of current top element. 1204 """ Get the parent element's name of current top element. 1214 """ Print XML syntax warning. 1217 *args - List of warning message arguments. 1219 wmsg =
"Warning: %s[L%d,C%d]" % \
1221 self._XmlParser.CurrentLineNumber,
1222 self._XmlParser.CurrentColumnNumber)
1230 """ Raise XML parser error on expat parser error. 1233 *args - List of error message arguments. 1235 emsg =
"%s[L%d,C%d]" % \
1237 self._XmlParser.ErrorLineNumber,
1238 self._XmlParser.ErrorColumnNumber)
1246 """ Raise XML parser error on XML syntax or semanitc error. 1249 *args - List of warning message arguments. 1251 emsg =
"%s[L%d,C%d]" % \
1253 self._XmlParser.CurrentLineNumber,
1254 self._XmlParser.CurrentColumnNumber)
1262 """ Raise XML parser error on general error. 1265 *args - List of error message arguments. 1278 """ Print XML debugging info. 1281 level - Debugging level. 1282 *args - List of debug message arguments. 1286 dmsg =
"DBG: %s[L%d,C%d]" % \
1288 self._XmlParser.CurrentLineNumber,
1289 self._XmlParser.CurrentColumnNumber)
1297 """ Print debugging info. 1300 level - Debugging level. 1301 *args - List of debug message arguments. 1316 if __name__ ==
'__main__':
1327 """ Command-Line Options Usage Exception Class. """ 1329 """ Raise usage excpetion 1332 msg - Error message string. 1340 """ Print Error Usage Message. 1343 msg - Error message string. 1346 print "%s: %s" % (_Argv0, emsg)
1348 print "%s: error" % (_Argv0)
1349 print "Try '%s --help' for more information." % (_Argv0)
1354 """ Print Command-Line Usage Message. """ 1356 usage: %s [OPTIONS] <xmlfile> 1359 """ % (_Argv0, _Argv0)
1360 print """Options and arguments: 1361 -d, --debug=<level> : Debug level. One of: 0 1 2 3 1363 -o, --overrides=<list> : XML overrides. List of form name=value,... 1364 Supported overrides: 1365 encoding, endian, ns, brief 1367 -h, --help : Display this help and exit. 1373 """ Get Main Options 1376 argv - Argument list. If not None, the overrides command-line 1378 kwargs - Keyword argument list. 1385 _Argv0 = kwargs.get(
'argv0', __file__)
1393 opts, args = getopt.getopt(argv[1:],
"?hd:o:",
1394 [
'help',
'debug=',
"overrides=",
''])
1395 except getopt.error, msg:
1397 for opt, optarg
in opts:
1398 if opt
in (
'-h',
'--help',
'-?'):
1401 elif opt
in (
'-d',
'--debug'):
1403 kwargs[
'debug'] = int(optarg)
1405 raise UTUsage(
"%s %s: not an integer value" % (opt, optarg))
1406 elif opt
in (
'-o',
'--overrides'):
1407 overrides = optarg.split(
',')
1408 for entry
in overrides:
1410 name,value = entry.split(
'=')
1412 value = value.strip()
1413 kwargs[name] = value
1415 raise UTUsage(
"%s %s: bad syntax" % (opt, repr(optarg)))
1416 except UTUsage, err:
1424 kwargs[
'filename'] = args[0]
1434 argv - Optional argument list to override command-line arguments. 1435 kwargs - Optional keyword argument list. 1445 except NetMsgsXmlParserError
as inst:
1446 print "Error: %s" % (inst)
1449 xmlNetMsgs.PrettyPrintDB()
def __setitem__(self, dbkey, val)
def PrettyPrintDBFieldDef(self, indent, fname, fielddef)
def UTMain(argv=None, kwargs)
def XmlCbEndMsgDef(self, elem, data, attrs)
def WriteXml(self, fp, comment=None)
def XmlCbEndFieldDef(self, elem, data, attrs)
mFileName
associated xml file name
def IsSimple(self, ftype)
XmlCbStartElem
XML element start callbacks.
def XmlCbStartFTypeDef(self, elem, attrs)
def XmlCbEndFieldDefMinMax(self, elem, data, attrs)
def XmlDebug(self, level, args)
def PushFieldDict(self, fielddict)
XmlCbEndElem
XML element start callbacks.
def XmlHandlerDTD(self, context, base, systemId, publicId)
def XmlCbStartFieldDef(self, elem, attrs)
def ExpatError(self, args)
def Debug(self, level, args)
def XmlTokenFType(self, token)
def XmlCbStartNetMsgs(self, elem, attrs)
def XmlCbEndFieldDefConst(self, elem, data, attrs)
def XmlFieldDefContext(self)
def XmlCbStartPad(self, elem, attrs)
def WriteXmlTree(self, fp, level, elemParent, elemList)
def GetDBData(self, dbkey)
mDB
parsed and augmented database
def XmlHandlerStartElem(self, elem, attrs)
def XmlCbStartMsgDef(self, elem, attrs)
def UTPrintUsageErr(emsg)
def ParseFile(self, filename)
def XmlHandlerElementDecl(self, name, model)
def XmlChkTokenId(self, elem, attr, id)
def UTGetOptions(argv=None, kwargs)
mDebug
debug print at given <= level
def XmlHandlerEndElem(self, elem)
def _InitElemOList(self, elemList, olist)
msg
error message attribute
def XmlCbEndFTypeDef(self, elem, data, attrs)
def PrettyPrintDB(self, comment=None)
def WriteXmlFile(self, filename, comment=None)
mBaseName
xml file base name
def XmlHandlerComment(self, comment)
def __getitem__(self, dbkey)
XmlTree
xml tree starting at '_root'
def XmlHandlerCharData(self, data)
def XmlHandlerEntityDecl(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)
def __init__(self, filename=None, debug=0, kwargs)
mXmlOverrides
XML overrides.
def XmlChkTokenDispo(self, elem, dispo)
def GetParentElemName(self)
def XmlChkTokenFType(self, elem, ftype)
def PrettyPrintDBFields(self, indent, fields)
def __init__(self, msg='XML Parser Error')
def XmlCbEndMetaLang(self, elem, data, attrs)
def XmlHandlerStartDoctype(self, doctypeName, systemId, publicId, has_internal_subset)
def XmlCbEndSection(self, elem, data, attrs)
def XmlCbStartSection(self, elem, attrs)
def PrettyPrintVal(self, indent, name, val)
def PushElem(self, elem, attrs)
def XmlCbEndMetaData(self, elem, data, attrs)
def XmlWarning(self, args)