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 sollevaue_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 #
| Userobject | u_pbt_xmltree |
| Ingresso | Il testo XML, in is_xml (una stringa) |
| Piega / dispiega | Ogni 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) |
| Ritorno | Un 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à | Tipo | Predefinito | Descrizione |
|---|---|---|---|
is_xml | string | "" | 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 |
ib_wrap | boolean | true | Le righe lunghe vanno a capo (true, predefinito) o restano su una riga con barra orizzontale (false) — un aspetto da editor di codice |
ib_search_enabled | boolean | true | Ctrl+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 due pulsanti prima del contatore, Aa (ib_find_match_case) e ab (ib_find_whole_word); cambiare un'opzione rilancia la ricerca in corso dalla sua prima occorrenza |
ib_find_match_case | boolean | false | Opzione 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_word | boolean | false | Opzione 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 |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sul componente |
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip avanzato (markup avanzato accettato) |
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato |
Metodi #
| Metodo | Descrizione |
|---|---|
of_expand_all ( ) → long | Dispiega 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 ( ) → long | Piega 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 ( ) → long | Svuota 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 ) → long | Mostra 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 |
of_expand_path ( string as_path ) → long | Apre 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 ) → long | Piega 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 ) → boolean | true 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_search ( string as_query ) → long | Evidenzia 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: & si trova come è scritto. Una query vuota è of_clear_search. 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 |
of_search_next ( ) → long | Passa alla corrispondenza SUCCESSIVA (torna alla prima dopo l'ultima); ue_search_result riporta la nuova posizione |
of_search_prev ( ) → long | Passa alla corrispondenza PRECEDENTE (torna all'ultima prima della prima); ue_search_result riporta la nuova posizione |
of_clear_search ( ) → long | Cancella la ricerca: 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_select_path ( string as_path ) → long | Seleziona 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, 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 ( ) → string | Il 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 ( ) → string | Il 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. Vuoto per un elemento con figli, o senza selezione |
of_selected_xml ( ) → string | Il 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_copy ( ) → long | Mette il XML della selezione negli appunti, come Ctrl+C nell'albero (il testo di of_selected_xml). Restituisce 0, -4 se nulla è selezionato, -2 se il componente non è creato |
of_match_count ( ) → long | Rende 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 ( ) → long | Rende la posizione (1-based) della corrispondenza corrente, letta DAL VIVO — il 3 di una barra di stato 3 / 12. 0 senza corrispondenza |
Eventi #
| Evento | Quando |
|---|---|
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_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, o una piega che nasconde la riga selezionata (la selezione passa sull'elemento piegato). Sollevato solo quando la selezione cambia davvero — 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 » |
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 #
// 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()
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")
Buone pratiche #
- È un visualizzatore, non un editor: mostra il XML, non lo cambia. Per leggere un valore, passa il percorso di
ue_node_clickedan_pbt_xml.of_get_valuesullo stesso testo, oppure leggiof_selected_value. - Un XML grande resta fluido: si disegnano solo le righe a schermo, un'esportazione di diverse migliaia di righe si scorre con la tastiera senza attese. Prima
of_collapse_allresta la cosa più leggibile. - Un XML non valido non rompe nulla:
ue_errorlo dice (con la riga e la colonna dell'errore, nella lingua di visualizzazione), e l'albero mostra il sorgente attorno alla riga errata. È il ritorno da mostrare, non un crash. - Uno spazio dei nomi predefinito (
xmlns="urn:…", una risposta SOAP): il percorso si scrive*[local-name()='Body'], l'unica forma che un XPath senza prefisso registrato sa leggere; un prefisso ridichiarato con un altro URI, o un fratello con lo stesso nome in un altro spazio, si scrive*[local-name()='x' and namespace-uri()='urn:…'].@xml:langsi legge così com'è. Una dichiarazionexmlnssi vede ma non ha percorso: XPath non la vede come un attributo. - Ciò che si vede è XML: il valore di un attributo mantiene le virgolette e gli a capo codificati (
), un testo i suoi&e<e gli spazi significativi; spariscono solo gli a capo di impaginazione attorno a un testo. - Da tastiera: le frecce passano di riga in riga, Freccia destra percorre gli attributi di un tag prima di scendere, Pag giù avanza di una schermata (una sezione CDATA di trecento righe conta per la sua altezza), Ctrl+C copia il XML della selezione.
- Da destra a sinistra: un documento XML è un testo da sinistra a destra, l'albero resta tale in un'applicazione RTL (solo la casella di ricerca segue la direzione dell'applicazione).
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.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |