SAPфорум.RU https://sapboard.ru/forum/ |
|
Определить, что два указателя указывают на один объект https://sapboard.ru/forum/viewtopic.php?f=13&t=95742 |
Страница 1 из 1 |
Автор: | Sam Stone [ Пт, ноя 17 2017, 09:07 ] |
Заголовок сообщения: | Определить, что два указателя указывают на один объект |
Всем привет. Собсна вопрос в теме - как? можно ли просто сравнивать указатели? Типа так: Code: DATA v1 TYPE REF TO if_ixml_node. DATA v2 TYPE REF TO if_ixml_node. IF v1 = v2. ENDIF. Я уперся в то, что один узел полученный разными способами имеет разные указатели. Есть такая портянка Code: <List name="Bla"> <Table> <Row></Row> <Row></Row> <Row></Row> </Table> </List> Передаю в метод 2 объекта - <List> и <Row>. Оба идут как if_ixml_node. В результате мучений по неотработке кода после тестов пришел к следующему: Code: Параметры на вход: List, Row METHOD m1. DATA node TYPE REF TO if_ixml_node. node = Row->get_parent( ). " получили узел Table node = node->get_parent( ). " получили узел List IF node = List. !!!не заходит!!! ENDIF. ENDMETHOD. При том, что если прочитать атрибут name у node и List - возвращается одно и то же значение. Где у меня косяк в логике или что я упустил? Система 4.6, если важно. |
Автор: | ghost [ Пт, ноя 17 2017, 10:24 ] |
Заголовок сообщения: | Re: Определить, что два указателя указывают на один объект |
Sam Stone написал(а): Всем привет. Code: Параметры на вход: List, Row METHOD m1. DATA node TYPE REF TO if_ixml_node. node = Row->get_parent( ). " получили узел Table node = node->get_parent( ). " получили узел List IF node = List. !!!не заходит!!! ENDIF. ENDMETHOD. При том, что если прочитать атрибут name у node и List - возвращается одно и то же значение. То, что аттрибуты одинаковые еще не говорит о том что это одна и таже инстанция. Приведите код как вы формируете инстанции List и Row. С уважением, Руслан |
Автор: | Sam Stone [ Пт, ноя 17 2017, 11:08 ] |
Заголовок сообщения: | Re: Определить, что два указателя указывают на один объект |
Цитата: Приведите код как вы формируете инстанции List и Row. List я получаю через if_ixml_node->clone( ) c шаблонного узла и после работаю только с ним. Row я получаю перебором всех нижестоящих узлов List по условию if_ixml_node->get_name( ) = 'Row' AND if_ixml_node->get_value( ) = 'Искомый текст' или просто порядковый номер узла: Code: DATA table TYPE REF TO if_ixml_node. table = List->get_first_child( ). WHILE NOT table IS INITIAL AND table->get_name( ) <> 'Table'. "<Table> строго 1 узел, но на одном с ним уровне могут быть другие table = table->get_next( ). ENDWHILE. DATA row TYPE REF TO if_ixml_node. DATA index TYPE i. row = table->get_first_child( ). WHILE NOT row IS INITIAL. IF row->get_name( ) = 'Row'. "Могут быть другие узлы на одном уровне ADD 1 TO index. IF index = ИСКОМЫЙ_НОМЕР_УЗЛА. result = row. EXIT. ENDIF. ENDIF. row = row->get_next( ). ENDWHILE. Цитата: То, что аттрибуты одинаковые еще не говорит о том что это одна и таже инстанция 100% атрибут Name уникальный в пределах файла с которым я работаю. Самое интересное, что если сымитировать отработку условия и продолжить обработку, то новые узлы/данные добавятся куда надо. Т.е. по факту обе ссылки все-таки указывают на один объект. Сейчас еще вот что проверил: Code: ... METHODS m1 IMPORTING list TYPE REF TO if_ixml_node row TYPE REF TO if_ixml_node. ... METHOD m1. DATA node TYPE REF TO if_ixml_node. node = list->get_first_child( ). node = node->get_parent( ). IF node = list. "нифига не входит ENDIF. ENDMETHOD. Т.е. беру у узла ZZZ первого потомка, потом у этого потомка беру родителя. То есть должен получить снова узел ZZZ. |
Автор: | Kengur [ Пт, ноя 17 2017, 11:15 ] |
Заголовок сообщения: | Re: Определить, что два указателя указывают на один объект |
В xml нормально сравнивать чтобы надо смотреть Xpath. |
Автор: | Sam Stone [ Пт, ноя 17 2017, 11:24 ] |
Заголовок сообщения: | Re: Определить, что два указателя указывают на один объект |
Вот пример, в котором я не понимаю логику. Суть та же - у узла взял потомка, у этого потомка взял родителя. Должен получить исходный узел. Но нет. Code: REPORT zzz.
START-OF-SELECTION. DATA xml TYPE REF TO if_ixml. DATA xml_doc TYPE REF TO if_ixml_document. xml = cl_ixml=>create( ). xml_doc = xml->create_document( ). DATA(root) = xml_doc->get_root( ). WRITE:/ ''. data(list) = xml_doc->create_simple_element( EXPORTING name = 'List' parent = root ). DO 5 TIMES. data(node) = xml_doc->create_simple_element( name = 'Row' parent = list value = conv #( sy-index ) ). ENDDO. DATA(zzz) = list->get_first_child( ). zzz = zzz->get_parent( ). IF zzz = list. WRITE:/ 'same objects'. ELSE. WRITE:/ 'different objects'. ENDIF. DATA SIZE TYPE I. DATA data_tab TYPE SWXMLCONT. CALL FUNCTION 'SDIXML_DOM_TO_XML' EXPORTING document = xml_doc PRETTY_PRINT = 'X' IMPORTING * XML_AS_STRING = XML_AS_STRING SIZE = SIZE TABLES XML_AS_TABLE = data_tab EXCEPTIONS NO_DOCUMENT = 1 OTHERS = 2 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = size filename = 'C:\SAPWorkDir\debug.xml' filetype = 'BIN' CHANGING data_tab = data_tab EXCEPTIONS others = 24 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. |
Автор: | Sam Stone [ Пт, ноя 17 2017, 11:55 ] |
Заголовок сообщения: | Re: Определить, что два указателя указывают на один объект |
Групповое мышление пришло к такому решению, надеюсь правильному: Code: IF cast CL_IXML_UNKNOWN( node1 )->m_pointee = CAST CL_IXML_UNKNOWN( node2 )->m_pointee.
WRITE:/ 'Это тот же объект'. ELSE. WRITE:/ 'Это разные объекты'. ENDIF. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |