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östue_erroraus. Sie ändert nichts: sie ist ein BETRACHTER.
▶ Live sehen — Demoanwendung, Kachel XML tree, mit dem Code und dieser Seite nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_xmltree |
| Eingabe | Der XML-Text, in is_xml (eine Zeichenkette) |
| Ein-/Ausklappen | Jedes 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ückmeldung | Ein 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 |
| Treue | Jeder 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 #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
is_xml | string | "" | 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_wrap | boolean | true | Lange Zeilen brechen um (true, Standard) oder bleiben mit horizontaler Bildlaufleiste auf einer Zeile (false) — ein Code-Editor-Gefühl |
ib_search_enabled | boolean | true | Strg+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_case | boolean | false | Suchoption: 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_word | boolean | false | Suchoption: 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_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
is_tooltip | string | "" | Einfacher Tooltip beim Überfahren der Komponente |
is_super_tooltip_title | string | "" | Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip) |
is_super_tooltip_text | string | "" | Text des erweiterten Tooltips (Rich-Markup zulässig) |
is_super_tooltip_image | string | "" | Bild des erweiterten Tooltips |
Methoden #
| Methode | Beschreibung |
|---|---|
of_expand_all ( ) → long | Klappt 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 ( ) → long | Klappt 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 ( ) → long | Leert 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 ) → long | Zeigt 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 ) → long | Klappt 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 ) → boolean | true, 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 ) → long | Hebt 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 ( ) → long | Springt zum NÄCHSTEN Treffer (nach dem letzten wieder zum ersten); ue_search_result meldet die neue Position |
of_search_prev ( ) → long | Springt zum VORHERIGEN Treffer (vor dem ersten wieder zum letzten); ue_search_result meldet die neue Position |
of_clear_search ( ) → long | Lö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 ) → long | Wä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 ( ) → string | Der 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 ( ) → string | Der 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 ( ) → string | Das 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 ( ) → long | Legt 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 ( ) → long | Gibt 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 ( ) → long | Liefert die 1-basierte Position des aktuellen Treffers, LIVE gelesen — die 3 einer Statuszeile 3 / 12. 0 ohne Treffer |
Ereignisse #
| Ereignis | Wann |
|---|---|
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 #
- Es ist ein Betrachter, kein Editor: er zeigt das XML, er ändert es nicht. Um einen Wert zu lesen, übergeben Sie den Pfad aus
ue_node_clickedann_pbt_xml.of_get_valueauf demselben Text, oder lesen Sieof_selected_value. - Ein großes XML bleibt flüssig: nur die Zeilen auf dem Bildschirm werden gezeichnet, ein Export von mehreren tausend Zeilen lässt sich ohne Wartezeit mit der Tastatur durchlaufen. Zuerst
of_collapse_allbleibt am lesbarsten. - Ungültiges XML bricht nichts:
ue_errorsagt es (mit Zeile und Spalte des Fehlers, in der Anzeigesprache), und der Baum zeigt die Quelle um die fehlerhafte Zeile. Das ist die zu zeigende Rückmeldung, kein Absturz. - Ein Standard-Namensraum (
xmlns="urn:…", eine SOAP-Antwort): der Pfad wird*[local-name()='Body']geschrieben, die einzige Form, die ein XPath ohne registriertes Präfix lesen kann; ein mit anderer URI erneut deklariertes Präfix oder ein gleichnamiges Geschwister in einem anderen Namensraum wird*[local-name()='x' and namespace-uri()='urn:…']geschrieben.@xml:langwird unverändert gelesen. Einexmlns-Deklaration wird angezeigt, hat aber keinen Pfad: XPath sieht sie nicht als Attribut. - Was angezeigt wird, ist XML: ein Attributwert behält seine Anführungszeichen und seine kodierten Zeilenumbrüche (
), ein Text seine&und<und seine bedeutsamen Leerzeichen; nur die Layout-Zeilenumbrüche um einen Text entfallen. - Mit der Tastatur: die Pfeile gehen von Zeile zu Zeile, Pfeil rechts durchläuft die Attribute eines Tags, bevor er absteigt, Bild ab springt um einen Bildschirm (ein CDATA-Abschnitt von dreihundert Zeilen zählt mit seiner Höhe), Strg+C kopiert das XML der Auswahl.
- Von rechts nach links: ein XML-Dokument ist ein Text von links nach rechts, der Baum bleibt so in einer RTL-Anwendung (nur das Suchfeld folgt der Richtung der Anwendung).
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.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |