You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IBM DOORS DXL脚本报错求助:基于ONESYS ID实现模块间自动链接

IBM DOORS DXL脚本错误修正与排查指导

核心问题分析

原脚本报错集中在链接操作语法不符合DXL规范,同时存在正则表达式与需求不匹配、正则匹配结果获取方式错误等问题,具体如下:

  • 链接存在性检查与创建的语法错误
  • 正则表达式未匹配需求中的ONESYS开头规则
  • 正则匹配结果、结束位置的获取方式不符合DXL语法

修改后的完整脚本

Module sourceModule = current
// 以只读模式打开目标模块,避免锁定影响协同,适配大型模块
Module targetModule = read("Target Module Name", false) 
Module linkModule = module("Link Module Name") 

// 修正正则:匹配以ONESYS开头,后跟两位及以上数字的字符串
Regexp reOneSys = regexp "^ONESYS[0-9]{2,}"
// 创建Skip列表存储目标模块Original ID与对象映射,提升查找效率
Skip targetIDs = create()

// 提前检查模块有效性,避免空指针错误
if (null targetModule) {
    print "Error: Target module not found!\n"
    exit
}
if (null linkModule) {
    print "Error: Link module not found!\n"
    exit
}

// 预加载目标模块的ID映射
for Object trgObj in targetModule do {
    string originalID = trgObj."Original ID"
    if (!null originalID && !empty originalID) {
        put(targetIDs, originalID, trgObj)
    }
}

int createdLinks = 0
// 遍历源模块对象
for Object srcObj in sourceModule do {
    string sysReq = srcObj."System Req"
    if (!null sysReq && !empty sysReq) {
        int startPos = 0
        int strLen = length(sysReq)
        // 循环匹配所有符合规则的ID
        while (startPos < strLen && reOneSys(sysReq[startPos:])) {
            // 正确获取匹配的字符串
            string matchedID = matchText(reOneSys, 0)
            // 获取当前匹配的结束位置,更新起始点
            int matchEnd = end(reOneSys, 0)
            startPos += matchEnd

            // 在Skip列表中查找匹配的目标对象
            Object trgObj
            if (find(targetIDs, matchedID, trgObj)) {
                // 正确检查链接是否已存在
                if (!exists(link(srcObj, trgObj, linkModule))) {
                    // 正确创建链接
                    create(srcObj, trgObj, linkModule)
                    createdLinks++
                }
            }
        }
    }
}

// 清理资源
delete targetIDs
close(targetModule)

// 输出结果
print "Process completed. " createdLinks " links created.\n"

关键修改点说明

  1. 正则表达式修正
    将原ONE_SYS_[0-9]{2,}改为^ONESYS[0-9]{2,},严格匹配以ONESYS开头、后跟两位及以上数字的字符串。

  2. 链接操作语法修正

    • 链接存在性检查:用exists(link(srcObj, trgObj, linkModule))替代错误的exists(srcObj->linkModule->trgObj)
    • 创建链接:用create(srcObj, trgObj, linkModule)替代错误的srcObj->linkModule->trgObj
  3. 正则匹配结果获取
    用matchText(reOneSys, 0)获取匹配的字符串,用end(reOneSys, 0)获取匹配的结束位置,替代原脚本的错误写法。

  4. 大型模块性能优化

    • 以只读模式打开目标模块(read函数),避免锁定模块影响其他用户
    • 增加模块有效性检查,提前拦截错误
    • 用!empty判断属性内容非空,避免空字符串干扰
    • 遍历结束后清理Skip列表并关闭目标模块,释放资源
  5. 循环边界处理
    增加startPos < strLen的判断,避免循环越界。

问题排查步骤

  1. 语法错误排查

    • DOORS DXL中链接操作必须使用link()和create()函数,不能用->直接链式调用
    • 正则相关函数(matchText、end)必须传入正则对象作为第一个参数
  2. 逻辑错误排查

    • 检查正则表达式是否与需求匹配,可通过print matchedID输出匹配结果验证
    • 验证Skip列表是否正确加载目标模块的ID:遍历Skip列表输出键值对
    • 检查模块名称是否正确,避免因拼写错误导致null模块
  3. 性能排查

    • 大型模块下,避免在循环内重复打开/关闭模块,预加载Skip列表是最优方案
    • 减少不必要的属性读取,仅在属性非空时执行匹配逻辑

内容的提问来源于stack exchange,提问作者Navid Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:50:11