-
Notifications
You must be signed in to change notification settings - Fork 74
协议布局扩展机制之xml定义
quhongwei edited this page Apr 2, 2018
·
2 revisions
- protocol标签的name属性定义了协议(格式)名字
- protocol标签的rowsplit属性定义了文件行数据的分割算法, 如果没有配置默认组件内置分隔符分割算法
- protocol的子标签head,body, tail表示文件可以分割成头尾body三部分 (具体文件是否含head,body, tail 还需结合数据定义模板是否定义了这三部分的字段)
- head,body,tail的子标签是row,代表了一行数据
- row标签定义主要有两种,
row含有column子标签的会遍历数据定义模板的字段, column的columnLayout属性定义所有字段一行还是一个字段一行,output标签中${column.value()}的column是组件自定义的函数用来输出字段的值或者描述信息
没有column子标签的row,它的output属性定义函数输出,bodycolumn组件自定应函数一般用来在文件头中输出文件体字段的描述信息
- 协议布局模板默认存放于classpath:META-INF/rdf-file/protocol/ 目录下
- 文件名是:protocolName.xml
- 你可以通过配置将协议布局模板存放于其他外部存储,如OSS:
FileDefaultConfig defaultConfig = new FileDefaultConfig();
// 默认配置设置协议布局模板加载地址,代表在oss的rdf/rdf-file/META-INF/protocol/路径下
defaultConfig.setRdfProtocolPath("oss:rdf/rdf-file/META-INF/protocol/");
一: sp 简单协议布局模板
默认字段使用分隔符分割
<protocol name="sp">
<head>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</head>
<body>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</body>
<tail>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</tail>
</protocol>
文件示例如下
100|300.03
seq_0|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|12345|true|备注1
seq_1|ins
二:DE 跟天弘交互协议模板
<protocol name="de">
<head>
<row>
<column>
<output>${column.desc()}</output>
<output>:</output>
<output>${column.value()}</output>
</column>
</row>
<row output="${bodycolumn.horizontal(desc)}" />
</head>
<body>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</body>
<tail>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</tail>
</protocol>
- De协议跟sp区别在于头
- ${column.desc()} 数据数据定义模板字段描述信息
- : 输出常量冒号
- output="${bodycolumn.horizontal(desc)} 将数据定义模板body字段描述横向输出
总笔数:2|总金额:300.03
流水号|基金公司订单号|订单申请时间|普通日期|普通日期时间|普通数字|金额|年龄|长整型|布尔值|备注
seq_0|inst_seq_0|2013-11-09 12:34:56|20131109|20131112 12:23:34|23.33|10.22|22|123|true|备注1
seq_1|inst_seq_1|2013-11-10 15:56:12|20131110|20131113 12:33:34|23.34|11.88|33|56789|false|
三:国标基金数据协议
<protocol name="fund" rowsplit="rowSplitByFixedlLength">
<head>
<row columnLayout="vertical">
<column>
<output>${column.value()}</output>
</column>
</row>
<row output="${bodycolumn.count()}" type="Integer|[3,0]" />
<row output="${bodycolumn.vertical(name)}" />
<row output="${totalCount}" type="Integer|[8,0]" />
</head>
<body>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</body>
<tail>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</tail>
</protocol>
- rowsplit="rowSplitByFixedlLength" 指定文件使用分割方式
- columnLayout="vertical" 代表数据定义模板每个字段一行
- output="${bodycolumn.count()}" 输出数据定义模板定义的字段个数
- output="${bodycolumn.vertical(name)}", 输出数据定义模板定义的字段,每个字段一个
- output="${totalCount}" 输出数据笔数
四:国标基金索引文件
<protocol name="fund_index" rowsplit="rowSplitByFixedlLength">
<head>
<row columnLayout="vertical">
<column>
<output>${column.value()}</output>
</column>
</row>
<row output="${totalCount}" type="Integer|[3,0]" />
</head>
<body>
<!-- 只有一个字段,定义成vertical 是为了避免调用行分割器, 因为fund_index body数据不是定长数据 -->
<row columnLayout="vertical">
<column>
<output>${column.value()}</output>
</column>
</row>
</body>
<tail>
<row>
<column>
<output>${column.value()}</output>
</column>
</row>
</tail>
</protocol>