Как получить объект и нижние иерархические объекты из DXL - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в DXL и работаю над тем, что, вероятно, довольно просто. Я хотел бы проанализировать текущий модуль и получить следующие данные для каждого объекта, который имеет данный идентификатор (вызывая 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
   }
  }
}

По сути, у меня есть идентификатор и название объекта и понравившегося ему объекта, но не текст ниже. Другими словами, мой код будет «подражать» функции right click>copy>copy with hierarchy Как я могу это сделать? К сожалению, я не нашел ничего очень полезного.

Заранее большое спасибо,

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вот набросок кода, который вы обрисовали в общих чертах:

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
   }
  }
}

Есть несколько небольших синтаксических вещей, которые необходимо изменить здесь, но большое изменение заключается в том, как вы обрабатываете связанные элементы.Ссылки «живут» в исходном модуле, но они хранят только ограниченный объем информации, в основном это модули, являющиеся источником и целью ссылки, и абсолютные числа объектов, к которым они прикасаются.Поэтому вам нужно проверить, открыт ли модуль на другой стороне, прежде чем пытаться читать текст с него.

И поскольку вы пытаетесь просмотреть всю структуру ссылок, вам понадобится рекурсивный элемент дляэто.

Я бы, вероятно, в конечном итоге что-то вроде этого:

//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"
    }
}

Примечание!В зависимости от размера вашей структуры ссылок, т. Е. Сколько у вас уровней (и если есть какие-либо шаблоны циклических ссылок), это может быть довольно ресурсоемкой задачей, и ее лучше решить с помощью чего-то другого, чем команды «print» (например,например, добавив его в текстовый файл, чтобы вы знали, как далеко он прошел до того, как произошла ошибка)

Удачи!

РЕДАКТИРОВАТЬ:

Вместо рекурсивного сниженияэтот сценарий теперь будет проходить один уровень, но должен сообщать о дочерних объектах.

 //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
    Object child_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 {
                // Loop and report on child objects
                for child_obj in next_obj do {
                    print child_obj."text" "\n"
                }
            }
        } else {
            // Loop and report on child objects
            for child_obj in next_obj do {
                print child_obj."text" "\n"
            }
        }
    }
}


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"
    }
}
0 голосов
/ 03 июля 2019

Дорогой Рассел (и все остальные)

Я только что просмотрел фрагмент кода, который вы мне предоставили, и он работает .... но не для того, что я ищу. Кажется, мое объяснение было не очень ясным. Извините (я не являюсь носителем языка). Я не ищу все ссылки, а просто 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, но также objectB и objectC, которые иерархически ниже objectAobject2 и object3 тоже, но это будет то же самое процесс).

Прыгая, я понял себя ...

...