xml — n_pbt_xml #
← Riferimento dei componenti · Sommario della guida
Scrivere un XML elemento per elemento — aperture, attributi, testo, chiusure — con l'escaping fatto per te, poi rileggerne uno con vero XPath:
of_load,of_get_value,of_get_attr,of_count. PowerBuilder 10 non ha un parser XML; questo si appoggia a DOMParser e document.evaluate del motore WebView2, chiamati in modo sincrono.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro XML: i risultati, il codice che li produce e questa pagina, fianco a fianco.
In breve #
Il lato build è PowerScript puro (assemblare una stringa non richiede motore). Il lato lettura apre una pagina nascosta alla prima query. L'XPath è la versione 1.0, come la valuta il browser.
Avvio rapido #
n_pbt_xml lnv_xml
// Read : load, then query with XPath
lnv_xml.of_load('<order id="4152"><customer>Ada</customer></order>')
IF lnv_xml.of_is_valid() THEN
MessageBox("Customer", lnv_xml.of_get_value("/order/customer")) // Ada
MessageBox("Id", lnv_xml.of_get_attr("/order", "id")) // 4152
END IF
// Build : element by element, escaping done for you
lnv_xml.of_clear()
lnv_xml.of_start_element("order")
lnv_xml.of_element_attr("id", "4152")
lnv_xml.of_leaf("customer", "Ada & Co")
lnv_xml.of_end_element()
// lnv_xml.of_xml() -> <order id="4152"><customer>Ada & Co</customer></order>
Proprietà #
| Membro | Ruolo |
|---|---|
string is_last_error | Perché l'ultima lettura ha reso vuoto o un codice negativo: documento non valido, XPath senza corrispondenza, limite demo. Vuoto dopo un successo |
Costruire un documento #
| Membro | Ruolo |
|---|---|
of_start_element (string as_name) | Apre un elemento (gli elementi si annidano: un tag aperto viene chiuso prima) |
of_element_attr (string as_name, string as_value) | Aggiunge un attributo all'elemento aperto, valore con escaping (prima di figli o testo) |
of_element_text (string as_text) | Il contenuto testuale dell'elemento corrente, con escaping |
of_end_element ( ) | Chiude l'elemento corrente (vuoto, si auto-chiude <name/>) |
of_leaf (string as_name, string as_text) | Un elemento foglia in una chiamata — <name>testo</name>, con escaping |
of_clear ( ) → long | Svuota il builder per un altro documento. Restituisce 0 |
of_xml ( ) → string | Il documento così com'è: ciò che hai costruito o caricato (of_load), dopo ogni modifica — l'unica uscita, da inviare, memorizzare o riscrivere. Un documento costruito non necessita di pagina (ogni elemento aperto è chiuso) ; uno caricato è serializzato dal motore. of_pretty è la forma indentata |
Leggere un documento (XPath) #
| Membro | Ruolo |
|---|---|
of_load (string as_xml) → long | Carica un testo XML (analizzato dal DOMParser del motore). Restituisce 0 se ben formato, -5 se vuoto, -4 se XML non valido, -2 se la pagina nascosta fallisce |
of_is_valid ( ) → boolean | Vero quando l'ultimo of_load è riuscito e un documento è caricato |
of_exists (string as_xpath) → boolean | Vero quando l'XPath corrisponde ad almeno un nodo |
of_get_value (string as_xpath) → string | Il contenuto testuale del PRIMO nodo corrispondente. Vuoto se nessuno |
of_get_attr (string as_xpath, string as_name) → string | Il valore dell'attributo as_name sul primo nodo corrispondente. Vuoto se assente |
of_count (string as_xpath) → long | Quanti nodi l'XPath seleziona. 0 se nessuno (un conteggio XPath non è mai negativo) |
of_name (string as_xpath) → string | Il nome del tag del primo nodo corrispondente. Vuoto se nessuno |
of_pretty ( ) → string | Il documento così com'è — costruito o caricato, ciò che rende of_xml — re-indentato per la lettura. Vuoto se non c'è nulla, o se un documento costruito non è ben formato |
Più nodi, e il documento #
| Membro | Ruolo |
|---|---|
of_get_values (string as_xpath, ref string as_values[]) → long | Il contenuto testuale di OGNI nodo corrispondente, in as_values; restituisce il conteggio. Dove of_get_value rende solo il primo |
of_get_attrs (string as_xpath, string as_name, ref string as_values[]) → long | Il valore dell'attributo as_name su OGNI nodo corrispondente (l'id di ogni riga); restituisce il conteggio |
of_get_attr_names (string as_xpath, ref string as_names[]) → long | I nomi di tutti gli attributi del primo nodo corrispondente (enumerazione); restituisce il conteggio |
Modificare un documento #
Il lato scrittura cambia l'albero caricato sul posto; of_xml ne rende il risultato. Ognuna mira al PRIMO nodo corrispondente (tranne of_remove, che li prende tutti), rende 0 al successo, -4 se nulla corrisponde, -5 su argomento vuoto.
| Membro | Ruolo |
|---|---|
of_set_value (string as_xpath, string as_text) → long | Imposta il testo del primo nodo corrispondente (i suoi figli sono sostituiti) |
of_set_attr (string as_xpath, string as_name, string as_value) → long | Imposta (o aggiunge) un attributo sul primo nodo corrispondente |
of_remove_attr (string as_xpath, string as_name) → long | Rimuove un attributo dal primo nodo corrispondente |
of_add_child (string as_xpath, string as_tag, string as_text) → long | Aggiunge un elemento figlio <as_tag>as_text</as_tag> sotto il primo nodo corrispondente (il figlio eredita il namespace del padre) |
of_add_xml (string as_xpath, string as_fragment) → long | Innesta un frammento XML già formato (uno o più elementi fratelli) sotto il primo nodo corrispondente — ciò che of_add_child non può fare, prendendo solo un tag e un testo. Il frammento deve essere ben formato e dichiarare il namespace che usa |
of_remove (string as_xpath) → long | Rimuove OGNI nodo corrispondente (una riga, un ramo obsoleto). Rende quanti ne sono stati rimossi (mai negativo) |
Namespace e XSLT #
Un XPath con prefisso (SOAP, un'API aziendale) non corrisponde a nulla senza un resolver: of_register_namespace lega il prefisso al suo URI, of_clear_namespaces li dimentica tutti. of_transform applica un foglio XSLT — il motore ha XSLTProcessor, PowerBuilder 10 non ha nulla di simile.
| Membro | Ruolo |
|---|---|
of_register_namespace (string as_prefix, string as_uri) → long | Lega un prefisso all'URI del suo namespace, perché un XPath con prefisso (/s:Envelope) si risolva. Restituisce 0, o -5 su un prefisso vuoto. I legami durano fino a of_clear_namespaces o of_reset |
of_clear_namespaces ( ) → long | Dimentica tutti i prefissi registrati: un XPath con prefisso non corrisponde più a nulla finché un prefisso non è legato. Restituisce 0 |
of_transform (string as_xslt) → string | Trasforma il documento caricato con un foglio XSLT e restituisce il risultato come testo. Vuoto se nulla è caricato o se il foglio non è XML valido |
// A SOAP response : bind the prefix, then query it
lnv_xml.of_load(ls_soap)
lnv_xml.of_register_namespace("s", "http://schemas.xmlsoap.org/soap/envelope/")
ls_ok = lnv_xml.of_get_value("//s:Body/result/status")
// Mutate, then read the result back
lnv_xml.of_set_value("/order/customer", "Grace")
lnv_xml.of_add_child("/order", "total", "690.50")
// Graft a whole fragment at once (of_add_child adds only one tag)
lnv_xml.of_add_xml("/order", "<lines><line sku=\"1\">A</line><line sku=\"2\">B</line></lines>")
ls_out = lnv_xml.of_xml()
La pagina nascosta #
| Membro | Ruolo |
|---|---|
of_open ( ) → long | Crea la pagina nascosta (lato lettura). Facoltativo — la prima lettura lo fa. Restituisce l'handle (> 0) o un codice negativo |
of_is_open ( ) → boolean | Vero appena la pagina nascosta esiste |
of_close ( ) | Rilascia la pagina nascosta. Il build continua senza. Fatto per te alla distruzione |
of_reset ( ) | Ritorno ai valori predefiniti: il builder svuotato, lo stato di lettura azzerato |
Ambito. L'XML si legge tramite il motore (DOMParser, XPath):
n_pbt_xmlapre una pagina nascosta alla prima lettura, a differenza di json, che analizza in PowerScript puro. Per mostrare un XML come albero comprimibile, vedi xmltree.