PBToolboxAI v4 ← Site

xmltree — u_pbt_xmltree #

← Komponentenreferenz · Inhalt des Handbuchs

xmltree zeigt einen XML-Wert als einklappbaren Baum, farbcodiert: ein Konfigurationsbildschirm, eine API-Antwort, ein Integrations-Debug. Sie setzen den XML-Text in is_xml, die Komponente zeigt ihn; ein Klick auf einen Knoten meldet seinen Pfad (ue_node_clicked), ungültiges XML löst ue_error aus. Sie ändert nichts: sie ist ein BETRACHTER.

▶ Live sehen — Demoanwendung, Kachel XML tree, mit dem Code und dieser Seite nebeneinander.


Auf einen Blick #

Userobjectu_pbt_xmltree
EingabeDer XML-Text, in is_xml (eine Zeichenkette)
Ein-/AusklappenJedes Element über seine Markierung + / − in der Zeilennummernspalte, über seinen Pfad (of_expand_path, of_collapse_path), oder alle auf einmal (of_expand_all, of_collapse_all)
RückmeldungEin Klick auf einen Knoten gibt seinen Pfad (ue_node_clicked), einen XPath, den n_pbt_xml unverändert liest: /order/lines/line[2], /order/@id für ein Attribut, /order/comment()[1] für einen Kommentar — jede Zeile hat ihren eigenen; ungültiges XML löst ue_error aus und zeigt die Quelle, die fehlerhafte Zeile markiert
TreueJeder Knoten an seinem Platz, in Dokumentreihenfolge: Text zwischen zwei Kindern, CDATA-Abschnitte, Kommentare, Verarbeitungsanweisungen, die XML-Deklaration

Schnellstart #

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

Eigenschaften #

EigenschaftTypStandardBeschreibung
is_xmlstring""Der anzuzeigende XML-Text, gelesen und als Baum dargestellt: jeder Knoten an seinem Platz. Leer leert den Baum, ohne Fehler; ungültiges XML löst ue_error aus und zeigt die Quelle um die fehlerhafte Zeile. Wird genau so zurückgelesen, wie er gesetzt wurde, auch ein ungültiger Text
ib_wrapbooleantrueLange Zeilen brechen um (true, Standard) oder bleiben mit horizontaler Bildlaufleiste auf einer Zeile (false) — ein Code-Editor-Gefühl
ib_search_enabledbooleantrueStrg+F im Baum öffnet ein Suchfeld — dieselbe Suche wie of_search: Tippen hebt hervor, Enter oder F3 nächster, Umschalt+Enter oder Umschalt+F3 vorheriger, Esc schließt. false überlässt das Kürzel einer Anwendung, die aus ihrem eigenen Feld sucht. Das Feld trägt vor dem Zähler zwei Schalter, Aa (ib_find_match_case) und ab (ib_find_whole_word); eine geänderte Option startet die laufende Suche ab ihrem ersten Vorkommen neu
ib_find_match_casebooleanfalseSuchoption: findet nur Text mit derselben Groß-/Kleinschreibung. Der Schalter Aa des Suchfelds (Strg+F) ist derselbe Schalter; gilt für of_search und für das, was der Benutzer tippt. Live gelesen; of_reset setzt sie auf false zurück
ib_find_whole_wordbooleanfalseSuchoption: findet den Text nur als ganzes Wort (ein Buchstabe, eine Ziffer oder ein _ daneben gehört zum Wort: id wird weder in user_id noch in ids gefunden). Der Schalter ab des Suchfelds ist derselbe Schalter. Live gelesen; of_reset setzt sie auf false zurück
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Methoden #

MethodeBeschreibung
of_expand_all ( ) → longKlappt jedes Element auf. Kein ue_node_toggled: Keine Geste öffnet den ganzen Baum auf einmal. Gibt 0 zurück, -2 wenn die Komponente nicht erzeugt ist
of_collapse_all ( ) → longKlappt jedes verschachtelte Element ein (die Wurzel bleibt sichtbar). Eine von einer Faltung verdeckte Auswahl springt auf das eingeklappte Element, und ue_selection_changed meldet es. Kein ue_node_toggled: Keine Geste klappt den ganzen Baum auf einmal ein. Gibt 0 zurück, -2 wenn die Komponente nicht erzeugt ist
of_clear ( ) → longLeert den Baum (wie is_xml = ""); ib_wrap, ib_search_enabled, ib_find_match_case und ib_find_whole_word behalten ihren Wert (of_reset setzt jede Eigenschaft zurück). Gibt 0 zurück, -2 wenn die Komponente nicht erzeugt ist
of_expand_to_level ( long al_level ) → longZeigt den Baum bis al_level: Elemente in dieser Tiefe oder tiefer klappen zu (1 = die direkten Kinder der Wurzel, 0 klappt die Wurzel). Kein ue_node_toggled; eine Auswahl, die es auf ein eingeklapptes Element verschiebt, löst ue_selection_changed aus
of_expand_path ( string as_path ) → longÖffnet EIN Element über seinen Pfad — jeden XPath, wie of_select_path — und die Elemente darüber, damit es sichtbar ist. Wie seine Markierung + löst es ue_node_toggled für das Element und für jedes eingeklappte Element darüber aus, das unterwegs aufgeht (nichts für ein schon offenes Element). Liefert 0, -5, wenn kein Element mit Kindern passt, -2, wenn die Komponente nicht erzeugt ist
of_collapse_path ( string as_path ) → longKlappt EIN Element über seinen Pfad ein (jeder XPath). Wie seine Markierung − löst es ue_node_toggled aus, wenn das Element offen war, und ue_selection_changed, wenn die Auswahl auf es übergehen muss. Liefert 0, -5, wenn kein Element mit Kindern passt, -2, wenn die Komponente nicht erzeugt ist
of_is_expanded ( string as_path ) → booleantrue, wenn das Element unter diesem Pfad (jeder XPath) geöffnet ist, LIVE gelesen; false, wenn es eingeklappt ist, und für einen Knoten ohne Kinder oder einen Pfad, der nichts findet. Genug, um zu speichern, was der Benutzer geöffnet hat, und es wiederherzustellen
of_search ( string as_query ) → longHebt jedes Vorkommen hervor (standardmäßig ohne Groß-/Kleinschreibung — siehe ib_find_match_case —, nur ganze Wörter mit ib_find_whole_word) und springt zum ersten; nur die Elemente, die das AKTUELLE Vorkommen verbergen, öffnen sich, und of_clear_search klappt sie wieder ein. ue_search_result sagt, wie viele. Gesucht wird im Text, wie er ANGEZEIGT wird: & wird so gefunden, wie es geschrieben steht. Eine leere Anfrage ist of_clear_search. Das Suchfeld öffnet sich mit der Anfrage darin und dem Fokus darauf (dasselbe wie Strg+F): Eingabe springt zum nächsten; mit ib_search_enabled auf false hebt der Baum nur hervor
of_search_next ( ) → longSpringt zum NÄCHSTEN Treffer (nach dem letzten wieder zum ersten); ue_search_result meldet die neue Position
of_search_prev ( ) → longSpringt zum VORHERIGEN Treffer (vor dem ersten wieder zum letzten); ue_search_result meldet die neue Position
of_clear_search ( ) → longLöscht die Suche: keine Hervorhebung und kein aktueller Treffer mehr (of_match_count gibt 0), das Suchfeld leert und schließt sich, und die Elemente, die die Suche geöffnet hatte, klappen wie vorher wieder ein. Gibt 0 zurück, oder einen negativen Code
of_select_path ( string as_path ) → longWählt den Knoten bei as_path aus und scrollt zu ihm,; wie die Tastatur löst es ue_selection_changed aus (nichts, wenn der Knoten schon ausgewählt ist); die eingeklappten Elemente, die ihn verbergen, öffnen sich. as_path ist JEDER XPath 1.0, der einen Knoten des Baums bezeichnet: ein Pfad, wie der Baum ihn liefert (/order/@id), //line[@sku='A'], /order/lines/line[1], ein anderes Präfix, das an denselben Namensraum gebunden ist; der erste gefundene Knoten wird ausgewählt, und of_selected_path gibt danach den Pfad des Baums. Gibt 0 zurück, -5 wenn kein Knoten des Baums passt (die Auswahl bleibt), -2 wenn die Komponente nicht erzeugt ist
of_selected_path ( ) → stringDer Pfad des ausgewählten Knotens, LIVE gelesen: ein XPath-1.0-Pfad, unverändert an n_pbt_xml.of_get_value auf demselben Dokument zu übergeben. JEDE Zeile hat ihren eigenen: /order/lines/line[2], wenn sich ein Name wiederholt, /order/@id für ein Attribut, /p/text()[2] für einen Text, /order/comment()[1], /order/processing-instruction('x')[1], /comment()[1] vor der Wurzel. Ein Element in einem STANDARD-Namensraum wird *[local-name()='Body'] geschrieben — ein bloßer Name findet in XPath nichts; ein Name mit Präfix (soap:Body) bleibt erhalten, wenn sein Präfix denselben Namensraum bezeichnet, sonst nennt der Schritt auch den Namensraum (namespace-uri()). Ein schließendes Tag gibt sein Element. Leer, wenn nichts ausgewählt ist, und für die XML-Deklaration oder den DOCTYPE (keine Knoten)
of_selected_value ( ) → stringDer Wert der Auswahl, LIVE gelesen und dekodiert — was n_pbt_xml.of_get_value bei of_selected_path liest: der Wert eines Attributs, der Text eines BLATT-Elements (CDATA eingeschlossen, Leerzeichen erhalten), der Text einer Textzeile, eines Kommentars oder einer Verarbeitungsanweisung. Leer für ein Element mit Kindern oder ohne Auswahl
of_selected_xml ( ) → stringDas XML des ausgewählten Knotens, LIVE gelesen: ein Element mit allem, was es enthält, ein Attribut als name="value", ein Text maskiert, ein Kommentar, ein CDATA oder eine Verarbeitungsanweisung wie geschrieben — was man aus einem XML-Editor kopiert. Leer ohne Auswahl
of_copy ( ) → longLegt das XML der Auswahl in die Zwischenablage, wie Strg+C im Baum (der Text von of_selected_xml). Liefert 0, -4, wenn nichts ausgewählt ist, -2, wenn die Komponente nicht erzeugt ist
of_match_count ( ) → longGibt die Anzahl der VORKOMMEN der aktuellen Suche zurück (zwei auf einer Zeile zählen zwei), LIVE gelesen — die 12 einer Statuszeile 3 / 12. 0 ohne Suche
of_match_index ( ) → longLiefert die 1-basierte Position des aktuellen Treffers, LIVE gelesen — die 3 einer Statuszeile 3 / 12. 0 ohne Treffer

Ereignisse #

EreignisWann
ue_node_clicked (string as_path)Der Benutzer hat einen Knoten angeklickt oder Eingabe auf einem ausgewählten Blatt gedrückt: sein XPath (/order/lines/line[2]); ein Attribut, ein Text, ein Kommentar oder eine Verarbeitungsanweisung gibt den eigenen (/order/@id, /order/comment()[1]), ein schließendes Tag sein Element. An n_pbt_xml.of_get_value auf demselben Dokument zu übergeben
ue_node_toggled (string as_path, boolean ab_expanded)Ein Element wurde eingeklappt (ab_expanded = false) oder geöffnet (true): vom Benutzer (seine Markierung + / −, die Pfeile, Eingabe oder Leertaste) oder von of_expand_path / of_collapse_path. of_expand_all, of_collapse_all und of_expand_to_level lösen es nicht aus: Keine Geste klappt den ganzen Baum ein
ue_selection_changed (string as_path)Die Auswahl hat sich ohne Klick bewegt, durch den Benutzer oder Ihren Code: Pfeile, Pos1/Ende, Bild auf/ab, of_select_path, oder eine Faltung, die die ausgewählte Zeile verbirgt (die Auswahl springt auf das eingeklappte Element). Nur ausgelöst, wenn sich die Auswahl wirklich ändert — ein Mausklick meldet ue_node_clicked
ue_search_result (long al_count, long al_index)Eine Suche hat begonnen oder ist weitergegangen: al_count Vorkommen insgesamt, das aktuelle ist al_index (ab 1, 0 wenn keines) — genug, um „3 / 12“ anzuzeigen
ue_error (string as_message)Der Text in is_xml ist kein gültiges XML: die Meldung sagt wo, in der Anzeigesprache („Ungültiges XML : Zeile 3, Spalte 16 (…)“, das Detail der Engine in Klammern), und der Baum zeigt die Quelle um diese Zeile, die fehlerhafte markiert. Auch ausgelöst, wenn das Dokument zu groß zum Anzeigen ist

Beispiel #

Eine API-Antwort erkunden #

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

Den Wert eines angeklickten Knotens lesen #

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

Ganze Wörter suchen, Groß-/Kleinschreibung beachtet #

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

Bewährte Praxis #


Vom gemeinsamen Sockel geerbt #

Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.

MitgliederRolleBeschrieben in
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine

← Komponentenreferenz · Inhalt des Handbuchs