在配置驱动场景中选用XML而非JSON,主要基于以下技术考量:
- 结构化约束能力
XML Schema (XSD) 提供强校验机制,这对工单流程的完整性校验至关重要:
<!-- 定义状态机XSD -->
<xs:element name="State">
<xs:complexType>
<xs:sequence>
<xs:element name="Action" maxOccurs="unbounded">
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="ASSIGN"/>
<xs:enumeration value="UPLOAD"/>
<!-- 约束Action类型 -->
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:element>
(XSD可确保每个State节点必须包含合法的Action类型)
2. 混合内容支持
工单规则常需要混合结构化数据与非结构化描述:
<Notification template="alert.html">
紧急工单!请于<TimeLimit>2小时内</TimeLimit>到达
<Condition>故障等级 ≥ 3</Condition>
<!-- 文本与标签混合编排 -->
</Notification>
(XML天然支持文本与标签的混合编排,JSON需特殊结构处理)
3. 版本化演进能力
XML Namespace支持多版本配置共存:
<Workflow xmlns:v2="http://schema.company.com/workflow/v2">
<v2:State id="QA_CHECK" version="2.1">
<!-- 新版本元素与旧版本共存 -->
</v2:State>
</Workflow>
(支持新旧配置在同一个文件中的渐进式升级)
4. 工具链成熟度
- 可视化编辑器生成XML(如BPMS Designer导出BPMN XML)
- 差异对比:XML的树形结构更利于Git diff审查
<Approval strategy="any_pass">
+ <Reviewer role="safety_supervisor"/>
<Reviewer role="property_manager"/>
<Reviewer role="owner_representative"/>
</Approval>
(结构化的变更对比比JSON的逗号增减更清晰)
5. 企业级集成能力
- 与SOAP/WSDL等传统企业服务总线(ESB)无缝对接
- 可直接使用XSLT转换生成工单PDF:
<xsl:template match="State">
<fo:block font-size="14pt">
状态:<xsl:value-of select="@id"/> -
<xsl:value-of select="@desc"/>
</fo:block>
</xsl:template>
(成熟的XML生态提供完整解决方案链)
6. 语义化表达优势
通过XML Processing Instructions嵌入逻辑:
<?if ${env} == 'prod' ?>
<DatabaseConfig>prod-db.company.com</DatabaseConfig>
<?else?>
<DatabaseConfig>test-db.company.com</DatabaseConfig>
<?endif?>
(在配置中实现环境差异化管理)
JSON方案的补偿措施:
- 当需要简化前端处理时,可通过后端转换层将XML转为JSON:
@GetMapping("/workflow/{type}")
public WorkflowConfig getConfig(@PathVariable String type) {
return xmlConverter.toJson(loadXmlConfig(type));
}