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. 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_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 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_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 |
ib_find_decoded | boolean | false | Opzione di ricerca: cerca nei VALORI decodificati — un testo e un valore di attributo letti come li legge n_pbt_xml (Durand & Co trova Durand & Co, x < y trova x < 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_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. Rende 0, -2 se il componente non è creato |
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_get_layout ( ) → string | La 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 ) → long | Restituisce 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 ) → 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: in un testo, Durand & Co è scritto Durand & 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 ( ) → long | Passa 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 ( ) → long | Passa 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 ( ) → long | Cancella 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 ) → long | Evidenzia 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 ) → 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 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 ( ) → 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; 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 ( ) → 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_selected_kind ( ) → string | Che 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 ( ) → string | Il 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 ( ) → string | L'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 ( ) → long | Mette 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 ( ) → long | Mette 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 ( ) → 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_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 #
- È 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. Uno spazio tra due figli (lo spazio di<b>x</b> <i>y</i>) ha una riga sua, mostrata ␠: fa parte del 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à |
is_accessible_name · is_accessible_description | Il nome e la descrizione che dice un lettore di schermo | 3.4 Proprietà ed event opzionali |