如何从DXL获取对象和较低层次的对象

时间:2019-07-02 15:01:19

标签: ibm-doors

我是DXL的新手,从事的工作可能很简单。 我想解析当前模块,并为具有给定ID(在下面调用IDNUM)的每个对象获取以下数据,这些数据不为空: IDNUM-对象文本-具有较低层次结构级别的所有文本,并且对所有对象来说都是相同的东西。

使用代码可能会更容易理解。到目前为止,看起来像这样:

Object o 
Object ol
Link l
Module m = current Module

For o in entire(m) do{
 if (o."IDNUM" != ""){
   print o."IDNUM" "" 
   print o."text" "" 
   //HERE I WOULD LIKE TO ALSO PRINT EVERY TEXT IN OBJECT "LOWER" THAN o
   for l in o --> "*" do{
    ol = target(l)
    print ol."text" "" 
    //HERE I WOULD LIKE TO ALSO PRINT EVERY TEXT IN OBJECT "LOWER" THAN ol
   }
  }
}

基本上,我既有对象的ID和标题,也有喜欢的对象,但下面的文本却没有。换句话说,我的代码将“模仿”函数right click>copy>copy with hierarchy  我怎样才能做到这一点?不幸的是,我发现没有什么非常有用的。

非常感谢

2 个答案:

答案 0 :(得分:1)

这是您概述的草图代码:

Author

这里需要修改一些语法,但是最大的变化是您处理链接项目的方式。链接在源模块中“处于活动状态”,但它们仅存储有限的信息,其中大多数是链接的源和目标模块,以及它们接触的对象的绝对数量。因此,您需要先检查另一侧的模块是否打开,然后再尝试从中读取文本。

并且由于您试图遍历整个链接结构,因此需要一个递归元素。

我可能最终会得到这样的东西:

Object o 
Object ol
Link l
Module m = current Module

For o in entire(m) do{
 if (o."IDNUM" != ""){
   print o."IDNUM" "" 
   print o."text" "" 
   //HERE I WOULD LIKE TO ALSO PRINT EVERY TEXT IN OBJECT "LOWER" THAN o
   for l in o --> "*" do{
    ol = target(l)
    print ol."text" "" 
    //HERE I WOULD LIKE TO ALSO PRINT EVERY TEXT IN OBJECT "LOWER" THAN ol
   }
  }
}

注意!根据链接结构的大小,即您拥有多少级(以及是否有圆形链接模式),这可能是一项相当耗费资源的任务,并且可以使用“打印”命令以外的其他方法(例如例如,将其附加到word文件中,这样您就可以知道它在出错之前走了多远)

祝你好运!

编辑:

此脚本现在可以进行单个级别的操作,而不是递归地进行下去,但是应该报告子对象。

//turn off run limit timer- this might take a bit
pragma runLim , 0 

Object o 
Module m = current Module

// Recursive function- assumes each object has a text attribute- will error otherwise
void link_print(Object obj) {
    print obj."text" "\n"
    Link out_link
    Object next_obj = null
    for out_link in obj -> "*" do {
        // Set the next object in the chain
        next_obj = target ( out_link )
        // This might return null if the module is not loaded
        if ( null next_obj ) {
            // Load the module in read-only mode, displayed and in standard view
            read ( fullName ( ModName_ target ( out_link ) ) , true , true )
            // Try and resolve out 'target' again
            next_obj = target ( out_link )
            // If it doesn't work, print a message so we can figure it out
            if ( null next_obj ) {
                print "Error Accessing Object " ( targetAbsNo ( out_link ) )""
            } else {
                //Iterate down structure
                link_print ( next_obj )
            }
        } else {
            //Iterate down structure
            link_print ( next_obj )
        }
    }
}


for o in entire(m) do {
    // Note that I cast the result of o."IDNUM" to a string type by appending ""
    if (o."IDNUM" "" != ""){
        print o."IDNUM" "\n" 
        // Recurse
        link_print(o)
        print "\n"
    }
}

答案 1 :(得分:0)

尊敬的罗素(以及其他所有人)

我刚刚遍历了您提供给我的那段代码,它就可以了。。。。但不是我想要的。看来我的解释不是很清楚。抱歉(我不是母语人士)。 我并不是要获得所有链接,而只是获得Object text,它是写在当前链接所指向的对象正下方的。 这是我的文件的样子

 object1 (with IDNUM) : "Title_doc_1"   --> (link) objectA "Title_doc_2"
    object2 : "some_text"                            objectB : "some_text"
    object3 : "some_text"                            objectC : "some_text"

({object1可以指向许多其他objectA,但我已经解决了。)

我在上面提供的代码解析“ doc_1”,并打印"IDNUM" "Title_doc_1" "Title_doc_2"

我正在寻找的不仅是objectA,而且还有objectBobjectC,它们分别位于objectA(和object2object3也一样,但过程相同。

我让自己明白了...