DMN决策模型的XML是什么样的

DMN决策模型XML是严格遵循OMG规范、可被引擎直接执行的可执行定义,根节点必须为并声明正确命名空间,含至少一个、和,FEEL表达式需语法正确且大小写敏感。

DMN 决策模型的 XML 是一个结构清晰、严格遵循 OMG 规范的 XML 文档,后缀通常为 .dmn。它不是随便写的配置文件,而是可被引擎(如 Camunda、Flowable、Drools)直接解析执行的可执行决策定义


根节点 是唯一入口

所有合法 DMN XML 必须以 为根,且必须声明正确的命名空间(不同版本略有差异):



  
    
      
        
          temperature
        
      
      
      
        <= 20
        "Soup"
      
      
        > 20
        "Salad"
      
    
  
  • xmlns 必须匹配你用的 DMN 版本(如 2015113020191111),否则引擎会拒载或报 namespace not supported
  • idname 都要设:前者是部署 key(Camunda 中用于 decisionService.evaluateDecisionByKey("dish")),后者是业务可读名
  • namespace 不是 URL,只是命名空间标识符,但必须全局唯一,避免跨项目冲突

的结构不能少三要素

一个可用的决策表必须包含:

  • 至少一个 (带
  • 至少一个
  • 至少一个 (含

常见错误:

  • 忘写 typeRef(如 typeRef="number"),导致 FEEL 表达式解析失败,报 cannot coerce string to number
  • 里写 temperature > 20 —— 错!这里只允许变量引用(如 temperature),条件逻辑写在
  • 中字符串没加双引号("Soup"),FEEL 会当成未定义变量,报 unknown variable 'Soup'

FEEL 表达式必须符合语法,且大小写敏感

DMN 默认使用 FEEL(Friendly Enough Expression Language),不是 JavaScript,也不是 SpEL:

  • ✅ 正确:"Hot"temperature > 30 and location = "Beijing"
  • ❌ 错误:temperature > 30 && location == "Beijing"(用了 JS 语法)
  • ❌ 错误:TEMPERATURE > 30(变量名大小写不匹配流程传入的 temperature

FEEL 支持:

  • 基本运算:+ - * /
  • 比较:> (注意是 =,不是 ==
  • 字符串:"abc",拼接用 +"Hello" + " " + name
  • 列表:[1,2,3],取值用方括号:list[1]

部署前务必验证 XML 是否符合 XSD

DMN 引擎加载时会校验 XML 结构。如果你手写或拼接生成 XML,最容易漏的是:

  • 忘闭合标签(如 没配
  • 属性值没加引号(typeRef=number → 必须是 typeRef="number"
  • 使用了高版本才支持的元素(如 在 DMN 1.1 不可用,只在 1.3+ 支持)

建议做法:

  • 用官方校验工具:Camunda Modeler 或 Flowable Modeler 导出时自动校验
  • 手动校验:用 IDE(如 IntelliJ)绑定 DMN XSD(如 https://www./link/7a9693015c73ae1d46ea1e8fd0c7a1fb),实时标红
  • 运行时报错典型提示:cvc-complex-type.2.4.a: Invalid content was found starting with element 'input'. One of '{input}' is expected. → 说明标签顺序错了(DMN 要求 input 必须在 output 前)

真正容易被忽略的点是:XML 命名空间和 XSD 版本必须完全一致——哪怕只差一个字符,引擎就拒绝加载,且错误信息极其模糊。