PBToolboxAI v5 ← Site

xmltree — u_pbt_xmltree #

← Riferimento dei componenti · Sommario della guida

xmltree mostra un valore XML come un albero comprimibile, colorato: una schermata di configurazione, una risposta API, un debug di integrazione. Imposti il testo XML in is_xml, il componente lo mostra; un clic su un nodo riporta il suo percorso (ue_node_clicked), un XML non valido solleva ue_error. Non modifica nulla: è un VISUALIZZATORE.

▶ Vederlo dal vivo — Applicazione dimostrativa, tessera XML tree, con il codice e questa pagina fianco a fianco.


In breve #

Userobjectu_pbt_xmltree
IngressoIl testo XML, in is_xml (una stringa)
Piega / dispiegaOgni elemento con il suo indicatore + / − nel margine dei numeri, con il suo percorso (of_expand_path, of_collapse_path), o tutto in una volta (of_expand_all, of_collapse_all)
RitornoUn clic su un nodo dà il suo percorso (ue_node_clicked), un XPath che n_pbt_xml legge così com'è: /order/lines/line[2], /order/@id per un attributo, /order/comment()[1] per un commento — ogni riga ha il suo; un XML non valido solleva ue_error e mostra il sorgente, con la riga errata evidenziata
FedeltàOgni nodo al suo posto, nell'ordine del documento: il testo tra due figli, le sezioni CDATA, i commenti, le istruzioni di elaborazione, la dichiarazione XML

Avvio rapido #

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

Proprietà #

ProprietàTipoPredefinitoDescrizione
is_xmlstring""Il testo XML da mostrare, letto e visualizzato come un albero: ogni nodo al suo posto. Vuoto svuota l'albero, senza errore; un XML non valido solleva ue_error e mostra il sorgente attorno alla riga errata. Si rilegge esattamente come è stato impostato, anche un testo non valido. Un nuovo documento riparte senza selezione e tutto aperto: of_get_layout prima e of_set_layout dopo mantengono ciò che l'utente aveva aperto
ib_wrapbooleantrueLe righe lunghe vanno a capo (true, predefinito) o restano su una riga con barra orizzontale (false) — un aspetto da editor di codice
ib_search_enabledbooleantrueCtrl+F nell'albero apre una casella di ricerca — la stessa ricerca di of_search: digitare evidenzia, Invio o F3 successivo, Maiusc+Invio o Maiusc+F3 precedente, Esc chiude. false lascia la scorciatoia a un'applicazione che cerca dalla propria casella. La casella porta tre pulsanti prima del contatore, Aa (ib_find_match_case), ab (ib_find_whole_word) e & (ib_find_decoded); cambiare un'opzione rilancia la ricerca in corso dalla sua prima occorrenza
ib_find_match_casebooleanfalseOpzione di ricerca: trova solo il testo con le stesse maiuscole/minuscole. Il pulsante Aa della casella di ricerca (Ctrl+F) è lo stesso interruttore; vale per of_search e per ciò che l'utente digita. Letta in tempo reale; of_reset la rimette a false
ib_find_whole_wordbooleanfalseOpzione di ricerca: trova il testo solo come parola intera (una lettera, una cifra o un _ accanto fa parte della parola: id non viene trovato né in user_id né in ids). Il pulsante ab della casella di ricerca è lo stesso interruttore. Letta in tempo reale; of_reset la rimette a false
ib_find_decodedbooleanfalseOpzione di ricerca: cerca nei VALORI decodificati — un testo e un valore di attributo letti come li legge n_pbt_xml (Durand & Co trova Durand &amp; Co, x < y trova x &lt; y); l'evidenziazione copre l'intero escape. false cerca il testo così com'è mostrato. Il pulsante & della casella di ricerca è lo stesso interruttore. Letta in tempo reale; of_reset la rimette a false
is_theme_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sul componente
is_super_tooltip_titlestring""Titolo del tooltip avanzato (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato

Metodi #

MetodoDescrizione
of_expand_all ( ) → longDispiega ogni elemento. Nessun ue_node_toggled: nessun gesto apre l'intero albero in una volta. Rende 0, -2 se il componente non è creato
of_collapse_all ( ) → longPiega ogni elemento annidato (la radice resta visibile). Una selezione nascosta da una piega passa sull'elemento piegato, e ue_selection_changed lo segnala. Nessun ue_node_toggled: nessun gesto piega l'intero albero in una volta. Rende 0, -2 se il componente non è creato
of_clear ( ) → longSvuota l'albero (come is_xml = ""); ib_wrap, ib_search_enabled, ib_find_match_case e ib_find_whole_word mantengono il loro valore (è of_reset a ripristinare ogni proprietà). Rende 0, -2 se il componente non è creato
of_expand_to_level ( long al_level ) → longMostra l'albero fino a al_level: gli elementi a quella profondità o più si chiudono (1 = i figli diretti della radice, 0 chiude la radice). Nessun ue_node_toggled; una selezione che sposta su un elemento piegato solleva ue_selection_changed. Rende 0, -2 se il componente non è creato
of_expand_path ( string as_path ) → longApre UN elemento con il suo percorso — qualsiasi XPath, come of_select_path — e gli elementi sopra di lui perché si veda. Come il suo indicatore +, solleva ue_node_toggled per l'elemento e per ogni elemento piegato sopra di lui aperto lungo il percorso (nulla per un elemento già aperto). Restituisce 0, -5 se nessun elemento con figli corrisponde, -2 se il componente non è creato
of_collapse_path ( string as_path ) → longPiega UN elemento con il suo percorso (qualsiasi XPath). Come il suo indicatore −, solleva ue_node_toggled se l'elemento era aperto, e ue_selection_changed quando la selezione deve passare su di lui. Restituisce 0, -5 se nessun elemento con figli corrisponde, -2 se il componente non è creato
of_is_expanded ( string as_path ) → booleantrue se l'elemento di quel percorso (qualsiasi XPath) è aperto, letto IN DIRETTA; false se è piegato, e per un nodo senza figli o un percorso che non trova nulla. Quanto basta per salvare ciò che l'utente ha aperto e ripristinarlo
of_get_layout ( ) → stringLa disposizione dell'albero, letta IN DIRETTA, come testo JSON da salvare: gli elementi piegati (collapsed, oppure expanded quando questa lista è più corta — ogni elemento che non nomina è allora piegato), il percorso selezionato (selected, null senza selezione) e la riga in cima alla vista (top, un percorso, mai pixel). Da restituire a of_set_layout, anche dopo un nuovo documento
of_set_layout ( string as_layout_json ) → longRestituisce all'albero una disposizione data da of_get_layout: le pieghe (un percorso che il documento non ha più è ignorato, un elemento nuovo mantiene il suo valore predefinito), la selezione (ue_selection_changed, come of_select_path) e la riga in cima. ue_layout_changed segue una volta se le pieghe sono cambiate. Restituisce 0, -5 se il testo non è un oggetto JSON, -2 se il componente non è creato
of_search ( string as_query ) → longEvidenzia ogni occorrenza (senza distinzione di maiuscole per impostazione predefinita — vedere ib_find_match_case —, solo parole intere con ib_find_whole_word) e salta alla prima; si aprono solo gli elementi che nascondono l'occorrenza CORRENTE, e of_clear_search li ripiega. ue_search_result dice quante. La ricerca guarda il testo così come è MOSTRATO: in un testo, Durand & Co è scritto Durand &amp; Co e si cerca così (una sezione CDATA lo mostra così com'è) — con ib_find_decoded, nei valori decodificati, dove Durand & Co trova entrambi. Una query vuota è of_clear_search; una ricerca chiude un of_find_xpath. La casella di ricerca si apre con la query dentro e il focus su di essa (la stessa di Ctrl+F): Invio passa alla successiva; con ib_search_enabled a false, l'albero evidenzia soltanto. Rende 0, o un codice negativo
of_search_next ( ) → longPassa alla corrispondenza SUCCESSIVA (torna alla prima dopo l'ultima); durante un of_find_xpath, al nodo successivo, che viene selezionato. ue_search_result riporta la nuova posizione. Rende 0, o un codice negativo
of_search_prev ( ) → longPassa alla corrispondenza PRECEDENTE (torna all'ultima prima della prima); durante un of_find_xpath, al nodo precedente, che viene selezionato. ue_search_result riporta la nuova posizione. Rende 0, o un codice negativo
of_clear_search ( ) → longCancella la ricerca, o l'of_find_xpath: niente più evidenziazione né corrispondenza corrente (of_match_count rende 0), la casella di ricerca si svuota e si chiude, e gli elementi che la ricerca aveva aperto si ripiegano come prima. Rende 0, o un codice negativo
of_find_xpath ( string as_xpath ) → longEvidenzia OGNI nodo dell'albero che un XPath designa (//line, //line[@qty > 1], //@sku) e seleziona il primo; of_search_next / of_search_prev (e F3) li percorrono, ciascuno selezionato, e ue_search_result li conta. Una ricerca di testo, of_clear_search, Ctrl+F o un nuovo documento la terminano. Restituisce il numero di nodi trovati (0 se nessuno), -5 se il testo non è un XPath di nodi (un errore di sintassi, un numero come count(…), un prefisso sconosciuto), -2 se il componente non è creato. Un testo vuoto equivale a of_clear_search
of_select_path ( string as_path ) → longSeleziona e scorre fino al nodo in as_path; come la tastiera, solleva ue_selection_changed (nulla se il nodo è già selezionato); gli elementi piegati che lo nascondono si aprono. as_path è QUALSIASI XPath 1.0 che designa un nodo dell'albero: un percorso come lo dà l'albero (/order/@id), //line[@sku='A'], /order/lines/line[1], un altro prefisso legato allo stesso spazio dei nomi; viene selezionato il primo nodo trovato che l'albero MOSTRA (uno spazio di impaginazione non ha riga), e of_selected_path rende poi il percorso dell'albero. Rende 0, -5 se nessun nodo dell'albero corrisponde (la selezione non si muove), -2 se il componente non è creato
of_selected_path ( ) → stringIl percorso del nodo selezionato, letto IN DIRETTA: un percorso XPath 1.0 da passare così com'è a n_pbt_xml.of_get_value sullo stesso documento. OGNI riga ha il suo: /order/lines/line[2] quando un nome si ripete, /order/@id per un attributo, /p/text()[2] per un testo, /order/comment()[1], /order/processing-instruction('x')[1], /comment()[1] prima della radice. Un elemento in uno spazio dei nomi PREDEFINITO si scrive *[local-name()='Body'] — un nome nudo non trova nulla in XPath; un nome con prefisso (soap:Body) resta tale quando il suo prefisso designa lo stesso spazio dei nomi, altrimenti il passo nomina anche lo spazio (namespace-uri()). Un tag di chiusura dà il suo elemento. Vuoto se nulla è selezionato, e per la dichiarazione XML o il DOCTYPE (che non sono nodi)
of_selected_value ( ) → stringIl valore della selezione, letto IN DIRETTA e decodificato — ciò che n_pbt_xml.of_get_value legge in of_selected_path: il valore di un attributo, il testo di un elemento FOGLIA (CDATA compreso, spazi mantenuti), il testo di una riga di testo, di un commento o di un'istruzione di elaborazione; un elemento mostrato <x/> che contiene solo a capo li rende, come n_pbt_xml. Vuoto per un elemento con figli, o senza selezione
of_selected_xml ( ) → stringIl XML del nodo selezionato, letto IN DIRETTA: un elemento con tutto ciò che contiene, un attributo nella forma name="value", un testo con escape, un commento, un CDATA o un'istruzione di elaborazione come scritti — ciò che si copia da un editor XML. Vuoto senza selezione
of_selected_kind ( ) → stringChe cosa è il nodo selezionato, letto IN DIRETTA: KIND_ELEMENT, KIND_ATTRIBUTE, KIND_TEXT, KIND_CDATA, KIND_COMMENT, KIND_PI (un'istruzione di elaborazione), KIND_DECLARATION (la dichiarazione XML) o KIND_DOCTYPE. Vuoto senza selezione
of_selected_name ( ) → stringIl nome qualificato del nodo selezionato, letto IN DIRETTA: un elemento o un attributo come scritto (soap:Body, id), la destinazione di un'istruzione di elaborazione. Vuoto per un testo, un CDATA, un commento, la dichiarazione, il DOCTYPE, o senza selezione
of_selected_namespace ( ) → stringL'URI dello spazio dei nomi dell'elemento o dell'attributo selezionato, letto IN DIRETTA (http://schemas.xmlsoap.org/soap/envelope/). Vuoto se non ne ha (un attributo senza prefisso non ne ha), per ogni altro nodo, o senza selezione
of_copy ( ) → longMette il XML della selezione negli appunti, come Ctrl+C nell'albero (il testo di of_selected_xml); un pezzo di testo evidenziato col mouse è ciò che Ctrl+C copia. Restituisce 0, -4 se nulla è selezionato, -2 se il componente non è creato
of_copy_path ( ) → longMette il PERCORSO del nodo selezionato negli appunti (/order/lines/line[2], /order/@id), un XPath pronto per n_pbt_xml. Restituisce 0, -4 se nulla è selezionato o se il nodo non ha percorso (la dichiarazione XML, il DOCTYPE), -2 se il componente non è creato
of_match_count ( ) → longRende il numero di OCCORRENZE della ricerca corrente (due su una riga contano due), letto IN DIRETTA — il 12 di una barra di stato 3 / 12. 0 senza ricerca
of_match_index ( ) → longRende la posizione (1-based) della corrispondenza corrente, letta DAL VIVO — il 3 di una barra di stato 3 / 12. 0 senza corrispondenza

Eventi #

EventoQuando
ue_node_clicked (string as_path)L'utente ha cliccato un nodo, o premuto Invio su una foglia selezionata: il suo XPath (/order/lines/line[2]); un attributo, un testo, un commento o un'istruzione di elaborazione dà il proprio (/order/@id, /order/comment()[1]), un tag di chiusura il suo elemento. Da passare a n_pbt_xml.of_get_value sullo stesso documento
ue_node_toggled (string as_path, boolean ab_expanded)Un elemento è stato piegato (ab_expanded = false) o aperto (true): dall'utente (il suo indicatore + / −, le frecce, Invio o Spazio) o da of_expand_path / of_collapse_path. of_expand_all, of_collapse_all e of_expand_to_level non lo sollevano: nessun gesto piega l'intero albero
ue_node_rclicked (string as_path, long al_x, long al_y)Clic destro su un nodo, o tasto Menu (Maiusc+F10) nell'albero: il nodo è prima selezionato (ue_selection_changed se la selezione si è spostata), as_path è il suo percorso, al_x / al_y il punto sullo SCHERMO, in pixel. Aprite lì il vostro menu (un u_pbt_contextmenu): l'albero non ne ha
ue_layout_changed (string as_layout_json)Le pieghe sono cambiate — un gesto, un ordine del vostro codice (of_collapse_all compreso), un nuovo documento, of_set_layout: as_layout_json è la disposizione intera, come la dà of_get_layout, pronta da salvare. Un cambio di selezione o di scorrimento non lo solleva
ue_selection_changed (string as_path)La selezione si è spostata senza clic, dall'utente o dal vostro codice: frecce, Inizio/Fine, Pag su/giù, of_select_path, un passo di of_find_xpath, o una piega che nasconde la riga selezionata (la selezione passa sull'elemento piegato). Sollevato solo quando la selezione cambia davvero; un nuovo documento riparte senza selezione e non lo solleva — un clic del mouse riporta ue_node_clicked
ue_search_result (long al_count, long al_index)Una ricerca è partita o avanzata: al_count occorrenze in tutto, la corrente è al_index (da 1, 0 se nessuna) — quanto basta per mostrare « 3 / 12 »; of_find_xpath lo solleva anche (al_count = i nodi trovati), e (0, 0) quando termina; quando una ricerca si chiude (Esc nella casella, of_clear_search, of_reset, ib_search_enabled = false), (0, 0) una volta
ue_error (string as_message)Il testo in is_xml non è un XML valido: il messaggio dice dove, nella lingua di visualizzazione (« XML non valido: riga 3, colonna 16 (…) », il dettaglio del motore tra parentesi), e l'albero mostra il sorgente attorno a quella riga, con la riga errata evidenziata. Sollevato anche quando il documento è troppo grande per essere mostrato

Esempio #

Esplorare una risposta 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

Leggere il valore di un nodo cliccato #

// Instance variable of the window : the answer, loaded ONCE by n_pbt_xml
n_pbt_xml inv_xml

// open event of the window : n_pbt_xml is created once, owned by the window
inv_xml = create n_pbt_xml
inv_xml.ipo_owner = this

// When the answer arrives : the tree shows it, n_pbt_xml loads the same text once
uo_xml.is_xml = inv_rest.of_response_text()
inv_xml.of_load(/*xml*/ inv_rest.of_response_text())

// ue_node_clicked of uo_xml : the value at the clicked path, nothing loaded again
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()

Cercare parole intere, maiuscole comprese #

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

Mantenere le pieghe quando la risposta viene aggiornata #

// Local variables
string ls_layout

// The folds, the selected node and the line at the top, kept before the new text
ls_layout = uo_xml.of_get_layout()
uo_xml.is_xml = inv_rest.of_response_text()

// The same elements fold again ; a path the new text no longer has is ignored
uo_xml.of_set_layout(/*layout_json*/ ls_layout)

Trovare ogni nodo di un XPath #

// Local variables
long ll_found

// Every order line of more than one item : highlighted, the first one selected
ll_found = uo_xml.of_find_xpath(/*xpath*/ "//line[@qty > 1]")

// A Next button walks them, like F3 ; ue_search_result feeds a "2 / 5" status line
if ll_found > 1 then uo_xml.of_search_next()

// What is selected, without a second parser
st_kind.text = uo_xml.of_selected_kind() + " " + uo_xml.of_selected_name()

Un menu su un nodo #

// ue_node_rclicked of uo_xml : the node is selected, open YOUR menu at that point of the screen
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)

// ue_item_selected of uo_menu : copy the XML of the node, or its path for n_pbt_xml
choose case as_keys
	case "copy"
		uo_xml.of_copy()
	case "copypath"
		uo_xml.of_copy_path()
end choose

Buone pratiche #


Ereditato dalla base comune #

Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.

MembriRuoloDescritto in
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà
is_accessible_name · is_accessible_descriptionIl nome e la descrizione che dice un lettore di schermo3.4 Proprietà ed event opzionali

← Riferimento dei componenti · Sommario della guida