Moron has asked for the wisdom of the Perl Monks concerning the following question:
The bit that is giving me grief is that the īDTDī below has to be used to create the rules for parsing the XMLish output but it looks horribly like itīs written the language it is actually trying to describe, i.e. what you see below strongly resembles what it is trying to define. Normally Iīd expect to have to write something this weird from scratch, but with a limit 8 hours development time available I do wonder if I can really dive into that rat-hole with a clear conscious and no-one would blame me for looking for a module even if in vain. On the other hand, the circular-describing problem tends to make it look too perverse to expect to find a module. So it seems to me I canīt avoid writing the parser (although not necessarily the lexer) from scratch. Or am I missing something? (so-called DTD of the so-called XML format follows...)
Update: I forgot to mention that irrespective of whether a module can help me, I will write this parser in Perl anyway - although the requirement is forebodingly weird, I have to ask just in case there is a module that can help.
<!ELEMENT transactions (trans*)> <!ATTLIST transactions producer CDATA # REQUIRED timestamp CDATA # REQUIRED > <!ELEMENT trans (file_trans | rdbms_trans | object_trans | proc_trans)> <!ATTLIST trans state ('committed' | 'written')# REQUIRED originator CDATA# REQUIRED number CDATA# REQUIRED uid CDATA # REQUIRED timestamp CDATA# REQUIRED > <!ELEMENT file_trans ( tree_id, symbol, trans_no, filerecord*, correctiorecord*, datarecord* )> <!ELEMENT tree_id (#PCDATA)> <!ELEMENT trans_no (#PCDATA)> <!ELEMENT filerecord (fileheader*)> <!ATTLIST filerecord type ('ADD'|'INSERT'|'UPDATE'|'DELETE')# REQUIRED > <!ELEMENT fileheader (fileattr*)> <!ATTLIST fileheader headerstate ('new'|'old')# REQUIRED> <!ELEMENT fileattr (value*)> <!ATTLIST fileattr id CDATA# REQUIRED > <!ATTLIST fileattr <!ELEMENT correctionrecord (dataitem)> <!ATTLIST correctionrecord type ('ADD'|'INSERT'|'UPDATE'|'DELETE')# REQUIRED > <!ELEMENT datarecord (dataitem)> <!ATTLIST datarecord type ('ADD'|'INSERT'|'UPDATE'|'DELETE')# REQUIRED > <!ELEMENT dataitem (attrid, value)> <!ELEMENT proc_trans (proc*)> <!ELEMENT proc (#PCDATA)> <!ATTLIST proc procname CDATA# REQUIRED > <!ELEMENT rdbms_trans (rdbms_operation)> <!ELEMENT rdbms_operation (sql, alt?, cell*)> <!ELEMENT sql (#PCDATA)> <!ELEMENT alt (#PCDATA)> <!ELEMENT cell (#PCDATA)> <!ATTLIST cell col CDATA# REQUIRED row CDATA# REQUIRED > <!ELEMENT object_trans (object_operation*)> <!ELEMENT object_operation (object_attribute*)> <!ATTLIST object_operation type ( 'ADD' | 'REBUILD' | 'CHANGEFLD' | 'DELETE' | 'EXTEND' | 'TRIGGER' | 'INSERT' | 'RENAME' | 'TRUNCATE' | 'UPDATE' | 'UNKNOWN' )# REQUIRED continue ('yes' | 'no')# REQUIRED > <!ELEMENT object_attribute ( ado | attr | ado_code | ado_attributes | ado_codes | list | list_entry | list_cont | curve | curve_entry | curve_cont | stat_attr | enum_value | stat_attr_enum | stat_attr_code | df_attr | df_attr_code | tree | calendar | holidaydef | holidays | interfacedef | parameterdef | interface_parameters | mapping | interface_mapping | formula | derived_list | derived_curve)*> <!ATTLIST object_attribute attributestate ('new'|'old') # IMPLIED > <!-- Object types --> <!ELEMENT ado (symbol, longname, owner, group, permissions, template, parent)> <!ELEMENT ado_code (source, attrnum, date, code, formulaid)> <!ELEMENT ado_attributes (symbol,attr*)> <!ELEMENT attr (attrid, date, value, status)> <!ELEMENT ado_codes (symbol,ado_code*)> <!ELEMENT list (listid, longname, owner, group, permissions, listtp)> <!ELEMENT list_cont (listid, list_entry*)> <!ELEMENT list_entry (key)> <!ELEMENT curve (listid, longname, owner, group, permissions, daycountbasis, payment_freq, interpolation_method, curvetp)> <!ELEMENT curve_cont (listid, curve_entry*)> <!ELEMENT curve_entry (key, attrnum)> <!ELEMENT stat_attr (attrid, longname, owner, group, permissions, datatype, multivalued, unique, optional, profiling, derived, formulaid)> <!ELEMENT enum_value (key, value)> <!ELEMENT stat_attr_enum (attrid, enum_value*)> <!ELEMENT stat_attr_code (attrid, ado_code*)> <!ELEMENT df_attr (attr_num, attrid, owner, group, permissions, datatype, length,width, precision, check, correct, rebase, formulaid)> <!ELEMENT df_attr_code (attrid, ado_code*)> <!ELEMENT tree (symbol, longname, owner, group, permissions, root_node, depth, replicate, formulaid)> <!ELEMENT calendar (calnum, longname, owner, group, permissions, allowsaturday, allowsunday)> <!ELEMENT holidaydef (date, holiday)> <!ELEMENT holidays (longname, holidaydef*)> <!ELEMENT interfacedef (key, interface, owner, group, permissions)> <!ELEMENT parameterdef (parameter, value)> <!ELEMENT interface_parameters (longname, parameterdef*)> <!ELEMENT mapping (code, fromvalue, tovalue)> <!ELEMENT interface_mapping (longname, mapping*)> <!ELEMENT formula (formid, longname, owner, group, permissions, viewtype, dimension, value)> <!ELEMENT derived_list (listid, longname, owner, group, permissions, listtp, formulaid)> <!ELEMENT derived_curve (listid, longname, owner, group, permissions, daycountbasis, payment_freq, interpolation_method, curvetp, formulaid, recalc_time)> <!-- Field types --> <!ELEMENT symbol (#PCDATA)> <!ATTLIST symbol fldtag CDATA> <!ELEMENT longname (#PCDATA)> <!ATTLIST longname fldtag CDATA> <!ELEMENT owner (#PCDATA)> <!ATTLIST owner fldtag CDATA> <!ELEMENT group (#PCDATA)> <!ATTLIST group fldtag CDATA> <!ELEMENT permissions (#PCDATA)> <!ATTLIST permissions fldtag CDATA> <!ELEMENT template (#PCDATA)> <!ATTLIST template fldtag CDATA> <!ELEMENT parent (#PCDATA)> <!ATTLIST parent fldtag CDATA> <!ELEMENT attrid (#PCDATA)> <!ATTLIST attrid fldtag CDATA> <!ELEMENT date (#PCDATA)> <!ATTLIST date fldtag CDATA> <!ELEMENT value (#PCDATA)> <!ATTLIST value fldtag CDATA> <!ELEMENT status (#PCDATA)> <!ATTLIST status fldtag CDATA> <!ELEMENT source (#PCDATA)> <!ATTLIST source fldtag CDATA> <!ELEMENT attrnum (#PCDATA)> <!ATTLIST attrnum fldtag CDATA> <!ELEMENT code (#PCDATA)> <!ATTLIST code fldtag CDATA> <!ELEMENT formulaid (#PCDATA)> <!ATTLIST formulaid fldtag CDATA> <!ELEMENT listid (#PCDATA)> <!ATTLIST listid fldtag CDATA> <!ELEMENT listtp (#PCDATA)> <!ATTLIST listtp fldtag CDATA> <!ELEMENT key (#PCDATA)> <!ATTLIST key fldtag CDATA> <!ELEMENT daycountbasis (#PCDATA)> <!ATTLIST daycountbasis fldtag CDATA> <!ELEMENT payment_freq (#PCDATA)> <!ATTLIST payment_freq fldtag CDATA> <!ELEMENT interpolation_method (#PCDATA)> <!ATTLIST interpolation_method fldtag CDATA> <!ELEMENT curvetp (#PCDATA)> <!ATTLIST curvetp fldtag CDATA> <!ELEMENT datatype (#PCDATA)> <!ATTLIST datatype fldtag CDATA> <!ELEMENT length (#PCDATA)> <!ATTLIST length fldtag CDATA> <!ELEMENT width (#PCDATA)> <!ATTLIST width fldtag CDATA> <!ELEMENT precision (#PCDATA)> <!ATTLIST precision fldtag CDATA> <!ELEMENT rebase (#PCDATA)> <!ATTLIST rebase fldtag CDATA> <!ELEMENT depth (#PCDATA)> <!ATTLIST depth fldtag CDATA> <!ELEMENT calnum (#PCDATA)> <!ATTLIST calnum fldtag CDATA> <!ELEMENT fromvalue (#PCDATA)> <!ATTLIST fromvalue fldtag CDATA> <!ELEMENT tovalue (#PCDATA)> <!ATTLIST tovalue fldtag CDATA> <!ELEMENT formid (#PCDATA)> <!ATTLIST formid fldtag CDATA> <!ELEMENT viewtype (#PCDATA)> <!ATTLIST viewtype fldtag CDATA> <!ELEMENT dimension (#PCDATA)> <!ATTLIST dimension fldtag CDATA> <!ELEMENT recalc_time (#PCDATA)> <!ATTLIST recalc_time fldtag CDATA> <!ELEMENT allow_saturday (true | '1')> <!ATTLIST allow_saturday fldtag CDATA> <!ELEMENT allow_sunday (true | false)> <!ATTLIST allow_sunday fldtag CDATA> <!ELEMENT multivalued (true | false)> <!ATTLIST multivalued fldtag CDATA> <!ELEMENT replicate (true | false)> <!ATTLIST replicate fldtag CDATA> <!ELEMENT check (true | false)> <!ATTLIST check fldtag CDATA> <!ELEMENT correct (true | false)> <!ATTLIST correct fldtag CDATA> <!ELEMENT unique (true | false)> <!ATTLIST unique fldtag CDATA> <!ELEMENT optional (true | false)> <!ATTLIST optional fldtag CDATA> <!ELEMENT profiling (true | false)> <!ATTLIST profiling fldtag CDATA> <!ELEMENT derived (true | false)> <!ATTLIST derived fldtag CDATA> <!ENTITY true CDATA "1"> <!ENTITY false CDATA "0">
-M
Free your mind
|
|---|