PBToolboxAI v4 ← Site

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 levanta ue_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 #

Userobjectu_pbt_xmltree
EntradaO texto XML, em is_xml (uma cadeia)
Dobrar / desdobrarCada 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)
RetornoUm 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
FidelidadeCada 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 #

PropriedadeTipoPredefinidoDescrição
is_xmlstring""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_wrapbooleantrueAs linhas longas quebram (true, por omissão) ou ficam numa linha com barra horizontal (false) — um aspeto de editor de código
ib_search_enabledbooleantrueCtrl+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_casebooleanfalseOpçã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_wordbooleanfalseOpçã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_stylestring""Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança
is_theme_modestring""Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema)
is_tooltipstring""Tooltip simples apresentado ao passar sobre o componente
is_super_tooltip_titlestring""Título do tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido

Métodos #

MétodoDescrição
of_expand_all ( ) → longDesdobra 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 ( ) → longDobra 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 ( ) → longEsvazia 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 ) → longMostra 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 ) → longAbre 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 ) → longDobra 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 ) → booleantrue 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 ) → longRealç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 ( ) → longPassa à correspondência SEGUINTE (volta à primeira depois da última); ue_search_result indica a nova posição
of_search_prev ( ) → longPassa à correspondência ANTERIOR (volta à última antes da primeira); ue_search_result indica a nova posição
of_clear_search ( ) → longApaga 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 ) → longSeleciona 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 ( ) → stringO 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 ( ) → stringO 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 ( ) → stringO 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 ( ) → longPõ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 ( ) → longDevolve 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 ( ) → longDevolve 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 #

EventoQuando
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 #


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.

MembrosFunçãoDetalhado em
of_resetRepor o componente a zero3.6 Repor um componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsAtalhos de teclado do componente3.5 Os atalhos de teclado
of_is_created · of_is_ready · of_get_last_errorSe nasceu, se está pronto, o que falhou3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar a renderização como imagem3.8 Exportar a representação como imagem
of_set_redrawAgrupar as alterações num único repinte3.10 Boas práticas
of_preload_iconsÍcones mostrados sem atrasoApresentação instantânea: of_icon
of_set_translationTraduzir uma legenda do componente5.2 Adaptar uma etiqueta: of_set_translation
of_focus_webviewDar o foco ao componente6.4 Teclado e focus
of_print · of_print_to_pdfImprimir, ou escrever um PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar uma propriedade pelo nome3.1 O motor de propriedades

← Referência dos componentes · Índice do guia