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"
关键修改点说明
正则表达式修正
将原ONE_SYS_[0-9]{2,}改为^ONESYS[0-9]{2,},严格匹配以ONESYS开头、后跟两位及以上数字的字符串。链接操作语法修正
- 链接存在性检查:用
exists(link(srcObj, trgObj, linkModule))替代错误的exists(srcObj->linkModule->trgObj) - 创建链接:用
create(srcObj, trgObj, linkModule)替代错误的srcObj->linkModule->trgObj
- 链接存在性检查:用
正则匹配结果获取
用matchText(reOneSys, 0)获取匹配的字符串,用end(reOneSys, 0)获取匹配的结束位置,替代原脚本的错误写法。大型模块性能优化
- 以只读模式打开目标模块(
read函数),避免锁定模块影响其他用户 - 增加模块有效性检查,提前拦截错误
- 用
!empty判断属性内容非空,避免空字符串干扰 - 遍历结束后清理Skip列表并关闭目标模块,释放资源
- 以只读模式打开目标模块(
循环边界处理
增加startPos < strLen的判断,避免循环越界。
问题排查步骤
语法错误排查
- DOORS DXL中链接操作必须使用
link()和create()函数,不能用->直接链式调用 - 正则相关函数(
matchText、end)必须传入正则对象作为第一个参数
- DOORS DXL中链接操作必须使用
逻辑错误排查
- 检查正则表达式是否与需求匹配,可通过
print matchedID输出匹配结果验证 - 验证Skip列表是否正确加载目标模块的ID:遍历Skip列表输出键值对
- 检查模块名称是否正确,避免因拼写错误导致
null模块
- 检查正则表达式是否与需求匹配,可通过
性能排查
- 大型模块下,避免在循环内重复打开/关闭模块,预加载Skip列表是最优方案
- 减少不必要的属性读取,仅在属性非空时执行匹配逻辑
内容的提问来源于stack exchange,提问作者Navid Ahmad
相关产品推荐
相关产品推荐

