PBToolboxAI v5 ← 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. Ein neues Dokument beginnt ohne Auswahl, alles geöffnet: of_get_layout davor und of_set_layout danach behalten, was der Benutzer geöffnet hatte
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 drei Schalter, Aa (ib_find_match_case), ab (ib_find_whole_word) und & (ib_find_decoded); 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
ib_find_decodedbooleanfalseSuchoption: sucht in den decodierten WERTEN — ein Text und ein Attributwert, gelesen wie n_pbt_xml sie liest (Durand & Co findet Durand &amp; Co, x < y findet x &lt; y); die Hervorhebung deckt das ganze Escape ab. false sucht im Text, wie er angezeigt wird. Der Schalter & 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. Gibt 0 zurück, -2 wenn die Komponente nicht erzeugt ist
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_get_layout ( ) → stringDie Anordnung des Baums, LIVE gelesen, als zu speichernder JSON-Text: die eingeklappten Elemente (collapsed, oder expanded, wenn diese Liste kürzer ist — jedes Element, das sie nicht nennt, ist dann eingeklappt), der ausgewählte Pfad (selected, null ohne Auswahl) und die oberste Zeile der Ansicht (top, ein Pfad, nie Pixel). An of_set_layout zurückgeben, auch nach einem neuen Dokument
of_set_layout ( string as_layout_json ) → longGibt dem Baum eine von of_get_layout gelieferte Anordnung zurück: die Faltungen (ein Pfad, den das Dokument nicht mehr hat, wird ignoriert, ein neues Element behält seine Vorgabe), die Auswahl (ue_selection_changed, wie of_select_path) und die oberste Zeile. ue_layout_changed folgt einmal, wenn sich die Faltungen geändert haben. Liefert 0, -5, wenn der Text kein JSON-Objekt ist, -2, wenn die Komponente nicht erzeugt ist
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: in einem Text steht Durand & Co als Durand &amp; Co und wird so gesucht (ein CDATA-Abschnitt zeigt es unverändert) — mit ib_find_decoded in den decodierten Werten, wo Durand & Co beide findet. Eine leere Anfrage ist of_clear_search; eine Suche beendet ein of_find_xpath. 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. Gibt 0 zurück, oder einen negativen Code
of_search_next ( ) → longSpringt zum NÄCHSTEN Treffer (nach dem letzten wieder zum ersten); während eines of_find_xpath zum nächsten Knoten, der ausgewählt wird. ue_search_result meldet die neue Position. Gibt 0 zurück, oder einen negativen Code
of_search_prev ( ) → longSpringt zum VORHERIGEN Treffer (vor dem ersten wieder zum letzten); während eines of_find_xpath zum vorherigen Knoten, der ausgewählt wird. ue_search_result meldet die neue Position. Gibt 0 zurück, oder einen negativen Code
of_clear_search ( ) → longLöscht die Suche oder das of_find_xpath: 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_find_xpath ( string as_xpath ) → longHebt JEDEN Knoten des Baums hervor, den ein XPath trifft (//line, //line[@qty > 1], //@sku), und wählt den ersten aus; of_search_next / of_search_prev (und F3) durchlaufen sie, jeder ausgewählt, und ue_search_result zählt sie. Eine Textsuche, of_clear_search, Strg+F oder ein neues Dokument beendet es. Liefert die Zahl der gefundenen Knoten (0, wenn keiner), -5, wenn der Text kein XPath von Knoten ist (ein Syntaxfehler, eine Zahl wie count(…), ein unbekanntes Präfix), -2, wenn die Komponente nicht erzeugt ist. Ein leerer Text ist of_clear_search
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, den der Baum ZEIGT, wird ausgewählt (ein Leerraum des Layouts hat keine Zeile), 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; ein als <x/> gezeigtes Element, das nur Zeilenumbrüche enthält, liefert sie, wie n_pbt_xml. 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_selected_kind ( ) → stringWas der ausgewählte Knoten ist, LIVE gelesen: KIND_ELEMENT, KIND_ATTRIBUTE, KIND_TEXT, KIND_CDATA, KIND_COMMENT, KIND_PI (eine Verarbeitungsanweisung), KIND_DECLARATION (die XML-Deklaration) oder KIND_DOCTYPE. Leer ohne Auswahl
of_selected_name ( ) → stringDer qualifizierte Name des ausgewählten Knotens, LIVE gelesen: ein Element oder ein Attribut wie geschrieben (soap:Body, id), das Ziel einer Verarbeitungsanweisung. Leer für einen Text, ein CDATA, einen Kommentar, die Deklaration, den DOCTYPE oder ohne Auswahl
of_selected_namespace ( ) → stringDie Namensraum-URI des ausgewählten Elements oder Attributs, LIVE gelesen (http://schemas.xmlsoap.org/soap/envelope/). Leer, wenn es keine hat (ein Attribut ohne Präfix hat keine), für jeden anderen Knoten oder ohne Auswahl
of_copy ( ) → longLegt das XML der Auswahl in die Zwischenablage, wie Strg+C im Baum (der Text von of_selected_xml); ein mit der Maus markiertes Textstück kopiert Strg+C so, wie es ist. Liefert 0, -4, wenn nichts ausgewählt ist, -2, wenn die Komponente nicht erzeugt ist
of_copy_path ( ) → longLegt den PFAD des ausgewählten Knotens in die Zwischenablage (/order/lines/line[2], /order/@id), ein XPath bereit für n_pbt_xml. Liefert 0, -4, wenn nichts ausgewählt ist oder der Knoten keinen Pfad hat (die XML-Deklaration, der DOCTYPE), -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_node_rclicked (string as_path, long al_x, long al_y)Rechtsklick auf einen Knoten oder Menütaste (Umschalt+F10) im Baum: der Knoten wird zuerst ausgewählt (ue_selection_changed, wenn sich die Auswahl bewegt hat), as_path ist sein Pfad, al_x / al_y der Punkt auf dem BILDSCHIRM, in Pixeln. Öffnen Sie dort Ihr eigenes Menü (ein u_pbt_contextmenu): der Baum hat keines
ue_layout_changed (string as_layout_json)Die Faltungen haben sich geändert — eine Geste, ein Befehl Ihres Codes (of_collapse_all eingeschlossen), ein neues Dokument, of_set_layout: as_layout_json ist die ganze Anordnung, wie of_get_layout sie liefert, bereit zum Speichern. Eine Änderung der Auswahl oder des Bildlaufs löst es nicht aus
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, ein Schritt von of_find_xpath 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 neues Dokument beginnt ohne Auswahl und löst es nicht aus — 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; of_find_xpath löst es auch aus (al_count = die gefundenen Knoten), und (0, 0), wenn es endet; wenn sich eine Suche schließt (Esc im Suchfeld, of_clear_search, of_reset, ib_search_enabled = false), einmal (0, 0)
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 #

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

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

Die Faltungen behalten, wenn die Antwort aktualisiert wird #

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

Jeden Knoten eines XPath finden #

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

Ein Menü auf einem Knoten #

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

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
is_accessible_name · is_accessible_descriptionName und Beschreibung, die ein Bildschirmleser sagt3.4 Optionale Eigenschaften und Events

← Komponentenreferenz · Inhalt des Handbuchs