如何使用DFDL Schema解析动态字段分隔符文本并输出XML树形结构
DFDL Schema 编写方案
针对你需要解析动态可变分隔符文本、兼容未知额外元素的需求,可参考以下实现方案:
前置分隔规则说明
从你提供的消息样例可推导对应分隔规则如下:
- 不同键值对之间用
&作为分隔符 - 单个键值对内部用
=分隔键名与字段值 - 无值的字段仅保留键名,无
=及后续内容
完整示例DFDL Schema
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" targetNamespace="http://example.com/dfdl/dynamickv" xmlns:tns="http://example.com/dfdl/dynamickv" elementFormDefault="qualified"> <xs:annotation> <xs:appinfo source="http://www.ogf.org/dfdl/"> <dfdl:format ref="tns:DynamicKvFormat"/> <dfdl:defineFormat name="DynamicKvFormat"> <dfdl:format separator="&" separatorType="infix" sequenceKind="ordered" occursCountKind="implicit" extraElements="ignore" nilKind="literalValue" nilValue="" textTrimWhitespace="both" encoding="UTF-8"/> </dfdl:defineFormat> </xs:appinfo> </xs:annotation> <!-- 根节点 --> <xs:element name="root"> <xs:complexType> <xs:sequence dfdl:separator="&"> <!-- 动态键值对组,适配所有可变/未知字段 --> <xs:element name="CLIENT_ID" type="xs:string" minOccurs="0"/> <xs:element name="LOCALE" type="xs:string" minOccurs="0"/> <xs:element name="ENCODE" type="xs:string" nillable="true" minOccurs="0"/> <!-- 可在此处继续添加你已知的字段定义,未知字段会被自动忽略 --> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
关键配置说明
dfdl:separator="&":指定键值对之间的分隔符为&,XML场景下需要做转义处理extraElements="ignore":开启后解析过程会自动跳过未在Schema中定义的额外未知元素,不会抛出解析错误nilKind="literalValue"+nilValue="":匹配无值的字段,自动生成你需要的自闭合标签,例如<ENCODE/>minOccurs="0":所有字段设置为非必填,适配动态生成的消息结构
如果你的消息分隔符和上述规则不同,只需要调整dfdl:format中对应的分隔符配置即可。
内容的提问来源于stack exchange,提问作者Rohit Borse
相关产品推荐
相关产品推荐

