Skip to content

协议布局扩展机制之xml定义

quhongwei edited this page Apr 2, 2018 · 2 revisions

xml元素

  1. protocol标签的name属性定义了协议(格式)名字
  2. protocol标签的rowsplit属性定义了文件行数据的分割算法, 如果没有配置默认组件内置分隔符分割算法
  3. protocol的子标签head,body, tail表示文件可以分割成头尾body三部分 (具体文件是否含head,body, tail 还需结合数据定义模板是否定义了这三部分的字段)
  4. head,body,tail的子标签是row,代表了一行数据
  5. row标签定义主要有两种,
    row含有column子标签的会遍历数据定义模板的字段, column的columnLayout属性定义所有字段一行还是一个字段一行,output标签中${column.value()}的column是组件自定义的函数用来输出字段的值或者描述信息
    没有column子标签的row,它的output属性定义函数输出,bodycolumn组件自定应函数一般用来在文件头中输出文件体字段的描述信息

xml文件存放地址

  1. 协议布局模板默认存放于classpath:META-INF/rdf-file/protocol/ 目录下
  2. 文件名是:protocolName.xml
  3. 你可以通过配置将协议布局模板存放于其他外部存储,如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>
  1. De协议跟sp区别在于头
  2. ${column.desc()} 数据数据定义模板字段描述信息
  3. : 输出常量冒号
  4. 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>
  1. rowsplit="rowSplitByFixedlLength" 指定文件使用分割方式
  2. columnLayout="vertical" 代表数据定义模板每个字段一行
  3. output="${bodycolumn.count()}" 输出数据定义模板定义的字段个数
  4. output="${bodycolumn.vertical(name)}", 输出数据定义模板定义的字段,每个字段一个
  5. 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>
Clone this wiki locally