xmltree — u_pbt_xmltree #
← Referência dos componentes · Índice do guia
xmltree mostra um valor XML como uma árvore recolhível, colorida: um ecrã de configuração, uma resposta de API, uma depuração de integração. Define o texto XML em
is_xml, o componente mostra-o; um clique num nó reporta o seu caminho (ue_node_clicked), um XML inválido levantaue_error. Não modifica nada: é um VISUALIZADOR.
▶ Ver ao vivo — Aplicação de demonstração, mosaico XML tree, com o código e esta página lado a lado.
Em resumo #
| Userobject | u_pbt_xmltree |
| Entrada | O texto XML, em is_xml (uma cadeia) |
| Dobrar / desdobrar | Cada elemento pelo seu marcador + / − na margem dos números, pelo seu caminho (of_expand_path, of_collapse_path), ou tudo de uma vez (of_expand_all, of_collapse_all) |
| Retorno | Um clique num nó dá o seu caminho (ue_node_clicked), um XPath que n_pbt_xml lê tal como está: /order/lines/line[2], /order/@id para um atributo, /order/comment()[1] para um comentário — cada linha tem o seu; um XML inválido levanta ue_error e mostra a fonte, com a linha errada marcada |
| Fidelidade | Cada nó no seu lugar, pela ordem do documento: o texto entre dois filhos, as secções CDATA, os comentários, as instruções de processamento, a declaração XML |
Início rápido #
// Show an XML response as a tree
uo_xml.is_xml = inv_rest.of_response_text()
// Fold everything, then let the user open what interests them
uo_xml.of_collapse_all()
// ue_node_clicked : the path of the node clicked, an XPath ("/order/lines/line[2]",
// "/order/@id" for an attribute) -> n_pbt_xml.of_get_value(as_path) reads its value
Propriedades #
| Propriedade | Tipo | Predefinido | Descrição |
|---|---|---|---|
is_xml | string | "" | O texto XML a mostrar, lido e apresentado como uma árvore: cada nó no seu lugar. Vazio limpa a árvore, sem erro; um XML inválido levanta ue_error e mostra a fonte à volta da linha errada. Relê-se tal como foi definido, mesmo um texto inválido |
ib_wrap | boolean | true | As linhas longas quebram (true, por omissão) ou ficam numa linha com barra horizontal (false) — um aspeto de editor de código |
ib_search_enabled | boolean | true | Ctrl+F na árvore abre uma caixa de pesquisa — a mesma pesquisa que of_search: escrever realça, Enter ou F3 seguinte, Shift+Enter ou Shift+F3 anterior, Esc fecha. false deixa o atalho a uma aplicação que pesquisa a partir da sua própria caixa. A caixa tem dois botões antes do contador, Aa (ib_find_match_case) e ab (ib_find_whole_word); mudar uma opção relança a pesquisa em curso a partir da sua primeira ocorrência |
ib_find_match_case | boolean | false | Opção de pesquisa: só encontra o texto com as mesmas maiúsculas e minúsculas. O botão Aa da caixa de pesquisa (Ctrl+F) é o mesmo interruptor; vale para of_search e para o que o utilizador escreve. Lida em direto; of_reset repõe-na a false |
ib_find_whole_word | boolean | false | Opção de pesquisa: só encontra o texto como palavra inteira (uma letra, um algarismo ou um _ ao lado faz parte da palavra: id não é encontrado nem em user_id nem em ids). O botão ab da caixa de pesquisa é o mesmo interruptor. Lida em direto; of_reset repõe-na a false |
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança |
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança |
il_theme_accent | long | -1 | Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema) |
is_tooltip | string | "" | Tooltip simples apresentado ao passar sobre o componente |
is_super_tooltip_title | string | "" | Título do tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto do tooltip enriquecido (aceita marcação enriquecida) |
is_super_tooltip_image | string | "" | Imagem do tooltip enriquecido |
Métodos #
| Método | Descrição |
|---|---|
of_expand_all ( ) → long | Desdobra cada elemento. Nenhum ue_node_toggled: nenhum gesto abre a árvore inteira de uma vez. Devolve 0, -2 se o componente não estiver criado |
of_collapse_all ( ) → long | Dobra cada elemento aninhado (a raiz fica visível). Uma seleção escondida por uma dobra passa para o elemento dobrado, e ue_selection_changed indica-o. Nenhum ue_node_toggled: nenhum gesto dobra a árvore inteira de uma vez. Devolve 0, -2 se o componente não estiver criado |
of_clear ( ) → long | Esvazia a árvore (como is_xml = ""); ib_wrap, ib_search_enabled, ib_find_match_case e ib_find_whole_word mantêm o seu valor (é of_reset que repõe cada propriedade). Devolve 0, -2 se o componente não estiver criado |
of_expand_to_level ( long al_level ) → long | Mostra a árvore até al_level: os elementos a essa profundidade ou mais dobram (1 = os filhos diretos da raiz, 0 dobra a raiz). Nenhum ue_node_toggled; uma seleção que ele desloca para um elemento dobrado levanta ue_selection_changed |
of_expand_path ( string as_path ) → long | Abre UM elemento pelo seu caminho — qualquer XPath, como of_select_path — e os elementos acima dele para que se veja. Como o seu marcador +, levanta ue_node_toggled para o elemento e para cada elemento dobrado acima dele aberto pelo caminho (nada para um elemento já aberto). Devolve 0, -5 se nenhum elemento com filhos corresponder, -2 se o componente não estiver criado |
of_collapse_path ( string as_path ) → long | Dobra UM elemento pelo seu caminho (qualquer XPath). Como o seu marcador −, levanta ue_node_toggled se o elemento estava aberto, e ue_selection_changed quando a seleção tem de passar para ele. Devolve 0, -5 se nenhum elemento com filhos corresponder, -2 se o componente não estiver criado |
of_is_expanded ( string as_path ) → boolean | true se o elemento desse caminho (qualquer XPath) estiver aberto, lido EM DIRETO; false se estiver dobrado, e para um nó sem filhos ou um caminho que não encontra nada. O suficiente para guardar o que o utilizador abriu e restabelecê-lo |
of_search ( string as_query ) → long | Realça cada ocorrência (sem distinguir maiúsculas por omissão — ver ib_find_match_case —, só palavras inteiras com ib_find_whole_word) e salta para a primeira; só se abrem os elementos que escondem a ocorrência ATUAL, e of_clear_search volta a dobrá-los. ue_search_result diz quantas. A pesquisa olha para o texto tal como é MOSTRADO: & encontra-se tal como está escrito. Uma consulta vazia é of_clear_search. A caixa de pesquisa abre-se com a consulta lá dentro e o foco nela (a mesma que Ctrl+F): Enter passa à seguinte; com ib_search_enabled a false, a árvore apenas realça |
of_search_next ( ) → long | Passa à correspondência SEGUINTE (volta à primeira depois da última); ue_search_result indica a nova posição |
of_search_prev ( ) → long | Passa à correspondência ANTERIOR (volta à última antes da primeira); ue_search_result indica a nova posição |
of_clear_search ( ) → long | Apaga a pesquisa: deixa de haver realce e correspondência atual (of_match_count devolve 0), a caixa de pesquisa esvazia-se e fecha-se, e os elementos que a pesquisa abriu voltam a dobrar-se como antes. Devolve 0, ou um código negativo |
of_select_path ( string as_path ) → long | Seleciona e desloca até ao nó em as_path; como o teclado, levanta ue_selection_changed (nada se o nó já estiver selecionado); os elementos dobrados que o escondem abrem-se. as_path é QUALQUER XPath 1.0 que designe um nó da árvore: um caminho tal como a árvore o dá (/order/@id), //line[@sku='A'], /order/lines/line[1], outro prefixo ligado ao mesmo espaço de nomes; é selecionado o primeiro nó encontrado, e of_selected_path dá depois o caminho da árvore. Devolve 0, -5 se nenhum nó da árvore corresponder (a seleção não se mexe), -2 se o componente não estiver criado |
of_selected_path ( ) → string | O caminho do nó selecionado, lido EM DIRETO: um caminho XPath 1.0 para passar tal como está a n_pbt_xml.of_get_value sobre o mesmo documento. CADA linha tem o seu: /order/lines/line[2] quando um nome se repete, /order/@id para um atributo, /p/text()[2] para um texto, /order/comment()[1], /order/processing-instruction('x')[1], /comment()[1] antes da raiz. Um elemento de um espaço de nomes PREDEFINIDO escreve-se *[local-name()='Body'] — um nome simples não encontra nada em XPath; um nome com prefixo (soap:Body) é mantido quando o seu prefixo designa o mesmo espaço de nomes, senão o passo nomeia também o espaço (namespace-uri()). Uma etiqueta de fecho dá o seu elemento. Vazio se nada estiver selecionado, e para a declaração XML ou o DOCTYPE (que não são nós) |
of_selected_value ( ) → string | O valor da seleção, lido EM DIRETO e descodificado — o que n_pbt_xml.of_get_value lê em of_selected_path: o valor de um atributo, o texto de um elemento FOLHA (CDATA incluído, espaços mantidos), o texto de uma linha de texto, de um comentário ou de uma instrução de processamento. Vazio para um elemento com filhos, ou sem seleção |
of_selected_xml ( ) → string | O XML do nó selecionado, lido EM DIRETO: um elemento com tudo o que contém, um atributo na forma name="value", um texto escapado, um comentário, um CDATA ou uma instrução de processamento tal como escritos — o que se copia de um editor XML. Vazio sem seleção |
of_copy ( ) → long | Põe o XML da seleção na área de transferência, como Ctrl+C na árvore (o texto de of_selected_xml). Devolve 0, -4 se nada estiver selecionado, -2 se o componente não estiver criado |
of_match_count ( ) → long | Devolve o número de OCORRÊNCIAS da pesquisa atual (duas numa linha contam duas), lido EM DIRETO — o 12 de uma barra de estado 3 / 12. 0 sem pesquisa |
of_match_index ( ) → long | Devolve a posição (1-based) da correspondência atual, lida AO VIVO — o 3 de uma barra de estado 3 / 12. 0 sem correspondência |
Eventos #
| Evento | Quando |
|---|---|
ue_node_clicked (string as_path) | O utilizador clicou num nó, ou premiu Enter numa folha selecionada: o seu XPath (/order/lines/line[2]); um atributo, um texto, um comentário ou uma instrução de processamento dá o seu (/order/@id, /order/comment()[1]), uma etiqueta de fecho o seu elemento. Para passar a n_pbt_xml.of_get_value sobre o mesmo documento |
ue_node_toggled (string as_path, boolean ab_expanded) | Um elemento foi dobrado (ab_expanded = false) ou aberto (true): pelo utilizador (o seu marcador + / −, as setas, Enter ou Espaço) ou por of_expand_path / of_collapse_path. of_expand_all, of_collapse_all e of_expand_to_level não o levantam: nenhum gesto dobra a árvore inteira |
ue_selection_changed (string as_path) | A seleção moveu-se sem clique, pelo utilizador ou pelo seu código: setas, Início/Fim, Page Up/Down, of_select_path, ou uma dobra que esconde a linha selecionada (a seleção passa para o elemento dobrado). Só é levantado quando a seleção muda mesmo — um clique do rato reporta ue_node_clicked |
ue_search_result (long al_count, long al_index) | Uma pesquisa começou ou avançou: al_count ocorrências no total, a atual é al_index (a partir de 1, 0 se nenhuma) — o suficiente para mostrar « 3 / 12 » |
ue_error (string as_message) | O texto em is_xml não é um XML válido: a mensagem diz onde, na língua de apresentação (« XML inválido : linha 3, coluna 16 (…) », o detalhe do motor entre parênteses), e a árvore mostra a fonte à volta dessa linha, com a linha errada marcada. Levantado também quando o documento é demasiado grande para ser mostrado |
Exemplo #
Explorar a resposta de uma API #
// Show the XML an API answered, or nothing if the call failed
if inv_rest.of_get(/*url*/ "https://api.example.com/orders/4152") = 200 then
uo_xml.is_xml = inv_rest.of_response_text()
uo_xml.of_collapse_all() // the reader opens what interests them
else
uo_xml.of_clear()
end if
Ler o valor de um nó clicado #
// ue_node_clicked of uo_xml : the path is an XPath n_pbt_xml reads as it is
// (inv_xml is an n_pbt_xml created by the window, ipo_owner = the window)
inv_xml.of_load(/*xml*/ uo_xml.is_xml)
st_value.text = inv_xml.of_get_value(/*xpath*/ as_path)
// or, without a second parser : the value of the selection, decoded
st_value.text = uo_xml.of_selected_value()
Pesquisar palavras inteiras, com maiúsculas #
// Whole words only, with the same case : "id" is not found inside "user_id"
uo_xml.ib_find_match_case = true
uo_xml.ib_find_whole_word = true
uo_xml.of_search(/*query*/ "id")
Boas práticas #
- É um visualizador, não um editor: mostra o XML, não o muda. Para ler um valor, passe o caminho de
ue_node_clickedan_pbt_xml.of_get_valuesobre o mesmo texto, ou leiaof_selected_value. - Um XML grande continua fluido: só são desenhadas as linhas no ecrã, uma exportação de vários milhares de linhas percorre-se com o teclado sem esperas. Primeiro
of_collapse_allcontinua a ser o mais legível. - Um XML inválido não parte nada:
ue_errordi-lo (com a linha e a coluna da falha, na língua de apresentação), e a árvore mostra a fonte à volta da linha errada. É o retorno a mostrar, não uma falha. - Um espaço de nomes predefinido (
xmlns="urn:…", uma resposta SOAP): o caminho escreve-se*[local-name()='Body'], a única forma que um XPath sem prefixo registado sabe ler; um prefixo redeclarado com outro URI, ou um irmão com o mesmo nome noutro espaço, escreve-se*[local-name()='x' and namespace-uri()='urn:…'].@xml:langlê-se tal como está. Uma declaraçãoxmlnsé mostrada mas não tem caminho: o XPath não a vê como um atributo. - O que se mostra é XML: o valor de um atributo mantém as aspas e as quebras de linha codificadas (
), um texto os seus&e<e os espaços significativos; só desaparecem as quebras de linha de paginação à volta de um texto. - Com o teclado: as setas passam de linha em linha, Seta direita percorre os atributos de uma etiqueta antes de descer, Page Down avança um ecrã (uma secção CDATA de trezentas linhas conta pela sua altura), Ctrl+C copia o XML da seleção.
- Da direita para a esquerda: um documento XML é um texto da esquerda para a direita, a árvore continua assim numa aplicação RTL (só a caixa de pesquisa segue o sentido da aplicação).
Herdado da base comum #
Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.
| Membros | Função | Detalhado em |
|---|---|---|
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |