XmlFilter
处理XML报文的解析和组装
插件配置
- 配置声明在commons.xml中
<filter id="fixedFilter" class="FixedFilter"/><!-- 数据处理类 -->
属性 | 说明 |
---|---|
id | 插件声明定义的id |
class | 声明的插件类名 |
属性配置
filter的属性配置
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
ref | 引用 | string | 引用已经定义好的filter对象 |
type | 数据流向 | string | in、out |
field的属性配置
属性 | 描述 | 值类型 | 示例 |
---|---|---|---|
tag | 标识 | string | filter中字段的标识,作为key存入上下文; |
etag | 特殊标志 | string | 解报时,取出文本节点的内容 |
value | 值 | string | 当前字段的值; |
type | 数据类型 | string | String 、int、Number(a,b) |
组装XML报文
XML报文组装时,每个field子节点会给XML报文添加一个结点或给已存在的节点添加一个属性;
field结点的etag属性表示XML报文的节点路径或属性路径,value代表节点值,etag的值以“@XXX”结尾时,value代表属性值;
组装XML时,field节点的tag属性可不配置。如果配置了,会保存当前field的value值到tag,后面可通过表达式进行访问。
在cfg/etc/commons.xml中完成filter配置
<filters> <filter id="xmlFilter" class="XmlFilter" /> </filters>
<!--xml报文配置效果举例--> <Root> <Head> <src>0000ICBC-440101</src> <des>000000SB-440100</des> <dataType>2001</dataType> <msgId>20012012091200000001</msgId> <msgRef>10012009080400000001</msgRef> <workDate>2009-08-04</workDate> </Head> <Body> <Object> <Record> <originDataType>1001</originDataType> <originSponsorCode>E306</originSponsorCode> <originEntrustDate >2013-10-18</originEntrustDate > <errorCode>E306</errorCode> </Record> <Record> <originDataType>1001</originDataType> <originSponsorCode>E306</originSponsorCode> <originEntrustDate >2013-10-18</originEntrustDate > <errorCode>E306</errorCode> </Record> </Object> </Body> </Root> <--对应配置举例--> <root> <interface id="testxml" basePackage="com.brilliance.eibs.core.service.instance.impl" version="1"> <transaction id="handle" > <step id="handle" > <filter ref="xmlFilter" type="out" > <field etag="Root.Head.src" value="0000ICBC-440101" description="" /> <field etag="Root.Head.des" value="000000SB-440100" description="" /> <field etag="Root.Head.dataType" value="2001" description="" /> <field etag="Root.Head.msgId" value="20012012091200000001" description="" /> <field etag="Root.Head.msgRef" value="10012009080400000001" description="" /> <field etag="Root.Head.workDate" value="2009-08-04" description="" /> <foreach tag="i" begin="0" end="2" step="1"> <field etag="Root.Body.Object.Record(${i}).originDataType" value="1001" description="" /> <field etag="Root.Body.Object.Record(${i}).errorCode" value="E306" description="" /> <field etag="Root.Body.Object.Record(${i}).originEntrustDate " value="${formatNow('yyyy-MM-dd')}" description="" /> <field etag="Root.Body.Object.Record(${i}).originSponsorCode" value="E306" description="" /> </foreach> </filter> </step> </transaction> </interface> </root>
解析XML报文
XML报文中,同一个节点下存在多个相同的节点时,可以通过提供的getChildrenCount(String)方法,传入节点路径,获得相同节点的个数。
获取多个相同节点中的某个节点,可以通过小括号指定下标进行区分。
使用etag属性指定节点路径。
tag属性用来保存从etag路径获取的值
在cfg/etc/commons.xml中完成filter配置
<filters> <filter id="xmlFilter" class="XmlFilter" /> </filters>
<root> <interface id="example" basePackage="com.brilliance.eibs.core.service.instance.impl" version="1"> <transaction id="testxml"> <step id="receive"> <filter ref="xmlFilter" type="in"> <field tag="size" value="${getChildrenCount('Root.Body.Record')}" scope="transaction" /> <!-- 定义账号String字符串 --> <foreach tag="i" begin="0" end="${size}" step="1"> <field tag="accno[${i}]" etag="Root.Body.Record(${i}).AccNo" scope="transaction" /> </foreach> </filter> </step> </transaction> </interface> </root>