The main reason to have distinct types is the "natural" hierarchy of the records (it's a big tree), for example, the 'C' block is roughly as follows:
C001
- C100
- C101
- C105
- C110
- C111
- C112
- C113
- C114
- C115
- C116
- C120
- C130
- C140
- C141
- C160
- C165
- C170
- C171
- C172
- C173
- C174
- C175
- C176
- C177
- C178
- C179
- C180
- C185
- C190
- C191
- C195
- C197
- C300
- C310
- C320
- C321
- C330
- C350
- C370
- C380
- C390
- C400
- C405
- C410
- C420
- C425
- C430
- C460
- C465
- C470
- C480
- C490
- C495
- C500
- C510
- C590
- C591
- C595
- C597
- C600
- C601
- C610
- C690
- C700
- C790
- C791
- C800
- C810
- C815
- C850
- C860
- C870
- C880
- C890
C990
There is more blocks that form the whole document (or tree), Blocks: 0, B, C, D, E, G, H, K, I, 9
The idea is to parse the document and implement manipulation functions to edit the content and later export in other formats