使用JRecord读取txt/cbl格式Copybook时被识别为XML,如何修正?
解决JRecord误将COBOL Copybook识别为XML的问题
问题原因
JRecord默认会根据文件扩展名、内容自动选择Copybook加载器,你的场景中它错误选用了XMLCopyBookLoader,导致COBOL格式的Copybook被当作XML解析,进而抛出SAX相关异常。
解决方案
1. 强制指定COBOL Copybook加载器
在构建ICobolIOBuilder时,显式设置加载器为CobolCopybookLoader,绕过自动检测逻辑:
import net.sf.JRecord.Cobol.CobolCopybookLoader; import net.sf.JRecord.Interface.ICobolIOBuilder; import net.sf.JRecord.JRecordInterface1; import net.sf.JRecord.Common.ICopybookDialects; // ... ICobolIOBuilder schemaBuilder = JRecordInterface1.COBOL.newIOBuilder(copyBookFilePath) .setDialect(ICopybookDialects.FMT_MAINFRAME) // 用常量替代数字1,可读性更强 .setFont("cp037") .setDropCopyBookNameFromFields(true) .setCopyBookLoader(new CobolCopybookLoader()); // 强制使用COBOL加载器 try { AbstractLineReader reader = schemaBuilder.newReader(binaryFilePath); // 执行后续文件读取逻辑 } catch(Exception e) { e.printStackTrace(); }
2. 检查Copybook文件内容
如果指定加载器后仍有问题,检查你的Copybook文件:
- 确保文件开头没有XML声明(比如
<?xml version="1.0"?>)或多余空白字符 - 确认文件是纯COBOL语法,第一行应为COBOL的记录定义(比如
01 RECORD-NAME.)
3. 验证Copybook格式正确性
用文本编辑器打开Copybook,确认符合COBOL语法规范,没有语法错误或格式混乱——这类问题也会导致加载器误判文件类型。
内容的提问来源于stack exchange,提问作者Mathamagic
相关产品推荐
相关产品推荐

