LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam

Oggi ho deciso di continuare un po 'l'argomento di lavorare con XML-RPC in WordPress. Come di solito mi capita, l'idea è nata nel momento di leggere un blog a caso, mi è venuto in mente di guardare a lavorare con i post del blog e, allo stesso tempo, provare a scrivere qualcosa che si adattasse alle mie esigenze.

Naturalmente oggi non posterò il programma, ma nel post saranno presenti alcuni calcoli, elenchi e idee.

Ho brevemente esaminato il lavoro con XML-RPC nel post “” Oggi proveremo ad andare avanti nel nostro lavoro e utilizzeremo diversi metodi correlati per ottenere determinate informazioni dal blog.

Ci concretizziamo obiettivo per oggi: è necessario ottenere dati sui post del blog utilizzando i metodi disponibili dall'API di WordPress.

Per raggiungere questo obiettivo, abbiamo bisogno dei seguenti moduli Delphi: XMLIntf , xmldom , XMLDoc e biblioteca sinapce o componente Indy idHTTP (a chiunque voglia).

1. Testare la connessione al blog.

Credo che la prima cosa da fare sia controllare che il blog funzioni correttamente per i seguenti possibili errori:

  1. Il blog ha disabilitato la possibilità di utilizzare XML-RPC
  2. L'utente ha fornito dati errati (url, nome utente o password).

Per testare la possibilità di lavorare con XML-RPC in un blog, basta usare il metodo demo.sayHello... Se la risposta è la linea "Ciao", quindi tutto è in ordine e puoi procedere alla fase successiva del controllo. Per eseguire questo controllo, dobbiamo completare tre semplici attività:

  • generare un documento XML valido
  • invia una richiesta al server e ottieni una risposta
  • analizzare la risposta

Formiamo un documento XML che dovrebbe assomigliare a questo:

demo.sayHello test

Per fare ciò, useremo l'interfaccia IXMLDocument:

[...] var doc: IXMLDocument; // root del documento: IXMLNode; // il nodo radice inizia ereditato Crea; doc: \u003d NewXMLDocument (); // crea un documento vuoto Radice: \u003d Doc. CreateElement ("methodCall", ""); // aggiunge il nodo radice Doc. DocumentElement: \u003d Root; Radice. AddChild ("methodName"). NodeValue: \u003d "demo.sayHello"; // aggiunge il nome del metodo Radice. AddChild ("params"). AddChild ("param"). AddChild ("valore"). AddChild ("string"). NodeValue: \u003d "test"; // scrive i parametri del metodo [ ... ]

Poiché il documento XML in sé è abbastanza semplice, mi sono preso la libertà di un po 'di "congelamento" e con l'ultima riga di codice ho annotato tutti i nodi e il valore dell'unico parametro per il nostro metodo contemporaneamente.
Ora puoi inviare il documento al server e ottenere una risposta:

[...] con THTTPSend. Crea inizia Doc. SaveToStream (documento); // scrive il documento nel corpo della richiesta se HTTPMethod ("POST", aURL) inizia // richiesta inviata con successo e ha ricevuto una risposta fine altrimenti inizio // richiesta fallita fine; fine; [...]

Quello che mi piace di Synapce, quindi questo è che "movimenti del corpo" non necessari non sono richiesti in termini di riempimento delle intestazioni Lunghezza del contenuto, Tipo di contenuto e così via. Ovviamente nessuno si preoccupa di riempire da soli tutti i titoli possibili, ma puoi farlo come ho mostrato sopra - tutto è automatico.
Andando avanti, analizzando la risposta.
Lascia che te lo ricordi l'invio riuscito di una richiesta al server non significa che abbiamo avuto accesso con successo all'XML-RPC del blog. L'invio corretto di una richiesta indica solo che abbiamo inviato una richiesta e ricevuto una risposta, ma non sappiamo cosa sia o meno nella risposta..
Per non preoccuparmi di metodi e metodi non necessari per analizzare la risposta dal server, propongo in questo caso di smetterla con un semplice controllo:

[...] Doc. LoadFromStream (Document, xetUTF_8); // ha scritto un documento XML se Doc. DocumentElement. ChildNodes. FindNode ("fault") \u003d nil quindi ShowMessage ( "XML-RPC funziona correttamente") [ ... ]

Secondo la specifica XML-RPC, i messaggi di errore sono contenuti in un nodo denominato fault. Pertanto, nel nostro caso, è sufficiente verificare la presenza di un tale nodo nel documento XML di risposta: se non è presente, la verifica è andata a buon fine, è stata generata una richiesta corretta e XML-RPC funziona correttamente.
Passando al passaggio successivo: verificare la correttezza dei dati forniti dall'utente e la capacità dell'utente di lavorare con l'XML-RPC del blog.
Solo l'amministratore può lavorare con l'XML-RPC del blog, quindi è necessario scoprire chi sta tentando di accedere. Per questo usiamo il metodo wp.getUsersBlogs... I parametri del metodo sono login e password.
Ma prima di iniziare a inviare una richiesta e ricevere una risposta, penso che valga la pena pensare un po 'al futuro e provvedere a lavorare con errori, generare documenti, ecc.
Nel controllo precedente, si potrebbe dire, c'erano coccole - la versione più semplice del lavoro del tipo:
inviato / ricevuto / qui_zhe_disassemblato / dimenticato / andato_further.
Dal momento che ho intenzione di sviluppare il modulo per lavorare con l'API di WordPress in futuro, ha senso decidere i seguenti punti del lavoro:

  1. Forma uno "scheletro" del documento
  2. Scrivi tutti i parametri necessari nel documento, tenendo conto dei tipi di dati
  3. Invia una richiesta e ricevi una risposta dal server
  4. Analizza la risposta e, se la risposta contiene un messaggio di errore, leggila correttamente

Ho eseguito tutti questi quattro passaggi come metodi di classe separati. Per "scheletro" del documento, intendo il seguente contenuto:

MethodName

Ovvero, la parte del documento contenente il nome del metodo e il nodo params nessun contenuto. Inoltre, resta solo da compilare correttamente l'elenco dei parametri. Cosa faremo adesso.

In totale, XML-RPC prevede l'utilizzo di sei semplici tipi di dati:

  1. int e i4 sono numeri interi)
  2. numeri doppi frazionari
  3. string - stringhe
  4. base64 - stringa codificata
  5. dateTime.iso8601 - data / ora
  6. booleano

Iniziamo un nuovo tipo di dati:

TSimpleType \u003d (tsInt, tsI4, tsString, tsDouble, tsDateTime, tsBase64, tsBoolean);

Utilizzando i valori di questo tipo, definiremo il tag per il valore del parametro.

Poiché le operazioni di creazione di uno "scheletro" di un documento e l'aggiunta di parametri di metodo sono separate da funzioni diverse, creeremo un altro tipo di dati ausiliario:

PXMLDocument \u003d ^ IXMLDocument;

Ora il metodo per aggiungere un parametro al documento stesso:

procedura TBlog. SetParam (SimpleType: TSimpleType; Valore: stringa; Documento: PXMLDocument); var Root: IXMLNode; inizia se Documento ^. IsEmptyDoc quindi Exit; // il documento è vuoto Root: \u003d Document ^. DocumentElement. ChildNodes. FindNode ("params"); se Root \u003d nil allora Exit; // nodo non trovato caso SimpleType di tsInt: Root. AddChild ("param"). AddChild ("valore"). AddChild ("int"). NodeValue: \u003d Value; tsI4: radice. AddChild ("param"). AddChild ("valore"). AddChild ("i4"). NodeValue: \u003d Value; tsString: Root. AddChild ("param"). AddChild ("valore"). AddChild ("string"). NodeValue: \u003d Value; tsDouble: Root. AddChild ("param"). AddChild ("valore"). AddChild ("double"). NodeValue: \u003d Value; tsDateTime: Root. AddChild ("param"). AddChild ("valore"). AddChild ("dateTime.iso8601"). NodeValue: \u003d Value; tsBase64: radice. AddChild ("param"). AddChild ("valore"). AddChild ("base64"). NodeValue: \u003d Value; tsBoolean: radice. AddChild ("param"). AddChild ("valore"). AddChild ("boolean"). NodeValue: \u003d Value; fine; fine;

Questo metodo funziona solo per un record di tipo semplice. Quando si lavora con le strutture, è necessario perfezionare l'algoritmo.

Ora sull'analisi dei messaggi di errore. Diamo un'occhiata a un esempio di come appare un messaggio di errore in XML-RPC:

faultCode 403 faultString Combinazione di accesso / passaggio errata.

Il messaggio di errore ci arriva nella struttura. Inoltre, se assumiamo che i tag membrosono numerati da zero, quindi ogni elemento della struttura pari è un codice di errore e uno dispari è un testo di errore. Pertanto, il metodo per la gestione dei messaggi di errore potrebbe essere simile al seguente:

funzione TBlog. ParseErrors (aDocument: PXMLDocument): TStringList; var i: intero; Elenco: IDOMNodeList; codice: stringa; elenco di inizio: \u003d aDocument ^. DOMDocument. getElementsByTagName ("membro"); Risultato: \u003d TStringList. Creare; per i: \u003d 0 alla lista. length - 1 do begin case i mod 2 of 0: code: \u003d (List. item [i]. lastChild. firstChild as IDOMNodeEx). testo; // even element - leggi il codice di errore 1 : // elemento dispari: leggi il testo dell'errore e scrivi il risultato Risultato. Aggiungi (codice + "" + (List. Item [i]. LastChild. FirstChild as IDOMNodeEx). Text); fine; fine; fine;

Qui il codice di errore e il testo vengono scritti in TStringList. Penso che se necessario, puoi facilmente leggere il codice e il testo in elenchi o array diversi. Non ne abbiamo ancora bisogno.

Abbiamo già considerato l'invio di un documento, quindi presento immediatamente un metodo per verificare la correttezza dei dati:

funzione TBlog. CheckUserAccess (const aURL, aUser, aPassword: string; var Error: string): boolean; var Doc: IXMLDocument; iniziare Doc: \u003d GetDocument ("wp.getUsersBlogs"); // ha creato uno "scheletro" // aggiungi parametri SetParam (tsString, aUser, @ Doc); SetParam (tsString, aPassword, @ Doc); SendQuery (@ Doc, aURL); // invia una richiesta se non doc. IsEmptyDoc quindi // se il documento è stato scritto correttamente iniziare se Doc. DocumentElement. ChildNodes. FindNode ("fault") ‹› nil then // c'è un messaggio di errore inizio Risultato: \u003d falso; Errore: \u003d ParseErrors (@ Doc). Stringhe [0]; end else Risultato: \u003d true; end else Risultato: \u003d false; fine;

Se viene ricevuto un messaggio di errore, scrivere il messaggio nella variabile Error. In questo caso, la struttura contiene solo un messaggio di errore, ecco perché l'ho scritto così facilmente:

Errore: \u003d ParseErrors (@ Doc). Stringhe [0];

Quindi, sono stati effettuati due controlli e abbiamo stabilito che XML-RPC è abilitato e funziona correttamente e che l'utente ha inserito le informazioni di login e password corrette e può lavorare con l'API di WordPress. Qual è il prossimo? E poi iniziamo il lavoro principale: otteniamo dati sui commenti nel blog.

2. Ottenere dati sui post del blog.

Allora, cos'è WordPress a nostra disposizione. Innanzitutto, esaminiamo brevemente i metodi da xmlrpc.php.

wp.getPostStatusList - visualizza i valori per lo stato del post. Infatti, l'output avrà quattro righe: "bozza", "in sospeso", "privato", "pubblica".

Anche se questo metodo è inutile per noi.

blogger.getRecentPosts - Questa funzionalità è già dell'API di Blogger, ma è supportata in WordPress. L'output sarà l'ultimo post del blog, incluso tutto il contenuto del post.

Puoi usare il metodo, MA il lavoro del programma sarà rallentato in quanto dovrai “trascinare” l'intero post sul Web. E se proviamo a ottenere un elenco completo dei post del blog, allora, a quanto pare, dobbiamo andare a letto senza aspettare il risultato. Pertanto, per ora lasciamo da parte il metodo.

metaWeblog.getRecentPosts - simile al metodo precedente.

mt.getRecentPostTitles - metodo dall'API MovableType. A giudicare dal nome, di cosa abbiamo bisogno. Vedere la descrizione del metodo.

Il metodo restituisce un elenco contenente i titoli dei post del blog. In questo caso, il contenuto non viene scritto nell'elenco.

Parametri di input:

  • Stringa blogid
  • Nome utente stringa
  • Password stringa
  • int numberOfPosts

blogid sempre 1 (vedi descrizione in xmlrpc.php)

numberOfPosts - il numero di posti da elencare. Se il parametro ha un valore maggiore del numero di post del blog, il metodo restituisce un elenco di tutti i post.

Resta da scoprire qual è questa lista. E in uscita avremo una serie di strutture, che include:

  • data di creazione dell'articolo
  • iD utente
  • postid
  • titolo.

Meraviglioso. Useremo questo metodo e allo stesso tempo impareremo come analizzare strutture di risposta complesse.

Non credo valga la pena scrivere sulla creazione di una richiesta. La procedura è la stessa descritta sopra. Soffermiamoci sull'analisi della risposta del server in dettaglio. Abbiamo scoperto come appare il tipo di struttura durante l'analisi di una risposta contenente un errore di autorizzazione. Vediamo cos'è un array.

Gli array non hanno nome e sono descritti da un tag ... Contiene un oggetto e uno o più figli dove sono impostati i dati. Qualsiasi altro tipo in un ordine arbitrario, così come altri array, può agire come elementi di array, il che consente di descrivere array multidimensionali. Puoi anche descrivere una serie di strutture. Ad esempio, un array di quattro elementi sarebbe simile a questo:

34 Ciao mondo! 0 -34

Alla nostra uscita dal metodo mt.getRecentPostTitles
conterrà matrice di strutturee una struttura è costituita dalle informazioni su un post del blog. Pertanto, la lettura dei dati sui post del blog può essere suddivisa approssimativamente nei seguenti passaggi:

  1. Estrai tutti gli elementi dal documento XML ... Primogenito. childNodes; // ha ottenuto tutti i membri per 1 valore per j: \u003d 0 ai membri. length - 1 inizia con Result [i] do case j di 0: dateCreated: \u003d (Members [j]. lastChild. firstChild as IDOMNodeEx). testo; 1: user_id: \u003d StrToInt ((Members [j]. LastChild. FirstChild as IDOMNodeEx). Text); 2: id: \u003d StrToInt ((Members [j]. LastChild. FirstChild as IDOMNodeEx). Text); 3: title: \u003d (Members [j]. LastChild. FirstChild come IDOMNodeEx). testo; fine; fine; fine; [...]

    Di conseguenza, se viene ricevuto un messaggio di errore, è possibile utilizzare la funzione discussa in precedenza.

    È tutto per oggi. La prossima volta continueremo a lavorare con l'API e proveremo a ottenere tutti i commenti dal blog.

XML è sempre più utilizzato per memorizzare informazioni e scambiarle tra applicazioni e siti Web. Molte applicazioni utilizzano questo linguaggio come lingua di base per la memorizzazione dei dati, mentre altre lo utilizzano per esportare e importare dati XML. Quindi è tempo che gli sviluppatori pensino a come utilizzare i dati XML nelle proprie applicazioni.

In questo articolo, esamineremo il DOM (Document Object Model) XML e l'implementazione di XML DOM da parte di Microsoft.

XML DOM è un modello a oggetti che fornisce allo sviluppatore oggetti per il caricamento e l'elaborazione di file XML. Il modello a oggetti è costituito dai seguenti oggetti principali: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap e XMLDOMParseError. Ciascuno di questi oggetti (eccetto XMLDOMParseError) contiene proprietà e metodi che consentono di ottenere informazioni sull'oggetto, manipolare i valori e la struttura dell'oggetto e navigare nella struttura di un documento XML.

Diamo un'occhiata ai principali oggetti XML DOM e mostriamo alcuni esempi del loro utilizzo in Borland Delphi.

Utilizzo di XML DOM in Borland Delphi

Per utilizzare Microsoft XML DOM nelle applicazioni Delphi, è necessario collegare la libreria dei tipi appropriata al progetto. Per fare ciò, eseguiamo il comando Project | Importa libreria dei tipi e nella finestra di dialogo Importa libreria dei tipi, seleziona la libreria Microsoft XML versione 2.0 (Versione 2.0), che di solito si trova nel file Windows \\ System \\ MSXML.DLL

Dopo aver fatto clic sul pulsante Crea unità, verrà creato il modulo di interfaccia MSXML_TLB, che ci permetterà di utilizzare gli oggetti XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest e numerosi altri, implementati nella libreria MSXML.DLL. Il riferimento al modulo MSXML_TLB deve essere nell'elenco Uses.

Dispositivo XML DOM

Il Document Object Model rappresenta un documento XML come una struttura ad albero di rami. Le API XML DOM consentono alle applicazioni di navigare nell'albero del documento e manipolarne i rami. Ogni ramo può avere un tipo specifico (DOMNodeType), in base al quale vengono determinati i rami padre e figlio. La maggior parte dei documenti XML contiene rami di tipo elemento, attributo e testo. Gli attributi sono un tipo speciale di ramo e non sono rami figlio. Gli attributi vengono manipolati utilizzando metodi speciali forniti dagli oggetti XML DOM.

Oltre a implementare le interfacce consigliate dal World Wide Web Consortium (W3C), Microsoft XML DOM contiene metodi che supportano XSL, modelli XSL, spazi dei nomi e tipi di dati. Ad esempio, il metodo SelectNodes consente di utilizzare la sintassi del pattern XSL per trovare rami in un contesto specifico e il metodo TransformNode supporta l'utilizzo di XSL per eseguire le trasformazioni.

Prova documento XML

Come documento XML di esempio, prendi una directory di CD-ROM musicale, che ha la seguente struttura:

Impero burlesque Bob Dylan Stati Uniti d'America Columbia 10.90 1985 Nascondi il tuo cuore Bonnie tylor UK Record CBS 9.90 1988 ... Libera il mio cuore Joe cocker Stati Uniti d'America EMI 8.20 1987

Siamo ora pronti per iniziare a guardare il modello a oggetti XML DOM, iniziando con l'oggetto XMLDOMDocument.

Documento XML - Oggetto XMLDOMDocument

Lavorare con un documento XML inizia con il suo caricamento. Per fare ciò, utilizziamo il metodo Load, che ha un solo parametro che specifica l'URL del documento caricato. Quando si caricano file da un disco locale, viene specificato solo il nome file completo (in questo caso il protocollo file: /// può essere omesso). Se il documento XML è archiviato come stringa, utilizzare il metodo LoadXML per caricare quel documento.

La proprietà Async viene utilizzata per controllare la modalità di caricamento del documento (sincrono o asincrono). Per impostazione predefinita, questa proprietà è True, a indicare che il documento viene caricato in modo asincrono e il controllo viene restituito all'applicazione prima che il documento sia completamente caricato. In caso contrario, il documento viene caricato in modo sincrono e quindi è necessario controllare il valore della proprietà ReadyState per vedere se il documento è stato caricato o meno. È inoltre possibile creare un gestore eventi per l'evento OnReadyStateChange che assumerà il controllo quando il valore della proprietà ReadyState cambia.

Di seguito viene mostrato come caricare un documento XML utilizzando il metodo Load:

Utilizza ... MSXML_TLB ... procedura TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; iniziare XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); // // Qui è dove il codice // manipola il documento XML e le sue diramazioni // XMLDoc: \u003d Nil; fine;

Dopo che il documento è stato caricato, possiamo accedere alle sue proprietà. Pertanto, la proprietà NodeName conterrà il valore #document, la proprietà NodeTypeString conterrà il valore del documento e la proprietà URL conterrà il valore file: /// C: /DATA/DATA.xml.

Gestione degli errori

Di particolare interesse sono le proprietà associate all'elaborazione del documento durante il caricamento. Ad esempio, la proprietà ParseError restituisce un oggetto XMLDOMParseError contenente informazioni su un errore che si è verificato durante l'elaborazione del documento.

Per scrivere un gestore degli errori, puoi aggiungere il codice seguente:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); XMLError: \u003d XMLDoc.ParseError; Se XMLError.ErrorCode<> 0 Allora // // Qui gestiamo l'errore // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: \u003d Nil;

Per vedere quali informazioni vengono restituite in caso di errore, modificare la seguente voce di directory:

Impero burlesque Bob Dylan Stati Uniti d'America Columbia 10.90 1985

rimuovere l'elemento di chiusura sulla seconda riga:</p><p> <CD> <TITLE>Impero burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Stati Uniti d'America</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Ora scriviamo il codice che restituisce i valori delle proprietà dell'oggetto XMLDOMParseError:</p><p>XMLError: \u003d XMLDoc.ParseError; Se XMLError.ErrorCode<> 0 Quindi con XMLError, Memo1.Lines inizia con Add ("File:" + URL); Aggiungi ("Codice:" + IntToStr (ErrorCode)); Aggiungi ("Errore:" + motivo); Aggiungi ("Testo:" + SrcText); Aggiungi ("Riga:" + IntToStr (Riga)); Aggiungi ("Posizione:" + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Fine;</p><p>ed eseguire la nostra applicazione. Di conseguenza, otteniamo le seguenti informazioni sull'errore.</p> <p>Come puoi vedere dall'esempio precedente, le informazioni restituite dall'oggetto XMLDOMParseError sono sufficienti per localizzare l'errore e comprendere la causa del suo verificarsi.</p> <p>Ora ripristineremo l'elemento di chiusura <TITLE> nel nostro documento e continuare la nostra discussione sul DOM XML.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Accesso all'albero dei documenti</h2> <p>Per accedere all'albero del documento, puoi ottenere l'elemento radice e quindi iterare sui suoi rami figli o trovare un ramo specifico. Nel primo caso, otteniamo l'elemento root tramite la proprietà DocumentElement, che restituisce un oggetto di tipo XMLDOMNode. Ecco come utilizzare la proprietà DocumentElement per ottenere il contenuto di ogni elemento figlio:</p><p>Nodo Var: IXMLDOMNode; Radice: IXMLDOMElement; I: numero intero; ... Root: \u003d XMLDoc.DocumentElement; Per I: \u003d 0 a Root.ChildNodes.Length-1 do Begin Node: \u003d Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Fine;</p><p>Per il nostro documento XML, otteniamo il testo seguente.</p> <p>Se siamo interessati a un ramo specifico o un ramo sotto il primo ramo figlio, possiamo utilizzare il metodo NodeFromID o il metodo GetElementByTagName dell'oggetto XMLDOMDocument.</p> <p>Il metodo NodeFromID richiede un identificatore univoco come definito nello schema XML o nella DTD (Document Type Definition) e restituisce un ramo con tale identificatore.</p> <p>Il metodo GetElementByTagName richiede una stringa con un elemento specifico (tag) e restituisce tutti i rami con questo elemento. Ecco come utilizzare questo metodo per trovare tutti gli artisti nella nostra directory CD-ROM:</p><p>Nodi: IXMLDOMNodeList; Nodo: IXMLDOMNode; ... Nodi: \u003d XMLDoc.GetElementsByTagName ("ARTIST"); Per I: \u003d 0 a Nodes.Length-1 do Begin Node: \u003d Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Fine;</p><p>Per il nostro documento XML, otterremo il testo seguente</p> <p>Si noti che il metodo SelectNodes dell'oggetto XMLDOMNode fornisce un modo più flessibile per accedere ai rami del documento. Ma ne parleremo più avanti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Ramo documento - Oggetto XMLDOMNode</h2> <p>L'oggetto XMLDOMNode rappresenta un ramo del documento. Abbiamo già riscontrato questo oggetto durante il recupero dell'elemento radice del documento:</p><p>Radice: \u003d XMLDoc.DocumentElement;</p><p>Per ottenere informazioni su un ramo di un documento XML, è possibile utilizzare le proprietà dell'oggetto XMLDOMNode (Tabella 1).</p> <p>Per accedere ai dati archiviati in un ramo, è comune utilizzare la proprietà NodeValue (disponibile per attributi, rami di testo, commenti, istruzioni di elaborazione e sezioni CDATA) o la proprietà Text, che restituisce il contenuto di testo del ramo o la proprietà NodeTypedValue. Quest'ultimo, tuttavia, può essere utilizzato solo per rami con elementi dattiloscritti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> Navigazione nella struttura ad albero del documento</h3> <p>L'oggetto XMLDOMNode fornisce molti modi per navigare nella struttura ad albero del documento. Ad esempio, per accedere al ramo padre, utilizzare la proprietà ParentNode (tipo XMLDOMNode), accedere ai rami figlio tramite le proprietà ChildNodes (tipo XMLDOMNodeList), FirstChild e LastChild (tipo XMLDOMNode), ecc. La proprietà OwnerDocument restituisce un oggetto XMLDOMDocument che identifica il documento XML stesso. Le proprietà elencate sopra facilitano la navigazione nell'albero del documento.</p> <p>Ora iteriamo su tutti i rami del documento XML:</p><p>Radice: \u003d XMLDoc.DocumentElement; Per I: \u003d 0 a Root.ChildNodes.Length-1 do Begin Node: \u003d Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); Fine;</p><p>Come notato sopra, i SelectNodes dell'oggetto XMLDOMNode forniscono un modo più flessibile per accedere ai rami del documento. Inoltre, esiste un metodo SelectSingleNode che restituisce solo il primo ramo del documento. Entrambi questi metodi consentono di definire modelli XSL per le ricerche nei rami.</p> <p>Diamo un'occhiata al processo di utilizzo del metodo SelectNodes per recuperare tutti i rami che hanno un ramo CD e un ramo secondario PRICE:</p><p>Radice: \u003d XMLDoc.DocumentElement; Nodi: \u003d Root.SelectNodes ("CD / PRICE");</p><p>Tutti i rami secondari PRICE del ramo CD verranno inseriti nella raccolta Nodes. Torneremo un po 'più tardi a discutere dei modelli XSL.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> Manipolazione dei rami figli</h3> <p>Per manipolare i rami figli, possiamo usare i metodi dell'oggetto XMLDOMNode (Tabella 2).</p> <p>Per eliminare completamente il record relativo al primo disco, è necessario eseguire il codice seguente:</p><p>Var XMLDoc: IXMLDOMDocument; Radice: IXMLDOMNode; Nodo: IXMLDOMNode; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); // Recupera l'elemento radice Root: \u003d XMLDoc.DocumentElement; Nodo: \u003d Root; // Rimuove il primo ramo figlio Node.RemoveChild (Node.FirstChild);</p><p>Nota che in questo esempio stiamo eliminando il primo ramo figlio. Di seguito viene mostrato come rimuovere il primo elemento del primo ramo figlio:</p><p>Var XMLDoc: IXMLDOMDocument; Radice: IXMLDOMNode; Nodo: IXMLDOMNode; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); // Recupera l'elemento radice Root: \u003d XMLDoc.DocumentElement; // e il primo ramo figlio Node: \u003d Root.FirstChild; // Rimuove il primo ramo figlio Node.RemoveChild (Node.FirstChild);</p><p>Nell'esempio precedente, non abbiamo eliminato il primo ramo <CD>…</CD>e il primo elemento del ramo è <TITLE>….

Ora aggiungiamo un nuovo ramo. Di seguito è riportato il codice che mostra come aggiungere una nuova voce CD-ROM musicale:

Var NewNode: IXMLDOMNode; Figlio: IXMLDOMNode; ... // Crea un nuovo ramo - NewNode: \u003d XMLDoc.CreateNode (1, "CD", ""); // Aggiungi un elemento Figlio: \u003d XMLDoc.CreateNode (1, "TITLE", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "Pink Floyd"; // Aggiungi un elemento <ARTIST> Figlio: \u003d XMLDoc.CreateNode (1, "ARTIST", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "Division Bell"; // Aggiungi un elemento <COUNTRY> Figlio: \u003d XMLDoc.CreateNode (1, "COUNTRY", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "UK"; // Aggiungi un elemento <COMPANY> Child: \u003d XMLDoc.CreateNode (1, "COMPANY", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "EMI Records Ltd."; // Aggiungi un elemento <PRICE>Figlio: \u003d XMLDoc.CreateNode (1, "PRICE", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d '11 .99 "; // Aggiungi un elemento <YEAR> Figlio: \u003d XMLDoc.CreateNode (1, "YEAR", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "1994"; // E aggiunge un ramo Root.AppendChild (NewNode); ...</p><p>Il codice sopra mostra i seguenti passaggi per l'aggiunta di un nuovo ramo:</p> <ul><li>Creazione di un nuovo ramo utilizzando il metodo CreateNode: <ul><li>creazione di un elemento utilizzando il metodo CreateNode;</li> <li>aggiunta di un elemento a un ramo utilizzando il metodo AppendChild;</li> <li>impostare il valore di un elemento tramite la proprietà Text;</li> <li>… Ripeti per tutti gli elementi.</li> </ul></li> <li>Aggiunta di un nuovo ramo al documento utilizzando il metodo AppendChild.</li> </ul><p>Ricorda che il metodo AppendChild aggiunge un ramo alla fine dell'albero. Per aggiungere un ramo a un punto specifico dell'albero, è necessario utilizzare il metodo InsertBefore.</p> <h2> Set di diramazioni: oggetto XMLDOMNodeList</h2> <p>L'oggetto XMLNodeList contiene un elenco di rami, che possono essere creati utilizzando i metodi SelectNodes o GetElementsByTagName e ottenuti anche dalla proprietà ChildNodes.</p> <p>Abbiamo già discusso l'uso di questo oggetto nell'esempio fornito nella sezione "Navigazione nell'albero del documento". Qui forniremo anche alcuni commenti teorici.</p> <p>Il numero di rami nell'elenco può essere ottenuto come valore della proprietà Length. I rami sono indicizzati da 0 a Lunghezza-1 e ogni singolo ramo è accessibile tramite l'elemento indicizzato corrispondente nell'array Item.</p> <p>La navigazione nell'elenco dei rami può essere eseguita anche con il metodo NextNode, che restituisce il ramo successivo nell'elenco, o Nil se il ramo corrente è l'ultimo. Per tornare all'inizio dell'elenco, chiama il metodo Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Crea e salva documenti</h2> <p>Quindi, abbiamo spiegato come aggiungere rami ed elementi a documenti XML esistenti. Ora creiamo un documento XML al volo. Prima di tutto, ricorda che un documento può essere caricato non solo da un URL, ma anche da una stringa normale. Di seguito viene mostrato come creare un elemento radice, che può quindi essere utilizzato per costruire dinamicamente il resto degli elementi (di cui abbiamo già parlato nella sezione "Manipolazione dei rami figli"):</p><p>Var XMLDoc: IXMLDOMDocument; Radice: IXMLDOMNode; Nodo: IXMLDOMNode; S: WideString; ... S: \u003d ' <CATALOG></CATALOG>'; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.LoadXML (S); Radice: \u003d XMLDoc.DocumentElement; Nodo: \u003d XMLDoc.CreateNode (1, "CD", ""); Root.AppendChild (nodo); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: \u003d Nil;</p><p>Dopo aver creato il documento XML, salvalo in un file utilizzando il metodo Save. Per esempio:</p> <p>XMLDoc.Save ('C: \\ DATA \\ NEWCD.XML');</p> <p>Oltre a salvare in un file, il metodo Save consente di salvare un documento XML in un nuovo oggetto XMLDOMDocument. In questo caso, il documento viene completamente elaborato e, di conseguenza, vengono verificate la sua struttura e sintassi. Ecco come salvare un documento su un altro oggetto:</p><p>Procedura TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; iniziare XMLDoc2: \u003d CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: \u003d Nil; fine;</p><p>In conclusione, il metodo Save consente anche di salvare il documento XML su altri oggetti COM che supportano le interfacce IStream, IPersistStream o IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Utilizzo di modelli XSL</h2> <p>Discutendo il metodo SelectNodes dell'oggetto XMLDOMNode, abbiamo detto che fornisce un modo più flessibile per accedere ai rami del documento. La flessibilità è data dalla possibilità di specificare un modello XSL come criterio per la selezione dei rami. Tali modelli forniscono un potente meccanismo per trovare informazioni nei documenti XML. Ad esempio, per ottenere un elenco di tutti i titoli di CD-ROM musicali nella nostra directory, è possibile eseguire la seguente query:</p><p>Per scoprire quali dischi d'artista sono stati rilasciati negli USA, la richiesta è formata come segue:</p><p>Nodi: \u003d Root.SelectNodes ("CD / ARTIST");</p><p>Ecco come trovare la prima unità in una directory:</p><p>Nodi: \u003d Root.SelectNodes ("CD / TITLE");</p><p>e ultimo:</p><p>Nodi: \u003d Root.SelectNodes ("CD / TITLE");</p><p>Per trovare i dischi di Bob Dylan, puoi eseguire la seguente query:</p><p>Nodi: \u003d Root.SelectNodes ("CD [$ any $ ARTIST \u003d" Bob Dylan "] / TITLE");</p><p>e per ottenere un elenco di dischi creati dopo il 1985, eseguiamo la seguente query:</p><p>Nodi: \u003d Root.SelectNodes ("CD / TITLE");</p><p>Una discussione più dettagliata della sintassi XSL richiede una pubblicazione separata. Per incuriosire i lettori e incoraggiare ulteriori ricerche, fornirò solo un piccolo esempio del possibile utilizzo di XSL. Diciamo che dobbiamo convertire il nostro catalogo in una normale tabella HTML. Utilizzando i metodi tradizionali, dobbiamo iterare su tutti i rami dell'albero e per ogni elemento ricevuto formare i tag corrispondenti <TD>…</TD>.</p> <p>Usando XSL, creiamo semplicemente un modello (o foglio di stile) che specifica cosa e come trasformare. Quindi inseriamo questo modello nel nostro catalogo e il gioco è fatto: abbiamo il testo del modello XSL che trasforma il catalogo in una tabella (Listato 2).</p> <p>Il codice per sovrapporre un modello XSL sulla nostra directory è simile a questo:</p><p>Procedura TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; iniziare XSLDoc: \u003d CoDOMDocument.Create; XSLDoc.Load ("C: \\ DATA \\ DATA.xsl"); Memo2.Text: \u003d XMLDoc.TransformNode (XSLDoc); XSLDoc: \u003d Nil; fine;</p><p>Concludendo la nostra discussione su XSL, va detto che attualmente questo linguaggio è attivamente utilizzato per la trasformazione tra vari documenti XML, così come per la formattazione dei documenti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Conclusione</h2> <p>Per ovvie ragioni, è impossibile coprire tutti gli oggetti Microsoft XML DOM e fornire esempi del loro utilizzo in un articolo. Qui abbiamo appena toccato i problemi di base dell'utilizzo di XML DOM nelle applicazioni. tavolo 3 mostra tutti gli oggetti implementati nel Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>Nonostante il fatto che l'argomento del lavoro con XML in Delphi sia stato ampiamente discusso su Internet, le domande su questo argomento spesso sorgono in tutti i tipi di forum. <br></p><p>Ho scritto anche questo, ma vorrei tornare al caso reale di analizzare rapidamente un file XML e recuperare i dati che ho fatto al lavoro oggi. Non ho impiegato più di 5 minuti per ottenere i dati necessari. <br></p><p>Sfondo. Oggi era necessario elaborare i dati sui programmi installati sui computer degli utenti (sì, sì, identifichiamo i pirati :)). Il dipartimento tecnico mi ha fornito queste informazioni strappate da utenti ignari su una rete utilizzando WMI. Il programma utilizzato produce report in formato XML. Di conseguenza, mi hanno portato una montagna di file XML con una struttura piuttosto complessa, da cui ho dovuto solo estrarre il nome dei prodotti software installati. <br><span><br><p>Trattamento. Dopo aver esaminato manualmente un paio di file, mi sono reso conto che non ci sarebbe voluto molto per invecchiare e ho deciso di scrivere un piccolo convertitore. Dopo aver avviato Delphi, ho selezionato l'oggetto XML DataBinding dal repository e gli ho fornito uno dei file. Ho lasciato tutte le impostazioni ei parametri per impostazione predefinita e, di conseguenza, ho ottenuto un modulo con un gran numero di classi e interfacce per accedere agli elementi di questo file XML. Non mi sono preoccupato per molto tempo di occuparmi della struttura delle classi, sono passato subito alla scrittura di un convertitore. <br></p><p>In una nuova applicazione console, ho scritto un codice piuttosto semplice: <br></p> <br>programma XML2TXT;</p><p>usi <br> Forme, <br> Classi, SysUtils, <br> SoftwareXML in "SoftwareXML.pas";</p><p>procedura CovertXML2Text; <br>var <br> softbase: IXMLSTDSoftwareType; <br> i: intero; <br> sr: TSearchRec; <br> CurDir: stringa; <br> ExportFile: TStringList; <br>inizio <br> CurDir: \u003d IncludeTrailingPathDelimiter (ExtractFilePath (Application.ExeName)); <br> se FindFirst (CurDir + "*. xml", faAnyFile, sr) \u003d 0 allora <br> ripetere <br> ExportFile: \u003d TStringList.Create; <br> softbase: \u003d LoadSTDSoftware (Pchar (CurDir + sr.Name)); <br> per i: \u003d 0 a softbase.InstalledSoftware.source.software.Count - 1 do <br> ExportFile.Add (softbase.InstalledSoftware.source.software [i] .DisplayName); <br> ExportFile.Sort; <br> ExportFile.SaveToFile (CurDir + softbase.InstalledSoftware.Source.servername + ". Txt"); <br> ExportFile.Free; <br> fino a FindNext (sr) 0; <br>fine;</p><p>inizio <br> Application.Initialize; <br> CovertXML2Text; <br>fine. <br></p><p>Di conseguenza, ho ottenuto un editor di testo per ogni computer nella griglia, contenente un elenco di software installato. <br></p><p>Ritengo che questo codice richiederà alcune spiegazioni. Ad esempio, perché ho utilizzato il modulo Forms in un'applicazione console e ho chiamato la procedura Application.Initialize;? <br></p><p>In realtà è semplice: questo è un piccolo trucco che ti consente di utilizzare XML Data Binding in un'applicazione console. Perché si rifiutava ostinatamente di inizializzare la classe per lavorare con XML. Non ho ancora capito le vere ragioni - oggi il tempo era importante, ho già passato 4 minuti su 5 a combattere questo errore. :) Penso di affrontare questo problema più tardi e scrivere qual è il vero motivo. <br></p><p>La strana classe softbase è stata creata da un file XML, che era il nome dell'elemento radice, e softbase.InstalledSoftware.source.software [i] .DisplayName è solo la navigazione tra gli elementi nidificati fino a quello desiderato e ottenere il suo valore. <br></p><p>Ecco come appare uno dei modi più veloci per lavorare con XML in Delphi. <br></p> <p>Recentemente, molta attenzione è stata dedicata alla creazione di sistemi di e-business, o come vengono anche chiamati - B2B (business to business). Tenendo conto delle raccomandazioni per la costruzione di sistemi di scambio streaming dell'ente di coordinamento delle tecnologie Internet - Consorzio WWW: l'accento è posto sulle tecnologie XML e sulla costruzione di sistemi per lo scambio di documenti XML.</p> <p>Il vantaggio dell'utilizzo di XML nell'e-business è l'elevata efficienza dei sistemi B2B a bassi costi per la sua creazione grazie a una presentazione chiara e visiva delle informazioni strutturate, la capacità di utilizzare i moderni protocolli di rete e creare sistemi aziendali in tempo reale.</p> <p>L'indipendenza della presentazione delle informazioni sotto forma di documenti XML consente alle diverse società coinvolte nell'e-business di produrre software indipendenti l'una dall'altra.</p> <p>In tutti i sistemi, lo scambio, di regola, è costruito secondo lo stesso schema, utilizzando richieste HTTP. SSL viene utilizzato come protocollo di sicurezza delle informazioni (ma questo è un argomento separato).</p> <p>Una delle possibili opzioni per l'elaborazione dei messaggi XML consiste nel creare applicazioni BIN / CGI (ISAPI) o componenti COM (server) che generano o elaborano documenti XML.</p> <p>Da un lato l'applicazione funge da client, che emette una richiesta HTTP in modalità POST, dall'altro lato c'è un WEB server sul lato del quale viene elaborata la richiesta e viene emessa una risposta. I documenti XML vengono utilizzati nello scambio di informazioni.</p> <p>Una delle opzioni di implementazione più efficienti consiste nell'usare un parser XML esistente che supporti il \u200b\u200bmodello DOM. Tale parser è un pacchetto di distribuzione di Win'98 o parte integrante di IE 4.7 e versioni successive (per Win'95) e rappresenta un server COM situato nella libreria msxml.dll.</p> <p>Component Object Model (COM): rappresenta dati e metodi incapsulati in una singola entità e un modo per accedervi tramite un sistema di interfacce. Utilizzando gli strumenti Delphi, è abbastanza facile accedere alle classi di un oggetto COM (diverse classi possono essere incluse in un server COM). Si accede agli oggetti inizializzando un'istanza di classe tramite il sistema di interfaccia. La descrizione delle interfacce viene effettuata dal linguaggio di definizione dell'interfaccia (IDL), che può essere eseguito automaticamente tramite l'ambiente.</p> <p>Gli strumenti Delphi vengono utilizzati per importare da un server COM <i>msxml.dll</i>, vengono creati i file di descrizione dell'interfaccia IDL e il file della descrizione binaria dei tipi di libreria - TLB. Questa operazione viene eseguita tramite il menu di sistema: <b>Progetto | Tipo di importazione della libreria:</b>(immagine 1). Successivamente, viene visualizzata una finestra di dialogo (Figura 2), in cui è necessario selezionare un oggetto COM (nel nostro caso, l'oggetto è registrato con il nome "Microsoft.XMLDom (Versione 2.0)") e creare un file TLB (pulsante <b>Crea unità</b>). Utilizzando il file TLB, il framework genera un file di descrizione del server COM Pascal - MSXML_TLB.pas</p> <p>Il file MSXML_TLB.pas descrive tutte le interfacce, le costanti e la classe del server COM.</p> <p>Per accedere agli oggetti di un elemento COM, è necessario nella direttiva <b>USI</b>aggiungere il nome del file di descrizione della libreria (MSXML_TLB.pas). Di seguito è riportato un semplice programma che utilizza il parser DOM standard msxml.dll, che carica un documento XML e lo visualizza in un elemento del campo di testo Memo1.</p> <b>usi</b> Windows, messaggi, SysUtils, classi, grafica, controlli, moduli, finestre di dialogo, OleServer, MSXML_TLB, StdCtrls; <b>genere</b> TForm1 \u003d <b>classe</b>(TForm) Button1: TButton; Memo1: TMemo; <b>procedura</b> Button1Click (Sender: TObject); <b> fine;</b> <b>var</b> Form1: TForm1; <b>implementazione</b> ($ R * .DFM) <b>Procedura</b>TForm1.Button1Click (Sender: Tobject); <span> // dichiarazione della soclass dell'oggetto DOMDocument;</span> <b>var</b>coDoc: CoDOMDocument; <span> // classe coerente con l'interfaccia IDOMDocument;</span> <b>var</b>Doc: IXMLDOMDocument; <b>inizio</b> <span> // crea un'istanza dell'oggetto DOMDocument;</span> Doc: \u003d coDoc.Create; <span> // chiama il metodo Load di un'istanza dell'oggetto DOMDocument;</span> Doc.load ("data.xml"); <span> // accesso alla proprietà xml dell'istanza DOMDocument;</span> Memo1.Text: \u003d Doc.xml; <b>fine;</b> <b>fine.</b> <h2>Concetto DOM - Document Object Model</h2> <p>Ogni documento XML è rappresentato come un insieme di più oggetti (classi), con l'aiuto dei quali è possibile accedere a singoli elementi (campi oggetto). DOM: l'interfaccia descrive l'accesso sia a oggetti semplici di tipo DOMString o CharacterData, sia a parti o singoli elementi di un documento XML: DOMFragmentElement, DOMNode, DOMElement.</p> <p>Di seguito sono riportate le proprietà e i metodi più importanti degli oggetti XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Va notato che i metodi e le funzioni degli oggetti DOM presentati di seguito (Document Object Model) sono utilizzati dal parser Microsoft XML msxml.dll e sono un po 'più ampi del modello approvato dal W3C DOM Consortium.</p> <p>Una descrizione più completa dell'interfaccia dell'oggetto DOM può essere trovata su</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> Oggetto XMLDOMDocument</td> </tr><tr><td valign="top" colspan="2">Rappresenta il livello più alto della gerarchia degli oggetti e contiene metodi per lavorare con un documento: caricarlo, analizzarlo, creare elementi, attributi, commenti, ecc. ...</td> </tr><tr><td valign="top" colspan="2"><b>Proprietà</b> </td> </tr><tr><td valign="top" width="39%"><b>Async</b> </td> <td valign="top" width="61%">Proprietà che identifica la modalità di elaborazione corrente</td> </tr><tr><td valign="top" width="39%" height="19"><b>ParseError</b> </td> <td valign="top" width="61%" height="19">Restituisce un riferimento all'oggetto di gestione degli errori XMLDOMParseError</td> </tr><tr><td valign="top" width="39%"><b>Abilita: disabilita la verifica del documento.</b> </td> <td> </td> </tr><tr><td valign="top" width="39%"><b>url</b> </td> <td valign="top" width="61%">Restituisce l'URL del documento</td> </tr><tr><td valign="top" width="39%"><b>documentElement</b> </td> <td valign="top" width="61%">Contiene un riferimento all'elemento radice del documento come oggetto XMLDOMElement.</td> </tr><tr><td valign="top" colspan="2"><b>Metodi</b> </td> </tr><tr><td valign="top" width="39%"><b>caricare (url) <br>loadXML (xmlString)</b> </td> <td valign="top" width="61%">Carica un documento XML,</td> </tr><tr><td valign="top" width="39%"><b>salva (objTarget)</b> </td> <td valign="top" width="61%">Salva il documento XML su file</td> </tr><tr><td valign="top" width="39%"><b>abortire</b> </td> <td valign="top" width="61%">Interruzione del processo di caricamento ed elaborazione del documento.</td> </tr><tr><td valign="top" width="39%"><b>createAttribute (nome)</b> </td> <td valign="top" width="61%">Crea un nuovo attributo con il nome specificato per l'elemento corrente.</td> </tr><tr><td valign="top" width="39%"><b>createNode (Type, name, nameSpaceURI)</b> </td> <td valign="top" width="61%">Crea un nodo del tipo e del nome specificati</td> </tr><tr><td valign="top" width="39%"><b>createElement (tagName)</b> </td> <td valign="top" width="61%">Crea un elemento del documento con il nome specificato.</td> </tr><tr><td valign="top" width="39%"><b>createTextNode (dati)</b> </td> <td valign="top" width="61%">Crea testo all'interno di un documento</td> </tr><tr><td valign="top" width="39%"><b>getElementsByTagName (tagname)</b> </td> <td valign="top" width="61%">Restituisce un riferimento alla raccolta di elementi del documento con il nome specificato</td> </tr><tr><td valign="top" width="39%"><b>nodeFromID (idString)</b> </td> <td valign="top" width="61%">Trovare un articolo per ID</td> </tr></tbody></table><br><table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> <b>Oggetto XMLDOMNode</b> </td> </tr><tr><td valign="top" colspan="2">Oggetto XMLDOMNode che implementa l'interfaccia DOM sottostante <b>Nodo</b>, è inteso per manipolare un nodo separato dell'albero del documento. Le sue proprietà e metodi consentono di ottenere e modificare le informazioni complete sul nodo corrente: tipo, nome, nome completo, contenuto, elenco di elementi figlio, ecc.</td> </tr><tr><td valign="top" colspan="2"><b>Proprietà</b> </td> </tr><tr><td valign="top" width=" "><b>nodeName, baseName</b> </td> <td valign="top" width="65%">Restituisce il nome del nodo corrente.</td> </tr><tr><td valign="top" width="35%"><b>prefisso</b> </td> <td valign="top" width="65%">Restituisce il prefisso dello spazio dei nomi.</td> </tr><tr><td valign="top" width="35%"><b>tipo di dati</b> </td> <td valign="top" width="65%">Specifica il tipo di contenuto del nodo corrente</td> </tr><tr><td valign="top" width="35%"><b>nodeType, nodeTypeString</b> </td> <td valign="top" width="65%">Restituisce il tipo del nodo corrente:</td> </tr><tr><td valign="top" width="35%"><b>attributi</b> </td> <td valign="top" width="65%">Ottiene un elenco degli attributi del nodo corrente come raccolta XMLDOMNamedNodeMap.</td> </tr><tr><td valign="top" width="35%"><b>testo</b> </td> <td valign="top" width="65%">Restituisce il contenuto della sottostruttura corrente come testo</td> </tr><tr><td valign="top" width="35%"><b>xml</b> </td> <td valign="top" width="65%">Restituisce una rappresentazione XML della sottostruttura corrente.</td> </tr><tr><td valign="top" width="35%"><b>nodeValue</b> </td> <td valign="top" width="65%">Restituisce il contenuto del nodo corrente.</td> </tr><tr><td valign="top" width="35%"><b>childNodes</b> </td> <td valign="top" width="65%">Restituisce un elenco di elementi figlio come XMLDOMNodeList.</td> </tr><tr><td valign="top" width="35%"><b>firstChild, lastChild</b> </td> <td valign="top" width="65%">Restituisce il primo / ultimo figlio</td> </tr><tr><td valign="top" width="35%"><b>previousSibling, nextSibling</b> </td> <td valign="top" width="65%">Restituisce l'elemento di pari livello precedente / successivo.</td> </tr><tr><td valign="top" width="35%"><b>parentNode</b> </td> <td valign="top" width="65%">Contiene un collegamento all'elemento padre.</td> </tr><tr><td valign="top" width="35%"><b>ownerDocument</b> </td> <td valign="top" width="65%">Restituisce un puntatore al documento contenente il nodo corrente.</td> </tr><tr><td valign="top" colspan="2"><b>Metodi</b> </td> </tr><tr><td valign="top" width="35%"><b>appendChild (newChild)</b> </td> <td valign="top" width="65%">Aggiunge un nuovo figlio al nodo corrente.</td> </tr><tr><td valign="top" width="35%"><b>insertBefore (newChild, refChild)</b> </td> <td valign="top" width="65%">Inserisce un nodo figlio, posizionandolo nel sottoalbero corrente "a sinistra" del nodo specificato dal parametro refChild.</td> </tr><tr><td valign="top" width="35%"><b>cloneNode (profondo)</b> </td> <td valign="top" width="65%">Crea una copia dell'elemento corrente.</td> </tr><tr><td valign="top" width="35%"><b>getAttribute</b><b>(nome) <br> </b><b>getAttributeNode</b><b><span> (nome) <br>setAttribute (nome, valore) <br>setAttributeNode (XMLDOMAttribute)</span> </b> </td> <td valign="top" width="65%">Accesso agli attributi (creazione, lettura, scrittura) dell'oggetto. Il nome è il nome dell'attributo, il valore è il suo valore. Restituisce un oggetto XMLDOMAttribute.</td> </tr><tr><td valign="top" width="35%"><b>replaceChild (newChild, oldChild) removeChild (oldChild)</b> </td> <td valign="top" width="65%">Sostituzione dell'oggetto oldChild dell'elenco corrente di oggetti figlio con newChild. Eliminazione dell'oggetto oldChild</td> </tr><tr><td valign="top" width="35%"><b>selectNodes (patternString) selectSingleNode (patternString)</b> </td> <td valign="top" width="65%">Restituisce un oggetto XMLDOMNodeList selezionato dal modello di ricerca o dal primo nodo</td> </tr><tr><td valign="top" width="35%"><b>transformNode (foglio di stile) <br>transformNodeToObject (stylesheet, outputObject)</b> </td> <td valign="top" width="65%">Assegna un foglio di stile alla sottostruttura del nodo corrente e restituisce una stringa che è il risultato dell'elaborazione. Il parametro è un riferimento all'oggetto DOMDocument che contiene le istruzioni XSL.</td> </tr></tbody></table><br><h2>Utilizzo di XML negli affari.</h2> <p>Per un'immagine più chiara è necessaria una spiegazione e perché tutto ciò è necessario per capire come funziona:</p> <p>Quando si costruisce un sistema ERP B2B o aziendale, quando si organizza lo scambio di informazioni di documenti XML tra aziende o filiali di pr-I, viene utilizzato un sistema di trasferimento di informazioni efficiente e collaudato basato su server WEB esistenti su protocolli HTTP.</p> <p>Da un lato l'applicazione funge da client, che emette una richiesta HTTP in modalità POST, dall'altro c'è un server WEB, sul lato del quale viene elaborata la richiesta e viene emessa una risposta. I documenti XML vengono utilizzati come scambio.</p> <p>Ad esempio, in un semplice sistema ERP aziendale, un programma di contabilità (ACS Accounting), è necessario formare una richiesta di fattura e inviarla a una filiale che dispone di un magazzino (ACS Warehouse). AWP Una dichiarazione di problema simile durante la creazione di un sistema B2B, quando l'impresa A richiede la disponibilità dei prodotti (effettua un ordine per l'acquisto) dal fornitore B.</p> <p>Enterprise A e il suo programma agiscono come client. Il magazzino è servito dal Fornitore B, che dispone di un complesso di magazzino con un database su un server SQL. Lo scambio viene effettuato tramite il server WEB aziendale del Fornitore V.</p> <p>Di seguito è riportato il seguente algoritmo di scambio tipico:</p> <br>Figura 3. <ol><li><b>Enterprise A</b>inizia <b>processo A</b>(ordine del prodotto), che funge da client WEB.</li><li><b>Processo A</b>genera un documento XML (ad esempio, una richiesta di fattura) e lo trasmette come richiesta HTTP POST al server WEB del Provider B. L'identificativo della risorsa dell'applicazione di elaborazione viene utilizzato come URI. L'URI può essere lo stesso per tutti i tipi di documenti o individuale per ogni tipo. Tutto dipende dalla struttura del server B2B (WEB).</li><li>Il server WEB analizza la richiesta e genera un server <b>Processo B</b>passando il corpo del documento XML come parametro. <br>Il processo B viene avviato da un server WEB e viene elaborato come pagina ASP, applicazione CGI (ISAPI) o server JAVA (applicazione server)</li><li><b>Processo B</b>- genera una query al server di database SQL.</li><li>Il server SQL esegue le operazioni necessarie nel database, genera una risposta e la restituisce <b>Processo B</b>.</li><li>Secondo la risposta del server SQL <b>Processo B</b> genera un documento XML (risposta) e lo restituisce come risposta a una richiesta http all'applicazione client.</li><li>Inoltre, a seconda della situazione sul lato client, viene formata una nuova richiesta http o la sessione termina.</li> </ol><h2>Qualche parola sull'organizzazione del flusso di documenti.</h2> <p>La regola generale per sviluppare un sistema per lo scambio di documenti XML è:</p><ul><li><b>in primo luogo</b>- sviluppo di un diagramma di flusso dei documenti elettronici e della loro struttura;</li><li><b>in secondo luogo</b>- sviluppo di tabelle di funzioni di processo (sottoprocessi), ad es. quale funzione rispetto a quale documento XML ogni processo implementerà.</li> </ul><p>Ogni documento XML, come un documento HTML, deve essere costituito da un'intestazione del messaggio (informazioni racchiuse da tag) e dal corpo del messaggio (per una richiesta, queste informazioni sono racchiuse in tag per rispondere a una richiesta). Affinché il documento XML sia ben formato, è necessario inquadrare le sue due parti componenti "Titolo" e "Richiesta" con tag, ad esempio. Di seguito viene presentato il tipo di documento tipico:</p> <p>L'intestazione (Figura 4), a differenza di un documento HTML, deve contenere vari tipi di informazioni di servizio, comprese le informazioni sul tipo di documento trasmesso e il processo della sua elaborazione. Il corpo del documento entra nell'elaborazione delle informazioni, ad es. contenuto incorniciato da tag. Va notato che la struttura delle intestazioni dovrebbe essere la stessa per tutti i tipi di documenti.</p> <p>Per il Processo avviato dal server, è preferibile (ma non necessario) costruire l'algoritmo di elaborazione come segue:</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128666.jpg' height="500" width="408" loading=lazy><br>Figura 6. <h2>Alcuni punti fondamentali nella creazione del lato client</h2> <p>Come già spiegato, quando si crea un documento XML, viene utilizzata la sua rappresentazione sotto forma di un modello DOM. Di seguito è riportato un esempio di una porzione di testo Delphi di un programma di generazione di intestazioni xml di messaggi.</p> <b>procedura</b>TThread1.HeaderCreate (Sender: Tobject); <b>var</b> <span> // dichiarazione di classe, necessaria per creare</span> coDoc: CoDomDocument; <span> // Oggetto XMLDomDocument</span> Doc: DomDocument; r: IXMLDOMElement; Nodo: IXMLDOMElement; // DOMText txt: IXMLDOMText; // DOMAttribute attr: IXMLDOMAttribute; <b>inizio</b> <span> // crea un documento DOM</span> Doc: \u003d coDoc.Create; Doc.Set_async (false); <span> // avvio iniziale del documento DOM</span> Doc.LoadXML (" <Header/>"); <span> // crea DOMElement (tag<<b>Mittente</b>>) </span> Nodo: \u003d Doc.createElement ("Sender"); <span> // crea un nodo di testo " <b>Typhoon LLC</b>" </span> txt: \u003d Doc.createTextNode ("Typhoon LLC"); <span> // assegnazione al nodo<<b>Mittente</b>\u003e valore</span> <span> // nodo di testo " <b>Typhoon LLC</b>" </span> Node.appendChild (txt); <span> // aggiungi elemento<<b>Mittente</b>\u003e alla radice del documento da bambino</span> r.appendChild (Node); <span> <<b>A partire dal</b>> </span> Nodo: \u003d Doc.createElement ("From"); txt: \u003d Doc.createTextNode ("http://tayfun.ru/xml/default.asp"); Node.appendChild (txt); r.appendChild (Node); <span> // operazioni simili per il tag<<b>Per</b>> </span> Nodo: \u003d Doc.createElement ("To"); txt: \u003d Doc.createTextNode ("http://irbis.ru"); Node.appendChild (txt); r.appendChild (Node); <span> // crea DOMElement ()</span> Nodo: \u003d Doc.createElement ("TypeDocument"); <span> // crea il nodo XMLDOMAttribute</span> Att: \u003d Doc.createAttribute ("Id", "Order"); <span> // <TypeDocument Id="Order"/> </span> Node.appendChild (Att); r.appendChild (Node); <b>fine;</b> <p>Si noti che la dichiarazione della variabile coDoc: CoDomDocument e Doc: DomDocument, così come la sua creazione con il metodo Create (Doc: \u003d coDoc.Create;) viene eseguita una volta. La dichiarazione di variabile si trova nella sezione che descrive le variabili globali e non nella procedura locale, come è stato dimostrato per chiarezza in questo esempio (cioè una variabile globale di tipo DomDocument per un modulo di programma).</p> <p>Il risultato del lavoro del programma precedente sarà l'intestazione creata, applicata al nostro documento xml di esempio: mostrato nella Figura 5.</p> <img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128662.gif' height="116" width="298" loading=lazy><br>Figura 5. <p><img src='https://i0.wp.com/codenet.ru/np-includes/upload/2005/01/05/128664.gif' height="179" width="385" loading=lazy><br>Figura 6.</p><p>Il vantaggio principale del trasferimento di informazioni sotto forma di documenti XML è che è possibile formare un messaggio utilizzando strutture di tabelle indipendenti nel DBMS sia sul lato di ricezione che di trasmissione. Utilizzando il nostro esempio, supponiamo che sia necessario trasferire le informazioni sulle fatture dell'Impresa A, dal DBMS avente la struttura mostrata in Figura 6</p> <p>Per generare un documento xml contenente una fattura, viene inizialmente creata una query SQL (query A) con le informazioni sulla fattura stessa:</p> <b>SELEZIONARE</b> * FROM Invoice_General <b>DOVE</b> InvoiceNum \u003d: num <b>SELEZIONARE</b>Merce, qualità, prezzo, HZ_cod <b>A PARTIRE DAL</b>Merce <b>DOVE</b> InvoiceNum \u003d: num <span> //: num - un parametro che specifica il numero di fattura.</span> <p>Di seguito una parte del programma che genera il corpo del documento xml:</p> <b>procedura</b> TThread1.DataBodyCreate (Sender: Tobject); <b>var</b> <span> // dichiarazione della classe e dell'oggetto XMLDomDocument</span> // coDoc: CoDomDocument; <span> // deve essere globale per l'intero modulo.</span> // Doc: DomDocument; <span> // dichiara gli oggetti DOMElement</span> r: IXMLDOMElement; // DOMElement; Nodo, Nodo2: IXMLDOMElement; Nodo3, Nodo4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: String; <span> // Numero di fattura: <b>numero intero;</b> - variabile globale - // ha il valore 987654 // queryA, queryB: <b>Corda;</b> - variabile globale, // ha un valore corrispondente alla query // queryA - query A con informazioni generali sulla fattura // queryB - query B informazioni sulle merci descritte in // fattura (vedi testo)</span> <b>inizio</b> Query.Close; <span> // vedi il testo "richiesta A"</span> Query.Text: \u003d queryA; <span> // esegue la richiesta</span> Query.ExecSQL; Query.Open; <span> // ottiene l'indirizzo dell'elemento radice</span> r: \u003d Doc.Get_documentElement; Node2: \u003d Doc.createElement ("Request"); <span> // crea DOMElement (tag)</span> Nodo: \u003d Doc.createElement ("Invoice"); <span> // aggiunge un elemento alla radice</span> r.appendChild (Node2); <span> // aggiungi un elemento a</span> Node2. appendChild (Node); <span> // crea DOMElement (tag)</span> Nodo3: \u003d Doc.createElement ("Depurture"); <span> // aggiungi un elemento a</span> Nodo. appendChild (Node3); <span> // chiamata al campo "Depurture" della richiesta</span> str: \u003d Query.FieldByName ("Depurture"). AsString; <span> // crea nodo di testo \u003d valore del campo</span><span> // assegna un valore al nodo</span> <span> // nodo di testo, variabile str</span> Node.appendChild (txt); <span> // operazioni simili per il tag <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany> (campo DB "Destinatario")</span> Nodo: \u003d Doc.createElement ("Destination"); <span> // il nome del campo del database potrebbe non essere lo stesso del nome</span> str: \u003d Query.FieldByName ("Consignee") .AsString; <span> // tag, questo è il vantaggio dell'utilizzo</span> txt: \u003d Doc.createTextNode (str); <span> // DOM dell'interfaccia davanti a un DBMS che supporta l'interfaccia XML, // come ORACLE 8i o Ms SQL 2000</span> Node.appendChild (txt); ... <span> // generare una richiesta per una specifica per le merci</span> <span> // chiude la richiesta di accesso</span> Query.Close; <span> // vedi nel testo "richiesta B", info. A proposito di merci</span> Query.Text: \u003d queryВ; <span> // assegnazione dei valori dei parametri</span> Query.Params.AsInteger: \u003d InvoiceNumber; <span> // esegue la richiesta</span> Query2.ExecSQL; <span> // accesso aperto per richiedere dati</span> Query.Open; <span> // crea DOMElement (tag)</span> Node3: \u003d Doc.createElement ("Imems"); <span> // aggiungi un elemento a</span> Nodo. appendChild (Node3); <span> // scorre tutte le righe della query</span> <b>mentre</b> <b>non</b> Eof.Query <b>fare</b> iniziare Node4: \u003d Doc.createElement ("Imem"); <span> // aggiungi un elemento a</span> Node3.appendChild (Node4); <span> // generazione di dati per il tag</span> str: \u003d Query.FieldByName ("Price"). AsString; txt: \u003d Doc.createTextNode (str); Node.appendChild (txt); ... <span>// operazioni simili per i tag <HZ_Cod>, <Quality>, <GoodName> </span> <b>fine;</b> <b>fine;</b> <p>Come risultato di questa procedura, viene generato il seguente testo del documento XML:</p> <table width="100%"><tbody><tr><td align="middle"><br><img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128661.gif' width="100%" loading=lazy></td> </tr></tbody></table><p>Per formare una richiesta, utilizzare il metodo Open dell'oggetto <b>IXMLHttpRequest</b>:</p> <b>procedura</b> Open (const bstrMethod, - method type \u003d "POST" bstrUrl, - Server url varAsync, - communication mode asynchronous / synchronous \u003d true bstrUser, - username for authentication bstrPassword) - password <h2>Creazione del lato server dell'elaborazione dei documenti</h2> <p>Come notato in precedenza, l'elaborazione di una richiesta HTTP può essere gestita da applicazioni CGI o servlet Java. È anche possibile scrivere pagine ASP. Ma in questo caso, il trasferimento dei dati è possibile solo con il metodo "GET" tramite la stringa di query. Tuttavia, la gestione di una richiesta HTTP per le pagine ASP è più efficiente di un'applicazione CGI. Tuttavia, a mio parere, non importa come elaborarlo, ma è più importante decidere come costruire un programma di elaborazione e non con quali mezzi.</p> <p>Se dal capitolo precedente abbiamo esaminato le opzioni per formare un documento XML, il compito dell'applicazione server è l'opposto: analizzare i documenti XML. Di seguito è una parte del programma che analizza un documento xml:</p> <b>procedura</b>Tthread1.DataParser (Sender: Tobject); <b>var</b> <span>// dichiara gli oggetti DOMElement</span> r, FNode: IXMLDOMElement; Str, nome file: String; parm: String; <span>// dichiarazione di soclass e</span> CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; <span>// Oggetto XMLDomDocument</span> XMLDoc, XSLDoc, ResultDoc: DomDocument; <span>// HttpStr: String; - una variabile globale contenente la stringa di richiesta HTTP</span> <b>Inizio</b> XMLDoc: \u003d coDocXML.Create; XMLDoc.LoadXML (HttpStr); <span> // ottiene l'indirizzo dell'elemento radice</span> r: \u003d Doc.Get_documentElement; <span> // ottiene il valore dell'elemento</span> FNode: \u003d r.SelectSingleNode ("// TypeDocument"); <span> // ottieni il valore dell'attributo id \u003d "Order"</span> FileName: \u003d FNode.GetAttibute ("id"); <span> // e formando il nome file Order.xsl</span> FileName: \u003d FileName + ". Xsl"; <span> // crea il documento XSLDoc</span> XSLDoc: \u003d coDocXSL.Create; XSLDoc.LoadXML (FileName); <span> // crea il documento XMLDoc</span> ResultDoc: \u003d coDocResult.Create; <span> // imposta la modalità di elaborazione sincrona</span> ResultDoc.Set_async (false); <span> // imposta il controllo di analisi</span> ResultDoc.validateOnParse: \u003d true; <span> // parsing XMLDoc using XSL template</span> XMLDoc.transformNodeToObject (XSLDoc, ResultDoc); <span> // alla variabile Str viene assegnato un valore di testo</span> <span> // del documento risultante.</span> Str: \u003d ResultDoc.text; <span> // trova elemento</span> FNode: \u003d r.SelectSingleNode ("// InvoiceNumber"); <span> // e ottieni il valore dell'elemento</span> parm: \u003d FNode.text; <span> // chiude la richiesta di accesso</span> Query.Close; Query.Text: \u003d Str; <span> // assegnazione del valore del parametro</span> Query.Params.AsString: \u003d parm; <span> // esegue la richiesta</span> Query.ExecSQL; <b>fine;</b> <p>Il punto culminante dell'analisi risiede nell'uso di un modello XSL, formato individualmente per ogni tipo di documento. Il risultato dell'analisi è una stringa di query SQL. Successivamente, l'esecuzione della stringa di query SQL generata apporterà le necessarie modifiche ai dati nel DBMS.</p> <p>Il vantaggio dell'utilizzo dell'analisi attraverso un modello è anche che si ottiene una sorta di flessibilità dei dati e si ottiene la completa indipendenza dell'algoritmo dal codice del programma. Di seguito è riportato il testo del modello XSL utilizzato per elaborare un documento ORDER:</p><p> <!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header"> INSERT into TABREG (FROM, TO, TYPEDOC, body) VALUES (" <xsl:value-of select="from" />", "<xsl:value-of select="to" />", "<xsl:value-of select="TypeDocument/@id" />") </xsl:for-each> <xsl:for-each select="//item"> INSERT into GOODS (invoiceNumber, name, price, quality) VALUES (": num", " <xsl:value-of select="name" />", "<xsl:value-of select="price" />", "<xsl:value-of select="quality" /> ") </xsl:for-each> </xsl:template> </xsl:stylesheet> </p><p>Spiegando l'esempio sopra, va notato che l'uso di una coppia di tag è di natura formale, dal momento che dopo l'analisi, il documento XML risultante deve contenere formalmente almeno un nodo. Il metodo ResultDoc.text assegna il valore di testo del ResultDoc ottenuto durante l'analisi del documento XML. In questo caso, il valore è tutto ciò che è circondato da una coppia di tag e, ad es. la query SQL che abbiamo generato.</p> <p>Un'altra caratteristica della scrittura del programma dovrebbe essere notato la possibilità di utilizzare il parametro SQL <b>: num.</b> L'utilizzo del parametro semplifica il testo del modello xsl. La definizione del valore degli elementi corrispondenti dei nodi del documento XML è determinata inizialmente dalla selezione con il nome del nodo corrispondente, ad esempio:</p><h2>XSL in breve</h2> <p>XSL è un acronimo derivato da eXtensible Stylesheet Language, un linguaggio di formattazione per fogli di stile (dati XML). Come puoi vedere dall'intestazione, eXtensible Stylesheet Language (XSL) viene utilizzato per formattare i dati XML. Per definizione, il W3C XSL è composto da due parti:</p> <ul><li>XSLT - Trasformazione XSL. Il linguaggio utilizzato per trasformare o formattare (trasformare) i documenti XML. Pertanto, con l'aiuto di XSLT, possiamo ottenere diversi tagli di un insieme di dati e forme di presentazione dei dati.</li><li>Elementi di formattazione. Questi elementi includono tutti gli elementi tipografici dei dati, dopo averli elaborati con XSL. Utilizzato solo per generare pagine HTML.</li> </ul><p>Con l'aiuto di XSLT, possiamo selezionare i dati di cui abbiamo bisogno da un file XML e disporli in una forma per la presentazione all'utente. Ad esempio, nel nostro caso, abbiamo trasformato i dati XML sotto forma di una query SQL. L'utilizzo classico di XSL è solitamente la formattazione dei dati sotto forma di pagine HTML o, più raramente, sotto forma di file RTF.</p> <p>Il file XSL descrive un modello, in base al quale verrà eseguita la trasformazione dei dati XML. Ritornando ai template xsl, si possono distinguere in XSLT i seguenti elementi (direttive):</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" width="31%"> <b>Direttive XSL</b> </td><th align="middle" width="69%"> <b>descrizione</b> </th> </tr><tr><td>xsl: apply-templates</td> <td>Una direttiva che indica l'uso di modelli corrispondenti per l'attributo select \u003d "nome modello"</td> </tr><tr><td>xsl: attributo</td> <td>crea un albero degli attributi e lo aggiunge all'elemento di output, nome parametro \u003d "nome attributo", lo spazio dei nomi è un URI dello spazio dei nomi (prefisso dello spazio dei nomi)</td> </tr><tr><td>xsl: call-template</td> <td>chiama un modello, nome attributo \u003d "URI al modello"</td> </tr><tr><td>xsl: scegli <br>xsl: quando <br>xsl: altrimenti</td> <td>selezione per condizione xsl: quando expr \u003d "valutazione dell'espressione sullo script", <br>language \u003d "language-name" <br>test \u003d "espressione valutata"</td> </tr><tr><td>xsl: comment</td> <td>genera un commento nel documento di output</td> </tr><tr><td>xsl: copia <br>xsl: copia di</td> <td>copia il nodo corrente nell'origine di output o inserisce un frammento di documento nel nodo dove l'attributo di selezione \u003d "nome nodo di origine"</td> </tr><tr><td>xsl: elemento</td> <td>crea un elemento di output per nome, nome attributo \u003d "nome elemento", spazio dei nomi \u003d "riferimento allo spazio dei nomi uri"</td> </tr><tr><td>xsl: per-ciascuno</td> <td>riapplica il modello a tutti i nodi dell'elenco dei nodi, l'attributo select specifica l'elenco dei nodi</td> </tr><tr><td>xsl: if</td> <td>controllo delle condizioni, impostato dall'attributo test come espressione</td> </tr><tr><td>xsl: include</td> <td>include modello esterno, attributo href \u003d "riferimento URI"</td> </tr><tr><td>xsl: output</td> <td>specifica l'output, l'attributo del metodo può essere "xml", "html" o "text"</td> </tr><tr><td>xsl: param</td> <td>specifica il valore dei parametri, nome attributo \u003d "nome parametro", seleziona \u003d "valore"</td> </tr><tr><td>xsl: elaborazione-istruzione</td> <td>crea un'istruzione di elaborazione, nome attributo \u003d "nome istruzione di processo"</td> </tr><tr><td>xsl: sort</td> <td>ordina set di nodi, attributi select \u003d "nome nodo", tipo di dati \u003d tipo di dati ("testo" | "numero" | Qname), ordine \u003d direzione ordinamento ("ascendente" | "discendente")</td> </tr><tr><td>xsl: foglio di stile</td> <td>definisce un documento modello xsl, è l'elemento radice per XSLT</td> </tr><tr><td>xsl: template</td> <td>definisce xsl-template, nome dell'attributo \u003d "prefisso URI al nome del modello", match \u003d "un'indicazione del nodo a cui è applicato il modello"</td> </tr><tr><td>xsl: testo</td> <td>genera testo nel flusso di output, attributo disable-output-escaping \u003d "yes" o "no", indica la capacità di generare caratteri ESC</td> </tr><tr><td>xsl: valore di</td> <td>inserisce il valore del nodo selezionato come testo, attributo select \u003d "pointer to node" da cui viene preso il valore</td> </tr><tr><td>xsl: variabile</td> <td>specifica il valore dei limiti delle variabili, nome attributo \u003d "nome variabile", seleziona \u003d "calcolo del valore variabile"</td> </tr><tr><td>xsl: con-param</td> <td>applica un parametro al modello, nome attributo \u003d "nome parametro", seleziona \u003d espressione per valutare il contesto corrente, valore predefinito "."</td> </tr></tbody></table><h2>Conclusione</h2> <p>Infine, va notato che l'utilizzo del parser XML standard <i>msxml.dll</i>non è l'unico modo per analizzare e creare documenti XML. Ad esempio, per creare documenti XML in modo efficace, utilizzare i componenti <b>TPageProduser</b>e <b>TableProduser</b>... Tuttavia, questo articolo sottolinea solo l'ampiezza e l'applicabilità del modello DOM nella pratica.</p> <p>L'autore ti sarà molto grato per il tuo feedback sulla pertinenza dell'argomento, del contenuto generale, dello stile di presentazione, nonché di tutti gli altri commenti che aiuteranno a migliorare ulteriormente la qualità della scrittura di una raccolta di articoli e del rilascio di un libro che tratta l'argomento del lato pratico dell'uso di documenti XML nell'e-commerce. Informazioni più dettagliate sul lato pratico dell'uso di documenti elettronici possono essere trovate sul sito dell'autore www.eDocs.al.ru Anche sul sito dell'autore si prevede di inserire i testi di partenza e gli esempi.</p> <p>XML è sempre più utilizzato per memorizzare informazioni e scambiarle tra applicazioni e siti Web. Molte applicazioni utilizzano questo linguaggio come lingua di base per la memorizzazione dei dati, mentre altre lo utilizzano per esportare e importare dati XML. Quindi è tempo che gli sviluppatori pensino a come utilizzare i dati XML nelle proprie applicazioni.</p> <p>In questo articolo, esamineremo il DOM (Document Object Model) XML e l'implementazione di XML DOM da parte di Microsoft.</p> <p>XML DOM è un modello a oggetti che fornisce allo sviluppatore oggetti per il caricamento e l'elaborazione di file XML. Il modello a oggetti è costituito dai seguenti oggetti principali: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap e XMLDOMParseError. Ciascuno di questi oggetti (eccetto XMLDOMParseError) contiene proprietà e metodi che consentono di ottenere informazioni sull'oggetto, manipolare i valori e la struttura dell'oggetto e navigare nella struttura di un documento XML.</p> <p>Diamo un'occhiata ai principali oggetti XML DOM e mostriamo alcuni esempi del loro utilizzo in Borland Delphi.</p> <h2> Utilizzo di XML DOM in Borland Delphi</h2> <p>Per utilizzare Microsoft XML DOM nelle applicazioni Delphi, è necessario collegare la libreria dei tipi appropriata al progetto. Per fare ciò, eseguiamo il comando Project | Importa libreria dei tipi e nella finestra di dialogo Importa libreria dei tipi, seleziona la libreria Microsoft XML versione 2.0 (Versione 2.0), che di solito si trova nel file Windows \\ System \\ MSXML.DLL</p> <p>Dopo aver fatto clic sul pulsante Crea unità, verrà creato il modulo di interfaccia MSXML_TLB, che ci permetterà di utilizzare gli oggetti XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest e numerosi altri, implementati nella libreria MSXML.DLL. Il riferimento al modulo MSXML_TLB deve essere nell'elenco Uses.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Dispositivo XML DOM</h2> <p>Il Document Object Model rappresenta un documento XML come una struttura ad albero di rami. Le API XML DOM consentono alle applicazioni di navigare nell'albero del documento e manipolarne i rami. Ogni ramo può avere un tipo specifico (DOMNodeType), in base al quale vengono determinati i rami padre e figlio. La maggior parte dei documenti XML contiene rami di tipo elemento, attributo e testo. Gli attributi sono un tipo speciale di ramo e non sono rami figlio. Gli attributi vengono manipolati utilizzando metodi speciali forniti dagli oggetti XML DOM.</p> <p>Oltre a implementare le interfacce consigliate dal World Wide Web Consortium (W3C), Microsoft XML DOM contiene metodi che supportano XSL, modelli XSL, spazi dei nomi e tipi di dati. Ad esempio, il metodo SelectNodes consente di utilizzare la sintassi del pattern XSL per trovare rami in un contesto specifico e il metodo TransformNode supporta l'utilizzo di XSL per eseguire le trasformazioni.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Prova documento XML</h2> <p>Come documento XML di esempio, prendi una directory di CD-ROM musicale, che ha la seguente struttura:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Impero burlesque Bob Dylan Stati Uniti d'America Columbia 10.90 1985 Nascondi il tuo cuore Bonnie tylor UK Record CBS 9.90 1988 ... Libera il mio cuore Joe cocker Stati Uniti d'America EMI 8.20 1987

Siamo ora pronti per iniziare a guardare il modello a oggetti XML DOM, iniziando con l'oggetto XMLDOMDocument.

Documento XML - Oggetto XMLDOMDocument

Lavorare con un documento XML inizia con il suo caricamento. Per fare ciò, utilizziamo il metodo Load, che ha un solo parametro che specifica l'URL del documento caricato. Quando si caricano file da un disco locale, viene specificato solo il nome file completo (in questo caso il protocollo file: /// può essere omesso). Se il documento XML è archiviato come stringa, utilizzare il metodo LoadXML per caricare quel documento.

La proprietà Async viene utilizzata per controllare la modalità di caricamento del documento (sincrono o asincrono). Per impostazione predefinita, questa proprietà è True, a indicare che il documento viene caricato in modo asincrono e il controllo viene restituito all'applicazione prima che il documento sia completamente caricato. In caso contrario, il documento viene caricato in modo sincrono e quindi è necessario controllare il valore della proprietà ReadyState per vedere se il documento è stato caricato o meno. È inoltre possibile creare un gestore eventi per l'evento OnReadyStateChange che assumerà il controllo quando il valore della proprietà ReadyState cambia.

Di seguito viene mostrato come caricare un documento XML utilizzando il metodo Load:

Utilizza ... MSXML_TLB ... procedura TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; iniziare XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); // // Qui è dove il codice // manipola il documento XML e le sue diramazioni // XMLDoc: \u003d Nil; fine;

Dopo che il documento è stato caricato, possiamo accedere alle sue proprietà. Pertanto, la proprietà NodeName conterrà il valore #document, la proprietà NodeTypeString conterrà il valore del documento e la proprietà URL conterrà il valore file: /// C: /DATA/DATA.xml.

Gestione degli errori

Di particolare interesse sono le proprietà associate all'elaborazione del documento durante il caricamento. Ad esempio, la proprietà ParseError restituisce un oggetto XMLDOMParseError contenente informazioni su un errore che si è verificato durante l'elaborazione del documento.

Per scrivere un gestore degli errori, puoi aggiungere il codice seguente:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); XMLError: \u003d XMLDoc.ParseError; Se XMLError.ErrorCode<> 0 Allora // // Qui gestiamo l'errore // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: \u003d Nil;

Per vedere quali informazioni vengono restituite in caso di errore, modificare la seguente voce di directory:

Impero burlesque Bob Dylan Stati Uniti d'America Columbia 10.90 1985

rimuovere l'elemento di chiusura sulla seconda riga:</p><p> <CD> <TITLE>Impero burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Stati Uniti d'America</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Ora scriviamo il codice che restituisce i valori delle proprietà dell'oggetto XMLDOMParseError:</p><p>XMLError: \u003d XMLDoc.ParseError; Se XMLError.ErrorCode<> 0 Quindi con XMLError, Memo1.Lines inizia con Add ("File:" + URL); Aggiungi ("Codice:" + IntToStr (ErrorCode)); Aggiungi ("Errore:" + motivo); Aggiungi ("Testo:" + SrcText); Aggiungi ("Riga:" + IntToStr (Riga)); Aggiungi ("Posizione:" + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Fine;</p><p>ed eseguire la nostra applicazione. Di conseguenza, otteniamo le seguenti informazioni sull'errore.</p> <p>Come puoi vedere dall'esempio precedente, le informazioni restituite dall'oggetto XMLDOMParseError sono sufficienti per localizzare l'errore e comprendere la causa del suo verificarsi.</p> <p>Ora ripristineremo l'elemento di chiusura <TITLE> nel nostro documento e continuare la nostra discussione sul DOM XML.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Accesso all'albero dei documenti</h2> <p>Per accedere all'albero del documento, puoi ottenere l'elemento radice e quindi iterare sui suoi rami figli o trovare un ramo specifico. Nel primo caso, otteniamo l'elemento root tramite la proprietà DocumentElement, che restituisce un oggetto di tipo XMLDOMNode. Ecco come utilizzare la proprietà DocumentElement per ottenere il contenuto di ogni elemento figlio:</p><p>Nodo Var: IXMLDOMNode; Radice: IXMLDOMElement; I: numero intero; ... Root: \u003d XMLDoc.DocumentElement; Per I: \u003d 0 a Root.ChildNodes.Length-1 do Begin Node: \u003d Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Fine;</p><p>Per il nostro documento XML, otteniamo il testo seguente.</p> <p>Se siamo interessati a un ramo specifico o un ramo sotto il primo ramo figlio, possiamo utilizzare il metodo NodeFromID o il metodo GetElementByTagName dell'oggetto XMLDOMDocument.</p> <p>Il metodo NodeFromID richiede un identificatore univoco come definito nello schema XML o nella DTD (Document Type Definition) e restituisce un ramo con tale identificatore.</p> <p>Il metodo GetElementByTagName richiede una stringa con un elemento specifico (tag) e restituisce tutti i rami con questo elemento. Ecco come utilizzare questo metodo per trovare tutti gli artisti nella nostra directory CD-ROM:</p><p>Nodi: IXMLDOMNodeList; Nodo: IXMLDOMNode; ... Nodi: \u003d XMLDoc.GetElementsByTagName ("ARTIST"); Per I: \u003d 0 a Nodes.Length-1 do Begin Node: \u003d Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Fine;</p><p>Per il nostro documento XML, otterremo il testo seguente</p> <p>Si noti che il metodo SelectNodes dell'oggetto XMLDOMNode fornisce un modo più flessibile per accedere ai rami del documento. Ma ne parleremo più avanti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Ramo documento - Oggetto XMLDOMNode</h2> <p>L'oggetto XMLDOMNode rappresenta un ramo del documento. Abbiamo già riscontrato questo oggetto durante il recupero dell'elemento radice del documento:</p><p>Radice: \u003d XMLDoc.DocumentElement;</p><p>Per ottenere informazioni su un ramo di un documento XML, è possibile utilizzare le proprietà dell'oggetto XMLDOMNode (Tabella 1).</p> <p>Per accedere ai dati archiviati in un ramo, è comune utilizzare la proprietà NodeValue (disponibile per attributi, rami di testo, commenti, istruzioni di elaborazione e sezioni CDATA) o la proprietà Text, che restituisce il contenuto di testo del ramo o la proprietà NodeTypedValue. Quest'ultimo, tuttavia, può essere utilizzato solo per rami con elementi dattiloscritti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> Navigazione nella struttura ad albero del documento</h3> <p>L'oggetto XMLDOMNode fornisce molti modi per navigare nella struttura ad albero del documento. Ad esempio, per accedere al ramo padre, utilizzare la proprietà ParentNode (tipo XMLDOMNode), accedere ai rami figlio tramite le proprietà ChildNodes (tipo XMLDOMNodeList), FirstChild e LastChild (tipo XMLDOMNode), ecc. La proprietà OwnerDocument restituisce un oggetto XMLDOMDocument che identifica il documento XML stesso. Le proprietà elencate sopra facilitano la navigazione nell'albero del documento.</p> <p>Ora iteriamo su tutti i rami del documento XML:</p><p>Radice: \u003d XMLDoc.DocumentElement; Per I: \u003d 0 a Root.ChildNodes.Length-1 do Begin Node: \u003d Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); Fine;</p><p>Come notato sopra, i SelectNodes dell'oggetto XMLDOMNode forniscono un modo più flessibile per accedere ai rami del documento. Inoltre, esiste un metodo SelectSingleNode che restituisce solo il primo ramo del documento. Entrambi questi metodi consentono di definire modelli XSL per le ricerche nei rami.</p> <p>Diamo un'occhiata al processo di utilizzo del metodo SelectNodes per recuperare tutti i rami che hanno un ramo CD e un ramo secondario PRICE:</p><p>Radice: \u003d XMLDoc.DocumentElement; Nodi: \u003d Root.SelectNodes ("CD / PRICE");</p><p>Tutti i rami secondari PRICE del ramo CD verranno inseriti nella raccolta Nodes. Torneremo un po 'più tardi a discutere dei modelli XSL.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> Manipolazione dei rami figli</h3> <p>Per manipolare i rami figli, possiamo usare i metodi dell'oggetto XMLDOMNode (Tabella 2).</p> <p>Per eliminare completamente il record relativo al primo disco, è necessario eseguire il codice seguente:</p><p>Var XMLDoc: IXMLDOMDocument; Radice: IXMLDOMNode; Nodo: IXMLDOMNode; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); // Recupera l'elemento radice Root: \u003d XMLDoc.DocumentElement; Nodo: \u003d Root; // Rimuove il primo ramo figlio Node.RemoveChild (Node.FirstChild);</p><p>Nota che in questo esempio stiamo eliminando il primo ramo figlio. Di seguito viene mostrato come rimuovere il primo elemento del primo ramo figlio:</p><p>Var XMLDoc: IXMLDOMDocument; Radice: IXMLDOMNode; Nodo: IXMLDOMNode; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ("C: \\ DATA \\ DATA.xml"); // Recupera l'elemento radice Root: \u003d XMLDoc.DocumentElement; // e il primo ramo figlio Node: \u003d Root.FirstChild; // Rimuove il primo ramo figlio Node.RemoveChild (Node.FirstChild);</p><p>Nell'esempio precedente, non abbiamo eliminato il primo ramo <CD>…</CD>e il primo elemento del ramo è <TITLE>….

Ora aggiungiamo un nuovo ramo. Di seguito è riportato il codice che mostra come aggiungere una nuova voce CD-ROM musicale:

Var NewNode: IXMLDOMNode; Figlio: IXMLDOMNode; ... // Crea un nuovo ramo - NewNode: \u003d XMLDoc.CreateNode (1, "CD", ""); // Aggiungi un elemento Figlio: \u003d XMLDoc.CreateNode (1, "TITLE", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "Pink Floyd"; // Aggiungi un elemento <ARTIST> Figlio: \u003d XMLDoc.CreateNode (1, "ARTIST", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "Division Bell"; // Aggiungi un elemento <COUNTRY> Figlio: \u003d XMLDoc.CreateNode (1, "COUNTRY", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "UK"; // Aggiungi un elemento <COMPANY> Child: \u003d XMLDoc.CreateNode (1, "COMPANY", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "EMI Records Ltd."; // Aggiungi un elemento <PRICE>Figlio: \u003d XMLDoc.CreateNode (1, "PRICE", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d '11 .99 "; // Aggiungi un elemento <YEAR> Figlio: \u003d XMLDoc.CreateNode (1, "YEAR", ""); // Aggiunge un elemento NewNode.AppendChild (Child); // E imposta il suo valore Child.Text: \u003d "1994"; // E aggiunge un ramo Root.AppendChild (NewNode); ...</p><p>Il codice sopra mostra i seguenti passaggi per l'aggiunta di un nuovo ramo:</p> <ul><li>Creazione di un nuovo ramo utilizzando il metodo CreateNode: <ul><li>creazione di un elemento utilizzando il metodo CreateNode;</li> <li>aggiunta di un elemento a un ramo utilizzando il metodo AppendChild;</li> <li>impostare il valore di un elemento tramite la proprietà Text;</li> <li>… Ripeti per tutti gli elementi.</li> </ul></li> <li>Aggiunta di un nuovo ramo al documento utilizzando il metodo AppendChild.</li> </ul><p>Ricorda che il metodo AppendChild aggiunge un ramo alla fine dell'albero. Per aggiungere un ramo a un punto specifico dell'albero, è necessario utilizzare il metodo InsertBefore.</p> <h2> Set di diramazioni: oggetto XMLDOMNodeList</h2> <p>L'oggetto XMLNodeList contiene un elenco di rami, che possono essere creati utilizzando i metodi SelectNodes o GetElementsByTagName e ottenuti anche dalla proprietà ChildNodes.</p> <p>Abbiamo già discusso l'uso di questo oggetto nell'esempio fornito nella sezione "Navigazione nell'albero del documento". Qui forniremo anche alcuni commenti teorici.</p> <p>Il numero di rami nell'elenco può essere ottenuto come valore della proprietà Length. I rami sono indicizzati da 0 a Lunghezza-1 e ogni singolo ramo è accessibile tramite l'elemento indicizzato corrispondente nell'array Item.</p> <p>La navigazione nell'elenco dei rami può essere eseguita anche con il metodo NextNode, che restituisce il ramo successivo nell'elenco, o Nil se il ramo corrente è l'ultimo. Per tornare all'inizio dell'elenco, chiama il metodo Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Crea e salva documenti</h2> <p>Quindi, abbiamo spiegato come aggiungere rami ed elementi a documenti XML esistenti. Ora creiamo un documento XML al volo. Prima di tutto, ricorda che un documento può essere caricato non solo da un URL, ma anche da una stringa normale. Di seguito viene mostrato come creare un elemento radice, che può quindi essere utilizzato per costruire dinamicamente il resto degli elementi (di cui abbiamo già parlato nella sezione "Manipolazione dei rami figli"):</p><p>Var XMLDoc: IXMLDOMDocument; Radice: IXMLDOMNode; Nodo: IXMLDOMNode; S: WideString; ... S: \u003d ' <CATALOG></CATALOG>'; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.LoadXML (S); Radice: \u003d XMLDoc.DocumentElement; Nodo: \u003d XMLDoc.CreateNode (1, "CD", ""); Root.AppendChild (nodo); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: \u003d Nil;</p><p>Dopo aver creato il documento XML, salvalo in un file utilizzando il metodo Save. Per esempio:</p> <p>XMLDoc.Save ('C: \\ DATA \\ NEWCD.XML');</p> <p>Oltre a salvare in un file, il metodo Save consente di salvare un documento XML in un nuovo oggetto XMLDOMDocument. In questo caso, il documento viene completamente elaborato e, di conseguenza, vengono verificate la sua struttura e sintassi. Ecco come salvare un documento su un altro oggetto:</p><p>Procedura TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; iniziare XMLDoc2: \u003d CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: \u003d Nil; fine;</p><p>In conclusione, il metodo Save consente anche di salvare il documento XML su altri oggetti COM che supportano le interfacce IStream, IPersistStream o IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Utilizzo di modelli XSL</h2> <p>Discutendo il metodo SelectNodes dell'oggetto XMLDOMNode, abbiamo detto che fornisce un modo più flessibile per accedere ai rami del documento. La flessibilità è data dalla possibilità di specificare un modello XSL come criterio per la selezione dei rami. Tali modelli forniscono un potente meccanismo per trovare informazioni nei documenti XML. Ad esempio, per ottenere un elenco di tutti i titoli di CD-ROM musicali nella nostra directory, è possibile eseguire la seguente query:</p><p>Per scoprire quali dischi d'artista sono stati rilasciati negli USA, la richiesta è formata come segue:</p><p>Nodi: \u003d Root.SelectNodes ("CD / ARTIST");</p><p>Ecco come trovare la prima unità in una directory:</p><p>Nodi: \u003d Root.SelectNodes ("CD / TITLE");</p><p>e ultimo:</p><p>Nodi: \u003d Root.SelectNodes ("CD / TITLE");</p><p>Per trovare i dischi di Bob Dylan, puoi eseguire la seguente query:</p><p>Nodi: \u003d Root.SelectNodes ("CD [$ any $ ARTIST \u003d" Bob Dylan "] / TITLE");</p><p>e per ottenere un elenco di dischi creati dopo il 1985, eseguiamo la seguente query:</p><p>Nodi: \u003d Root.SelectNodes ("CD / TITLE");</p><p>Una discussione più dettagliata della sintassi XSL richiede una pubblicazione separata. Per incuriosire i lettori e incoraggiare ulteriori ricerche, fornirò solo un piccolo esempio del possibile utilizzo di XSL. Diciamo che dobbiamo convertire il nostro catalogo in una normale tabella HTML. Utilizzando i metodi tradizionali, dobbiamo iterare su tutti i rami dell'albero e per ogni elemento ricevuto formare i tag corrispondenti <TD>…</TD>.</p> <p>Usando XSL, creiamo semplicemente un modello (o foglio di stile) che specifica cosa e come trasformare. Quindi inseriamo questo modello nel nostro catalogo e il gioco è fatto: abbiamo il testo del modello XSL che trasforma il catalogo in una tabella (Listato 2).</p> <p>Il codice per sovrapporre un modello XSL sulla nostra directory è simile a questo:</p><p>Procedura TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; iniziare XSLDoc: \u003d CoDOMDocument.Create; XSLDoc.Load ("C: \\ DATA \\ DATA.xsl"); Memo2.Text: \u003d XMLDoc.TransformNode (XSLDoc); XSLDoc: \u003d Nil; fine;</p><p>Concludendo la nostra discussione su XSL, va detto che attualmente questo linguaggio è attivamente utilizzato per la trasformazione tra vari documenti XML, così come per la formattazione dei documenti.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Conclusione</h2> <p>Per ovvie ragioni, è impossibile coprire tutti gli oggetti Microsoft XML DOM e fornire esempi del loro utilizzo in un articolo. Qui abbiamo appena toccato i problemi di base dell'utilizzo di XML DOM nelle applicazioni. tavolo 3 mostra tutti gli oggetti implementati nel Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> <div class="bsb-wrap bsb-bold bsb-after-post php-mode" data-post-id="4848" data-share-url="/eshhe-odin-nalog-chem-zamenit-nalog-na-modernizatsiyu/"> <div class="bsb-items"> <div class="bsb-item bsb-facebook bsb-no-count" data-id="facebook"> <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fqipu.ru%2Fit%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-facebook"></i> <span class="bsb-label">Condividere</span> </a> </div> <div class="bsb-item bsb-telegram bsb-no-count" data-id="telegram"> <a href="https://qipu.ru/it/tg://msg?text=https%3A%2F%2Fqipu.ru%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-telegram"></i> <span class="bsb-label">Condividere</span> </a> </div> <div class="bsb-item bsb-twitter bsb-no-count" data-id="twitter"> <a href="https://twitter.com/share?url=https%3A%2F%2Fqipu.ru%2Fit%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-twitter"></i> <span class="bsb-label">Tweet</span> </a> </div> <div class="bsb-item bsb-vkontakte bsb-no-count" data-id="vkontakte"> <a href="https://vk.com/share.php?url=https%3A%2F%2Fqipu.ru%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-vkontakte"></i> <span class="bsb-label">Piace</span> </a> </div> <div class="bsb-item bsb-fb-messenger bsb-no-count" data-id="fb-messenger"> <a href="https://qipu.ru/it/fb-messenger://share/?link=https%3A%2F%2Fqipu.ru%2Fmts%2Fispolzovanie-xml-v-srede-delphi-ispolzovanie-xml-document-object-model.html" class="bsb-link" target="_blank" data-wpel-link="internal"> <i class="bsb-icon icon icon-fb-messenger"></i> <span class="bsb-label">Piace</span> </a> </div> </div> </div> </div> </div> </article> <section class="section-carousel"> <div class="post-carousel"> <h3 class="title-block">Leggi anche</h3> <div class="owl-container owl-loop" data-columns="3" data-padding="20"> <div class="owl-carousel"> <article class="post- post type-post status-publish format-standard has-post-thumbnail hentry category-morning-news"> <div class="post-thumbnail"> <img width="720" height="378" src="/uploads/f2aaeefae4aa9f5b75d1a7549ff5ef54.jpg" class="attachment-md size-md wp-post-image" alt="Tariffa MTS "Tablet Mini": descrizione" / loading=lazy> <div class="post-more"><a href="https://qipu.ru/it/mts/mts-planshet-mini-opisanie-tarif-mts-planshet-mini-opisanie.html" class="btn-link" data-wpel-link="internal"><span>Leggere</span></a></div> <ul class="post-meta"></ul> <a href="https://qipu.ru/it/mts/mts-planshet-mini-opisanie-tarif-mts-planshet-mini-opisanie.html" data-wpel-link="internal"></a> </div> <h2 class="entry-title"><a href="https://qipu.ru/it/mts/mts-planshet-mini-opisanie-tarif-mts-planshet-mini-opisanie.html" data-wpel-link="internal">Tariffa MTS "Tablet Mini": descrizione</a></h2> <ul class="post-meta"> <li class="meta-date"> <time class="entry-date published updated" datetime=""> 14.09.2020 </time> </li> </ul> </article> <!-- /next_post --> <article class="post- post type-post status-publish format-standard has-post-thumbnail hentry category-morning-news"> <div class="post-thumbnail"> <img width="720" height="378" src="/uploads/a1a3ed404de56e1189964882d9f4c5f8.jpg" class="attachment-md size-md wp-post-image" alt="Cerchi e ruote per Nissan X-Trail, dimensioni ruote per Nissan X-Trail" / loading=lazy> <div class="post-more"><a href="https://qipu.ru/it/tele2/shiny-na-h-treil-t32-shiny-i-diski-dlya-nissan-x-trail-razmer-kol-s-na-nissan.html" class="btn-link" data-wpel-link="internal"><span>Leggere</span></a></div> <ul class="post-meta"></ul> <a href="https://qipu.ru/it/tele2/shiny-na-h-treil-t32-shiny-i-diski-dlya-nissan-x-trail-razmer-kol-s-na-nissan.html" data-wpel-link="internal"></a> </div> <h2 class="entry-title"><a href="https://qipu.ru/it/tele2/shiny-na-h-treil-t32-shiny-i-diski-dlya-nissan-x-trail-razmer-kol-s-na-nissan.html" data-wpel-link="internal">Cerchi e ruote per Nissan X-Trail, dimensioni ruote per Nissan X-Trail</a></h2> <ul class="post-meta"> <li class="meta-date"> <time class="entry-date published updated" datetime=""> 14.09.2020 </time> </li> </ul> </article> <!-- /next_post --> <article class="post- post type-post status-publish format-standard has-post-thumbnail hentry category-morning-news"> <div class="post-thumbnail"> <img width="720" height="378" src="/uploads/595eda0b4490c6c67dc529632cbc2119.jpg" class="attachment-md size-md wp-post-image" alt="Internet mobile e comunicazione cellulare in Crimea - Beeline roaming, MTS, Megafon, Tele2" / loading=lazy> <div class="post-more"><a href="https://qipu.ru/it/bilajjn/pokrytie-3-g-v-krymu-mobilnyi-internet-i-sotovaya-svyaz-v-krymu-bilain.html" class="btn-link" data-wpel-link="internal"><span>Leggere</span></a></div> <ul class="post-meta"></ul> <a href="https://qipu.ru/it/bilajjn/pokrytie-3-g-v-krymu-mobilnyi-internet-i-sotovaya-svyaz-v-krymu-bilain.html" data-wpel-link="internal"></a> </div> <h2 class="entry-title"><a href="https://qipu.ru/it/bilajjn/pokrytie-3-g-v-krymu-mobilnyi-internet-i-sotovaya-svyaz-v-krymu-bilain.html" data-wpel-link="internal">Internet mobile e comunicazione cellulare in Crimea - Beeline roaming, MTS, Megafon, Tele2</a></h2> <ul class="post-meta"> <li class="meta-date"> <time class="entry-date published updated" datetime=""> 14.09.2020 </time> </li> </ul> </article> <!-- /next_post --> </div> <div class="owl-dots"></div> </div> </div> </section> </main> </div> </div> </div> </div> <footer class="site-footer"> <style> .footer-section { width: 830px; margin: 0 auto; padding: 0; font-family: 'Noto Sans', sans-serif; } .site-footer { background-color: #222; } @media (max-width: 1025px) { .footer-section { max-width: 690px; } } @media (max-width: 760px) { .footer-section { width: 90%; } } .site-footer a:hover { color: #FF3400; } .white-a { color: #969696!important; } .white-a:hover { color: #fff!important; } .white-a:hover g { opacity: 1; } </style> <div class="footer-section"> <div class="footer" > <div class="footer__menu"> <div class="footer__menu__logo" style="background:none;"><img src="/logo.png" loading=lazy></div> <ul> <li><a href="https://qipu.ru/it/category/bilajjn/">Beeline</a></li> <li><a href="https://qipu.ru/it/category/megafon/">Megafono</a></li> <li><a href="https://qipu.ru/it/category/mobilnye-sovety/">Suggerimenti per dispositivi mobili</a></li> <li><a href="https://qipu.ru/it/category/mts/">Mts</a></li> </ul> <ul> <li><a href="https://qipu.ru/it/category/tele2/">TELE 2</a></li> <li><a href="https://qipu.ru/it/category/yota/">Yota</a></li> <li><a href="https://qipu.ru/it/category/bilajjn/">Beeline</a></li> <li><a href="https://qipu.ru/it/category/megafon/">Megafono</a></li> </ul> </div> <div class="footer__social"> <a href="https://facebook.com/" target="_blank" class="footer__social--facebook white-a" data-wpel-link="external"></a> <a href="https://twitter.com/" target="_blank" class="footer__social--tw white-a" data-wpel-link="external"></a> <a href="" target="_blank" class="footer__social--vk white-a" data-wpel-link="external"></a> <a href="https://youtube.com/" target="_blank" class="footer__social--yt white-a" data-wpel-link="external"></a> </div> <div class="footer__info" > <p>© qipu.ru, 2020. Assistente personale nel mondo delle comunicazioni cellulari <br> .</p> </div> </div> </div> </footer> </div> </div> <a href="https://qipu.ru/it/#top" class="scroll-to-top hidden-sm-down" data-wpel-link="internal"></a> <div class="site-search" id="search"> <button type="button" class="close"></button> <div class="form-container"> <div class="container"> <div class="row"> <div class="col-lg-6 offset-lg-3"> <form role="search" method="get" class="search-form form" action="/"> <label class="sr-only">Cercare:</label> <div class="input-group"> <input type="search" value="" name="s" class="search-field form-control" placeholder="Che cosa sta cercando?" required> <span class="input-group-btn"> <button type="submit" class="search-submit btn btn-primary btn-effect"><span>Ricerca</span><span><i class="icon icon-search"></i></span></button> </span> </div> </form> <p>Inserisci le tue parole chiave.</p> </div> </div> </div> </div> </div> <style type="text/css"> .wpmchimpa-overlay-bg.wpmchimpselector { display: none; top: 0; left: 0; height:100%; width: 100%; cursor: pointer; z-index: 999999; background: #000; background: rgba(0,0,0,0.40); background:rgba(0,0,0,0.7);cursor: default; position: fixed!important; } .wpmchimpa-overlay-bg #wpmchimpa-main *{ transition: all 0.5s ease; } .wpmchimpa-overlay-bg .wpmchimpa-mainc, .wpmchimpa-overlay-bg .wpmchimpa-maina{ -webkit-transform: translate(0,0); height:100%;} .wpmchimpa-overlay-bg #wpmchimpa-main { position: absolute; top: 50%; left: 50%; border-radius: 2px; -webkit-transform: translate(-50%, -50%); -moz-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); -o-transform: translate(-50%, -50%); transform: translate(-50%, -50%); width: calc(100% - 20px); max-width:650px; background: #27313B; text-align: center; background-color:#ffffff;} #wpmchimpa-main #wpmchimpa-newsletterform{ } #wpmchimpa-main #wpmchimpa{ width: calc(100% - 20px); max-width: 400px; margin: 0 auto; } #wpmchimpa div{ position:relative; } #wpmchimpa h3{ line-height: 24px; margin-top:20px; color: #F4233C; font-size: 24px; font-family:Tahoma, Geneva, sans-serif;font-size:35px;line-height:35px;font-weight:normal;font-style:normal;color:#f34b38;} #wpmchimpa .wpmchimpa_para{ margin-top: 15px; } #wpmchimpa .wpmchimpa_para,#wpmchimpa .wpmchimpa_para * { font-size: 15px; color: #959595; font-family:Tahoma, Geneva, sans-serif;font-size:15px;} #wpmchimpa form{ margin: 20px auto; } #wpmchimpa .formbox > div:first-of-type{ width: 65%; float: left; } #wpmchimpa .formbox > div:first-of-type + div{ width: 35%; float: left; text-align: center; } #wpmchimpa .formbox input[type="text"]{ border-radius: 3px 0 0 3px; } #wpmchimpa .wpmchimpa-field{ position: relative; width:100%; margin: 0 auto 10px auto; text-align: left; } #wpmchimpa .inputicon{ display: none; } #wpmchimpa .wpmc-ficon .inputicon { display: block; width: 40px; height: 40px; position: absolute; top: 0; left: 0; pointer-events: none; } #wpmchimpa .wpmc-ficon input[type="text"], #wpmchimpa .wpmc-ficon input[type="text"] ~ .inputlabel{ padding-left: 40px; } #wpmchimpa .wpmc-ficon [wpmcfield="email"] ~ .inputicon { background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTUxMiwzODRjMCwxMS4yMTktMy4xNTYsMjEuNjI1LTguMjE5LDMwLjc4MUwzNDIuMTI1LDIzMy45MDZMNTAyLjAzMSw5NGM2LjIxOSw5Ljg3NSw5Ljk2OSwyMS40NjksOS45NjksMzRWMzg0eiBNMjU2LDI2Ni43NUw0NzguNSw3Mi4wNjNjLTkuMTI1LTUtMTkuNDA2LTguMDYzLTMwLjUtOC4wNjNINjRjLTExLjEwOSwwLTIxLjM5MSwzLjA2My0zMC40ODQsOC4wNjNMMjU2LDI2Ni43NXogTTMxOC4wMzEsMjU0Ljk2OSBsLTUxLjUsNDUuMDk0QzI2My41MTYsMzAyLjY4OCwyNTkuNzY2LDMwNCwyNTYsMzA0cy03LjUxNi0xLjMxMy0xMC41MzEtMy45MzhsLTUxLjUxNi00NS4wOTRMMzAuMjUsNDM4LjE1NiBDNDAuMDYzLDQ0NC4zMTMsNTEuNTYzLDQ0OCw2NCw0NDhoMzg0YzEyLjQzOCwwLDIzLjkzOC0zLjY4OCwzMy43NS05Ljg0NEwzMTguMDMxLDI1NC45Njl6IE05Ljk2OSw5NEMzLjc1LDEwMy44NzUsMCwxMTUuNDY5LDAsMTI4IHYyNTZjMCwxMS4yMTksMy4xNDEsMjEuNjI1LDguMjE5LDMwLjc4MWwxNjEuNjQxLTE4MC45MDZMOS45NjksOTR6Ii8+PC9zdmc+') no-repeat center} #wpmchimpa .wpmc-ficon [wpmcfield="FNAME"] ~ .inputicon { background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNjEyIDYxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjEyIDYxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZD0iTTMwNi4wMDEsMzI1Ljk4OGM5MC41NjMtMC4wMDUsMTIzLjE0Ny05MC42ODIsMTMxLjY3OS0xNjUuMTY3QzQ0OC4xODgsNjkuMDYsNDA0Ljc5OSwwLDMwNi4wMDEsMCBjLTk4Ljc4MiwwLTE0Mi4xOTUsNjkuMDU1LTEzMS42NzksMTYwLjgyQzE4Mi44NjIsMjM1LjMwNCwyMTUuNDM2LDMyNS45OTUsMzA2LjAwMSwzMjUuOTg4eiIvPjxwYXRoIGQ9Ik01NTAuOTgxLDU0MS45MDhjLTAuOTktMjguOTA0LTQuMzc3LTU3LjkzOS05LjQyMS04Ni4zOTNjLTYuMTExLTM0LjQ2OS0xMy44ODktODUuMDAyLTQzLjk4My0xMDcuNDY1IGMtMTcuNDA0LTEyLjk4OC0zOS45NDEtMTcuMjQ5LTU5Ljg2NS0yNS4wODFjLTkuNjk3LTMuODEtMTguMzg0LTcuNTk0LTI2LjUzNy0xMS45MDFjLTI3LjUxOCwzMC4xNzYtNjMuNCw0NS45NjItMTA1LjE4Niw0NS45NjQgYy00MS43NzQsMC03Ny42NTItMTUuNzg2LTEwNS4xNjctNDUuOTY0Yy04LjE1Myw0LjMwOC0xNi44NCw4LjA5My0yNi41MzcsMTEuOTAxYy0xOS45MjQsNy44MzItNDIuNDYxLDEyLjA5Mi01OS44NjMsMjUuMDgxIGMtMzAuMDk2LDIyLjQ2My0zNy44NzMsNzIuOTk2LTQzLjk4MywxMDcuNDY1Yy01LjA0NSwyOC40NTQtOC40MzMsNTcuNDg5LTkuNDIyLDg2LjM5MwljLTAuNzY2LDIyLjM4NywxMC4yODgsMjUuNTI1LDI5LjAxNywzMi4yODRjMjMuNDUzLDguNDU4LDQ3LjY2NiwxNC43MzcsNzIuMDQxLDE5Ljg4NGM0Ny4wNzcsOS45NDEsOTUuNjAzLDE3LjU4MiwxNDMuOTIxLDE3LjkyNCBjNDguMzE4LTAuMzQzLDk2Ljg0NC03Ljk4MywxNDMuOTIxLTE3LjkyNGMyNC4zNzUtNS4xNDUsNDguNTktMTEuNDI0LDcyLjA0MS0xOS44ODQJQzU0MC42OTQsNTY3LjQzNSw1NTEuNzQ3LDU2NC4yOTcsNTUwLjk4MSw1NDEuOTA4eiIvPjwvZz48L3N2Zz4=') no-repeat center} #wpmchimpa .wpmc-ficon [wpmcfield="LNAME"] ~ .inputicon { background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNjEyIDYxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjEyIDYxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZD0iTTMwNi4wMDEsMzI1Ljk4OGM5MC41NjMtMC4wMDUsMTIzLjE0Ny05MC42ODIsMTMxLjY3OS0xNjUuMTY3QzQ0OC4xODgsNjkuMDYsNDA0Ljc5OSwwLDMwNi4wMDEsMCBjLTk4Ljc4MiwwLTE0Mi4xOTUsNjkuMDU1LTEzMS42NzksMTYwLjgyQzE4Mi44NjIsMjM1LjMwNCwyMTUuNDM2LDMyNS45OTUsMzA2LjAwMSwzMjUuOTg4eiIvPjxwYXRoIGQ9Ik01NTAuOTgxLDU0MS45MDhjLTAuOTktMjguOTA0LTQuMzc3LTU3LjkzOS05LjQyMS04Ni4zOTNjLTYuMTExLTM0LjQ2OS0xMy44ODktODUuMDAyLTQzLjk4My0xMDcuNDY1IGMtMTcuNDA0LTEyLjk4OC0zOS45NDEtMTcuMjQ5LTU5Ljg2NS0yNS4wODFjLTkuNjk3LTMuODEtMTguMzg0LTcuNTk0LTI2LjUzNy0xMS45MDFjLTI3LjUxOCwzMC4xNzYtNjMuNCw0NS45NjItMTA1LjE4Niw0NS45NjQgYy00MS43NzQsMC03Ny42NTItMTUuNzg2LTEwNS4xNjctNDUuOTY0Yy04LjE1Myw0LjMwOC0xNi44NCw4LjA5My0yNi41MzcsMTEuOTAxYy0xOS45MjQsNy44MzItNDIuNDYxLDEyLjA5Mi01OS44NjMsMjUuMDgxIGMtMzAuMDk2LDIyLjQ2My0zNy44NzMsNzIuOTk2LTQzLjk4MywxMDcuNDY1Yy01LjA0NSwyOC40NTQtOC40MzMsNTcuNDg5LTkuNDIyLDg2LjM5MwljLTAuNzY2LDIyLjM4NywxMC4yODgsMjUuNTI1LDI5LjAxNywzMi4yODRjMjMuNDUzLDguNDU4LDQ3LjY2NiwxNC43MzcsNzIuMDQxLDE5Ljg4NGM0Ny4wNzcsOS45NDEsOTUuNjAzLDE3LjU4MiwxNDMuOTIxLDE3LjkyNCBjNDguMzE4LTAuMzQzLDk2Ljg0NC03Ljk4MywxNDMuOTIxLTE3LjkyNGMyNC4zNzUtNS4xNDUsNDguNTktMTEuNDI0LDcyLjA0MS0xOS44ODQJQzU0MC42OTQsNTY3LjQzNSw1NTEuNzQ3LDU2NC4yOTcsNTUwLjk4MSw1NDEuOTA4eiIvPjwvZz48L3N2Zz4=') no-repeat center} #wpmchimpa .wpmchimpa-field textarea, #wpmchimpa .wpmchimpa-field select, #wpmchimpa input[type="text"]{ text-align: left; width: 100%; height: 40px; border-radius:3px; background: #fff; padding: 0 10px; color: #353535; font-size:17px; outline:0; display: block; border: 1px solid #efefef; font-family:Tahoma, Geneva, sans-serif;font-size:15px;color:#696565;} #wpmchimpa .wpmchimpa-field.wpmchimpa-multidrop select{ height: 100px; } #wpmchimpa .wpmchimpa-field.wpmchimpa-drop:before{ content: ''; width: 40px; height: 40px; position: absolute; right: 0; top: 0; pointer-events: none; background: no-repeat center; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMDAiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgOTQuODU5IDk0Ljg1OSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgOTQuODU5IDk0Ljg1OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTE3LjMxMiw0MS43NTdoNjAuMjM2YzAuNzcsMCwxLjQ2OS0wLjQ0LDEuODAyLTEuMTMzYzAuMzM0LTAuNjkxLDAuMjQxLTEuNTE0LTAuMjM3LTIuMTE0TDQ4Ljk5NCwwLjc1MyBDNDguNjE0LDAuMjc3LDQ4LjAzOSwwLDQ3LjQzMSwwcy0xLjE4NCwwLjI3Ny0xLjU2MywwLjc1M0wxNS43NDgsMzguNTFjLTAuNDc5LDAuNjAxLTAuNTcyLDEuNDIzLTAuMjM4LDIuMTE0IEMxNS44NDMsNDEuMzE3LDE2LjU0Miw0MS43NTcsMTcuMzEyLDQxLjc1N3oiLz4gPHBhdGggZD0iTTc3LjU0Nyw1My4xMDJIMTcuMzEyYy0wLjc2OSwwLTEuNDY5LDAuNDM5LTEuODAyLDEuMTMzYy0wLjMzNCwwLjY5MS0wLjI0MSwxLjUxNCwwLjIzOCwyLjExM2wzMC4xMTksMzcuNzU4IGMwLjM4LDAuNDc2LDAuOTU1LDAuNzUzLDEuNTYzLDAuNzUzczEuMTg0LTAuMjc3LDEuNTYzLTAuNzUzTDc5LjExLDU2LjM0OGMwLjQ3OS0wLjYwMSwwLjU3MS0xLjQyMiwwLjIzNy0yLjExMyBDNzkuMDE2LDUzLjU0MSw3OC4zMTcsNTMuMTAyLDc3LjU0Nyw1My4xMDJ6Ii8+PC9zdmc+'); } #wpmchimpa input[type="text"] ~ .inputlabel{ position: absolute; top: 0; left: 0; right: 0; pointer-events: none; width: 100%; line-height: 40px; color: rgba(0,0,0,0.6); font-size: 17px; font-weight:500; padding: 0 10px; white-space: nowrap; font-family:Tahoma, Geneva, sans-serif;font-size:15px;color:#696565;} #wpmchimpa input[type="text"]:valid + .inputlabel{ display: none; } #wpmchimpa select.wpmcerror, #wpmchimpa input[type="text"].wpmcerror{ border-color: red; } #wpmchimpa .wpmchimpa-check, #wpmchimpa .wpmchimpa-radio{ clear: both; } #wpmchimpa .wpmchimpa-check *, #wpmchimpa .wpmchimpa-radio *{ color: #fff; font-family:Tahoma, Geneva, sans-serif;font-size:14px;font-weight:normal;font-style:normal;color:#3d3d3d;} #wpmchimpa .wpmchimpa-item{ width:100%; display: inline-block; vertical-align: top; } #wpmchimpa .wpmchimpa-item input { display: none; } #wpmchimpa .wpmchimpa-item span { cursor: pointer; display: inline-block; position: relative; padding-left: 35px; line-height: 20px; margin-right: 10px; } #wpmchimpa .wpmchimpa-item span:before, #wpmchimpa .wpmchimpa-item span:after { content: ''; display: inline-block; width: 12px; height: 12px; left: 0; top: 4px; position: absolute; } #wpmchimpa .wpmchimpa-item span:before { border:1px solid #ccc; border-radius: 1px; background-color: #fff; -webkit-transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out; border: 1px solid#f34b38;background: #ffffff;} #wpmchimpa .wpmchimpa-item input[type='checkbox'] + span:hover:after, #wpmchimpa input[type='checkbox']:checked + span:after { content:''; width: 14px; height: 14px; background: no-repeat center; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMDAwMDAiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iOHB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDIzMCAyMzAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDIzMCAyMzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGQ9Ik05Mi4zNTYsMjIzLjU0OWM3LjQxLDcuNSwyMy45MTQsNS4wMTQsMjUuNjkxLTYuNzc5YzExLjA1Ni03My4yMTcsNjYuMzc4LTEzNC45ODUsMTA4LjI0My0xOTMuMTg5IEMyMzcuODk4LDcuNDUyLDIxMS4yMDctNy44NywxOTkuNzUsOC4wNjdDMTYxLjQ5Myw2MS4yNDksMTEzLjI3NCwxMTcuMjEsOTQuNDEsMTgxLjc0NCBjLTIxLjU1Ny0yMi4wMzEtNDMuMjAxLTQzLjg1My02Ny4zNzktNjMuMjEyYy0xNS4zMTItMTIuMjY1LTM3LjIxNSw5LjM0My0yMS43MzgsMjEuNzM3IEMzNi43OTQsMTY1LjUwMSw2NC4wMTcsMTk0LjkyNCw5Mi4zNTYsMjIzLjU0OXoiLz48L3N2Zz4='); } #wpmchimpa .wpmchimpa-item input[type='checkbox']:not(:checked) + span:hover:after { opacity: 0.5; } #wpmchimpa .wpmchimpa-item input[type='radio'] + span:before { border-radius: 50%; width: 12px; height: 12px; top: 4px; } #wpmchimpa input[type='radio']:checked + span:after { background: #000000; width: 8px; height: 8px; top: 6px; left: 2px; border-radius: 50%; } #wpmchimpa .wpmcinfierr{ display: block; height: 10px; text-align: left; line-height: 10px; margin-bottom: -10px; font-size: 10px; color: red; pointer-events: none; font-family:Tahoma, Geneva, sans-serif;} #wpmchimpa .wpmchimpa-subs-button{ border-radius: 0 3px 3px 0; width: 100%; color: #fff; font-size: 17px; border: 1px solid #FA0B38; background-color: #FF1F43; height: 40px; line-height: 40px; text-align: center; cursor: pointer; position: relative; top: 0; font-family:Tahoma, Geneva, sans-serif;font-size:16px;font-weight:normal;font-style:normal;color:#ffffff;background-color:#f34b38;} #wpmchimpa .wpmchimpa-subs-button::before{ content: 'Подписаться'; } #wpmchimpa .wpmchimpa-subs-button:hover{ background-color: #FA0B38; color:#ffffff;background-color:#75c462;} #wpmchimpa .wpmchimpa-subs-button.subsicon:before{ padding-left: 40px; } #wpmchimpa .wpmchimpa-subs-button.subsicon::after{ content:''; position: absolute; height: 40px; width: 40px; top: 0; left: 0; pointer-events: none; } .wpmchimpa-overlay-bg.signalshow .wpmchimpa-subs-button::after, .wpmchimpa-overlay-bg.signalshow .wpmchimpa-subs-button::before{ display: none; } #wpmchimpa-main .wpmchimpa-signal { display: none; z-index: 1; top: 5px; left: calc(50% - 20px); position: absolute; -webkit-transform: scale(0.8); -ms-transform: scale(0.8); transform: scale(0.8); } .wpmchimpa-overlay-bg.signalshow #wpmchimpa-main .wpmchimpa-signal { display: inline-block; } #wpmchimpa-main .wpmchimpa-feedback{ text-align: center; position: relative; color: #ccc; font-size: 10px; height: 12px; margin-top: -12px; font-family:Tahoma, Geneva, sans-serif;color:#3d3d3d;} #wpmchimpa-main .wpmchimpa-tag{ margin: 5px auto; } #wpmchimpa-main .wpmchimpa-tag, #wpmchimpa-main .wpmchimpa-tag *{ color:#fff; font-size: 10px; font-family:Tahoma, Geneva, sans-serif;font-size:10px;color:#3d3d3d;} #wpmchimpa-main .wpmchimpa-tag:before{ content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMzZDNkM2QiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTBweCIgaGVpZ2h0PSIxMHB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTQxNy41NjYsMjA5LjgzaC05LjQ4NHYtNDQuMzg4YzAtODIuMDk5LTY1LjE1MS0xNTAuNjgxLTE0Ni41ODItMTUyLjE0NWMtMi4yMjQtMC4wNC02LjY3MS0wLjA0LTguODk1LDAgYy04MS40MzIsMS40NjQtMTQ2LjU4Miw3MC4wNDYtMTQ2LjU4MiwxNTIuMTQ1djQ0LjM4OGgtOS40ODVDODEuOTIyLDIwOS44Myw3MCwyMjQuOTEyLDcwLDI0My41Mzl2MjIyLjYzMiAgQzcwLDQ4NC43NzcsODEuOTIyLDUwMCw5Ni41MzksNTAwaDMyMS4wMjhjMTQuNjE3LDAsMjYuNTM5LTE1LjIyMywyNi41MzktMzMuODI5VjI0My41MzkgIEM0NDQuMTA1LDIyNC45MTIsNDMyLjE4NCwyMDkuODMsNDE3LjU2NiwyMDkuODN6IE0yODcuMTI5LDM1NC42Mjl2NjcuMjdjMCw3LjcwNC02LjQ0OSwxNC4yMjItMTQuMTU5LDE0LjIyMmgtMzEuODM0ICBjLTcuNzEsMC0xNC4xNTktNi41MTgtMTQuMTU5LTE0LjIyMnYtNjcuMjdjLTcuNDc3LTcuMzYxLTExLjgzLTE3LjUzNy0xMS44My0yOC43OTVjMC0yMS4zMzQsMTYuNDkxLTM5LjY2NiwzNy40NTktNDAuNTEyICBjMi4yMjItMC4wOSw2LjY3My0wLjA5LDguODk1LDBjMjAuOTY4LDAuODQ2LDM3LjQ1OSwxOS4xNzgsMzcuNDU5LDQwLjUxMkMyOTguOTU5LDMzNy4wOTIsMjk0LjYwNSwzNDcuMjY4LDI4Ny4xMjksMzU0LjYyOXogTTM0NS41NzIsMjA5LjgzSDI2MS41aC04Ljg5NWgtODQuMDcydi00NC4zODhjMC00OC45MDUsMzkuNzQ0LTg5LjM0Miw4OC41MTktODkuMzQyczg4LjUyLDQwLjQzNyw4OC41Miw4OS4zNDJWMjA5LjgzeiIvPjwvc3ZnPg=='); margin: 5px; top: 1px; position:relative; } #wpmchimpa-main .wpmchimpa-social{ display: inline-block; margin: 12px auto 0; height: 90px; width: 100%; background: rgba(75, 75, 75, 0.3); box-shadow: 0px 1px 1px 1px rgba(116, 116, 116, 0.94); } #wpmchimpa-main .wpmchimpa-social::before{ content: 'Subscribe with'; font-size: 13px; color: #ADACB2; width: 100%; display: block; margin: 15px auto 5px; } #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc{ display: inline-block; width:40px; height: 40px; border-radius: 2px; cursor: pointer; -webkit-transition: all 0.1s ease; transition: all 0.1s ease; -webkit-backface-visibility:hidden; border:1px solid #262E43; border-color: #ffffff;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc::before{ content: ''; display: block; width:40px; height: 40px; background: no-repeat center; } #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-fb { display:none;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-fb::before { background-image:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI5Ni4yOTYsNTEySDIwMC4zNlYyNTZoLTY0di04OC4yMjVsNjQtMC4wMjlsLTAuMTA0LTUxLjk3NkMyMDAuMjU2LDQzLjc5NCwyMTkuNzczLDAsMzA0LjU1NiwwaDcwLjU4OHY4OC4yNDJoLTQ0LjExNSBjLTMzLjAxNiwwLTM0LjYwNCwxMi4zMjgtMzQuNjA0LDM1LjM0MmwtMC4xMzEsNDQuMTYyaDc5LjM0NmwtOS4zNTQsODguMjI1TDI5Ni4zNiwyNTZMMjk2LjI5Niw1MTJ6Ii8+PC9zdmc+')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-fb:hover:before { background-image:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMyZDYwOWIiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI5Ni4yOTYsNTEySDIwMC4zNlYyNTZoLTY0di04OC4yMjVsNjQtMC4wMjlsLTAuMTA0LTUxLjk3NkMyMDAuMjU2LDQzLjc5NCwyMTkuNzczLDAsMzA0LjU1NiwwaDcwLjU4OHY4OC4yNDJoLTQ0LjExNSBjLTMzLjAxNiwwLTM0LjYwNCwxMi4zMjgtMzQuNjA0LDM1LjM0MmwtMC4xMzEsNDQuMTYyaDc5LjM0NmwtOS4zNTQsODguMjI1TDI5Ni4zNiwyNTZMMjk2LjI5Niw1MTJ6Ii8+PC9zdmc+')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-gp { display:none;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-gp:before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI3My4zNzIsMzAyLjQ5OGMtNS4wNDEtNi43NjItMTAuNjA4LTEzLjA0NS0xNi43LTE4Ljg0MmMtNi4wOTEtNS44MDQtMTIuMTgzLTExLjA4OC0xOC4yNzEtMTUuODQ1IGMtNi4wOTItNC43NTctMTEuNjU5LTkuMzI5LTE2LjcwMi0xMy43MDljLTUuMDQyLTQuMzc0LTkuMTM1LTguOTQ1LTEyLjI3NS0xMy43MDJjLTMuMTQtNC43NTctNC43MTEtOS42MS00LjcxMS0xNC41NTggYzAtNi44NTUsMi4xOS0xMy4yNzgsNi41NjctMTkuMjc0YzQuMzc3LTUuOTk2LDkuNzA3LTExLjc5OSwxNS45ODYtMTcuNDE3YzYuMjgtNS42MTcsMTIuNTU5LTExLjc1MywxOC44NDQtMTguNDE1IGM2LjI3Ni02LjY2NSwxMS42MDQtMTUuNDY1LDE1Ljk4NS0yNi40MTJjNC4zNzMtMTAuOTQ0LDYuNTYzLTIzLjQ1OCw2LjU2My0zNy41NDJjMC0xNi43NS0zLjcxMy0zMi44MzUtMTEuMTM2LTQ4LjI1IGMtNy40MjMtMTUuNDE4LTE3Ljg5LTI3LjQxMi0zMS40MDUtMzUuOTc2aDM4LjU0TDMwMy4yLDBIMTc4LjQ0MWMtMTcuNjk5LDAtMzUuNDk4LDEuOTA2LTUzLjM4NCw1LjcyIGMtMjYuNDUzLDUuOS00OC43MjMsMTkuMzY4LTY2LjgwNiw0MC4zOTdDNDAuMTcxLDY3LjE1LDMxLjEyOSw5MC45OSwzMS4xMjksMTE3LjYzN2MwLDI4LjE3MSwxMC4xMzgsNTEuNTgzLDMwLjQwNiw3MC4yMzMgYzIwLjI2OSwxOC42NDksNDQuNTg1LDI3Ljk3OCw3Mi45NDUsMjcuOTc4YzUuNzEsMCwxMi4zNzEtMC40NzgsMTkuOTg1LTEuNDI3Yy0wLjM4MSwxLjUyMS0xLjA0MywzLjU2Ny0xLjk5Nyw2LjEzNiBzLTEuNzE1LDQuNjItMi4yODYsNi4xNGMtMC41NywxLjUyMS0xLjA0NywzLjM3NS0xLjQyNSw1LjU2NmMtMC4zODIsMi4xOS0wLjU3MSw0LjQyOC0wLjU3MSw2LjcxIGMwLDEyLjU2Myw2LjA4NiwyNi43NDQsMTguMjcxLDQyLjU0MWMtMTQuNDY1LDAuMzg3LTI4LjczNywxLjY3LTQyLjgyNSwzLjg2Yy0xNC4wODQsMi4xOS0yOC44MzMsNS42MTYtNDQuMjUyLDEwLjI4IGMtMTUuNDE3LDQuNjYxLTI5LjIxNywxMS40Mi00MS4zOTYsMjAuMjdjLTEyLjE4Miw4Ljg1NC0yMS4zMTcsMTkuMzY2LTI3LjQwOCwzMS41NDlDMy41MzMsMzYxLjU1OSwwLjAxLDM3NC40MDUsMC4wMSwzODYuMDE3IGMwLDEyLjc1MSwyLjg1NywyNC4zMTQsOC41NjUsMzQuNjljNS43MDgsMTAuMzY5LDEzLjAzNSwxOC44NDIsMjEuOTgyLDI1LjQwNmM4Ljk0NSw2LjU3LDE5LjI3MywxMi4wODMsMzAuOTc4LDE2LjU2MiBjMTEuNzA0LDQuNDcsMjMuMzE1LDcuNjU5LDM0LjgyOSw5LjU2MmMxMS41MTYsMS45MDMsMjIuODg4LDIuODU0LDM0LjExOSwyLjg1NGM1MS4wMDcsMCw5MC45ODEtMTIuNDY0LDExOS45MDktMzcuMzk3IGMyNi42NDgtMjMuMjIzLDM5Ljk3MS01MC4wNjIsMzkuOTcxLTgwLjUxN2MwLTEwLjg1NS0xLjU3LTIwLjk4NC00LjcxMi0zMC40MDlDMjgyLjUxLDMxNy4zMzcsMjc4LjQyLDMwOS4yNTQsMjczLjM3MiwzMDIuNDk4eiBNMTYzLjMxMSwxOTguNzIyYy05LjcwNywwLTE4LjkzNy0yLjQ3NS0yNy42OTQtNy40MjZjLTguNzU3LTQuOTUtMTYuMTgtMTEuMzc0LTIyLjI3LTE5LjI3MyBjLTYuMDg4LTcuODk4LTExLjQxOC0xNi43OTYtMTUuOTg3LTI2LjY5NWMtNC41NjctOS44OTYtNy45NDQtMTkuNzkyLTEwLjEzNS0yOS42OTJjLTIuMTktOS44OTUtMy4yODQtMTkuMzE4LTMuMjg0LTI4LjI2NSBjMC0xOC4yNzEsNC44NTQtMzMuOTc0LDE0LjU2Mi00Ny4xMDhjOS43MDUtMTMuMTM0LDIzLjQxMS0xOS43MDEsNDEuMTEyLTE5LjcwMWMxMi41NjMsMCwyMy45MzUsMy44OTksMzQuMTE4LDExLjcwNCBjMTAuMTgzLDcuODA0LDE4LjE3NywxNy43MDEsMjMuOTg0LDI5LjY5MmM1LjgwMiwxMS45OTEsMTAuMjc3LDI0LjQwNywxMy40MTcsMzcuMjU3YzMuMTQsMTIuODQ3LDQuNzExLDI0Ljk4Myw0LjcxMSwzNi40MDMgYzAsMTkuMDM2LTQuMTM5LDM0LjMxNy0xMi40MTksNDUuODMzQzE5NS4xNDQsMTkyLjk2NCwxODEuNzc1LDE5OC43MjIsMTYzLjMxMSwxOTguNzIyeiBNMjQyLjI1MSw0MTMuMTIzIGMtNS4yMyw4Ljk0OS0xMi4zMTksMTUuOTQtMjEuMjY3LDIwLjk4MWMtOC45NDYsNS4wNDgtMTguNTA5LDguNzU4LTI4LjY5MywxMS4xNGMtMTAuMTgzLDIuMzg1LTIwLjg4OSwzLjU3Mi0zMi4xMiwzLjU3MiBjLTEyLjE4MiwwLTI0LjI3LTEuNDMxLTM2LjI1OC00LjI4NGMtMTEuOTktMi44NTEtMjMuNDU5LTcuMTg3LTM0LjQwMy0xMi45OTFjLTEwLjk0NC01LjgtMTkuNzk1LTEzLjc5OC0yNi41NTEtMjMuOTgyIGMtNi43NTctMTAuMTg0LTEwLjEzNS0yMS43NDQtMTAuMTM1LTM0LjY5YzAtMTEuNDE5LDIuNTY4LTIxLjYwMSw3LjcwOC0zMC41NWM1LjE0Mi04Ljk0NSwxMS43MDktMTYuMDg0LDE5LjcwMi0yMS40MDggYzcuOTk0LTUuMzMyLDE3LjMxOS05LjcxMywyNy45NzktMTMuMTMxYzEwLjY2LTMuNDMzLDIwLjkzNy01LjgwOCwzMC44MzMtNy4xMzljOS44OTUtMS4zMzUsMTkuOTg1LTEuOTk1LDMwLjI2Mi0xLjk5NSBjNi4yODMsMCwxMS4wNDMsMC4xOTEsMTQuMjc3LDAuNTY3YzEuMTQzLDAuNzY3LDQuMDQzLDIuNzU5LDguNzA4LDUuOTk2czcuODA0LDUuNDI4LDkuNDIzLDYuNTcgYzEuNjE1LDEuMTM3LDQuNTY3LDMuMzI2LDguODUsNi41NjNjNC4yODEsMy4yMzcsNy4zMjcsNS42NjEsOS4xMzUsNy4yNzljMS44MDMsMS42MTgsNC40MjEsNC4wNDUsNy44NDksNy4yNzkgYzMuNDI0LDMuMjM3LDUuOTQ4LDYuMDQzLDcuNTY2LDguNDIyYzEuNjE1LDIuMzc4LDMuNjE2LDUuMjgsNS45OTYsOC43MDJjMi4zOCwzLjQzMyw0LjA0Myw2LjcxNSw0Ljk5OCw5Ljg1NSBjMC45NDgsMy4xNDIsMS44NTQsNi41NjcsMi43MDcsMTAuMjc3YzAuODU1LDMuNzIsMS4yODMsNy41NjksMS4yODMsMTEuNTdDMjUwLjEwNSwzOTMuNzEzLDI0Ny40ODcsNDA0LjE4MiwyNDIuMjUxLDQxMy4xMjN6Ii8+IDxwb2x5Z29uIHBvaW50cz0iNDAxLjk5OCw3My4wODkgNDAxLjk5OCwwIDM2NS40NDksMCAzNjUuNDQ5LDczLjA4OSAyOTIuMzU4LDczLjA4OSAyOTIuMzU4LDEwOS42MzYgMzY1LjQ0OSwxMDkuNjM2ICAzNjUuNDQ5LDE4Mi43MjUgNDAxLjk5OCwxODIuNzI1IDQwMS45OTgsMTA5LjYzNiA0NzUuMDgxLDEwOS42MzYgNDc1LjA4MSw3My4wODkiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-gp:hover:before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNlYjQwMjYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTI3My4zNzIsMzAyLjQ5OGMtNS4wNDEtNi43NjItMTAuNjA4LTEzLjA0NS0xNi43LTE4Ljg0MmMtNi4wOTEtNS44MDQtMTIuMTgzLTExLjA4OC0xOC4yNzEtMTUuODQ1IGMtNi4wOTItNC43NTctMTEuNjU5LTkuMzI5LTE2LjcwMi0xMy43MDljLTUuMDQyLTQuMzc0LTkuMTM1LTguOTQ1LTEyLjI3NS0xMy43MDJjLTMuMTQtNC43NTctNC43MTEtOS42MS00LjcxMS0xNC41NTggYzAtNi44NTUsMi4xOS0xMy4yNzgsNi41NjctMTkuMjc0YzQuMzc3LTUuOTk2LDkuNzA3LTExLjc5OSwxNS45ODYtMTcuNDE3YzYuMjgtNS42MTcsMTIuNTU5LTExLjc1MywxOC44NDQtMTguNDE1IGM2LjI3Ni02LjY2NSwxMS42MDQtMTUuNDY1LDE1Ljk4NS0yNi40MTJjNC4zNzMtMTAuOTQ0LDYuNTYzLTIzLjQ1OCw2LjU2My0zNy41NDJjMC0xNi43NS0zLjcxMy0zMi44MzUtMTEuMTM2LTQ4LjI1IGMtNy40MjMtMTUuNDE4LTE3Ljg5LTI3LjQxMi0zMS40MDUtMzUuOTc2aDM4LjU0TDMwMy4yLDBIMTc4LjQ0MWMtMTcuNjk5LDAtMzUuNDk4LDEuOTA2LTUzLjM4NCw1LjcyIGMtMjYuNDUzLDUuOS00OC43MjMsMTkuMzY4LTY2LjgwNiw0MC4zOTdDNDAuMTcxLDY3LjE1LDMxLjEyOSw5MC45OSwzMS4xMjksMTE3LjYzN2MwLDI4LjE3MSwxMC4xMzgsNTEuNTgzLDMwLjQwNiw3MC4yMzMgYzIwLjI2OSwxOC42NDksNDQuNTg1LDI3Ljk3OCw3Mi45NDUsMjcuOTc4YzUuNzEsMCwxMi4zNzEtMC40NzgsMTkuOTg1LTEuNDI3Yy0wLjM4MSwxLjUyMS0xLjA0MywzLjU2Ny0xLjk5Nyw2LjEzNiBzLTEuNzE1LDQuNjItMi4yODYsNi4xNGMtMC41NywxLjUyMS0xLjA0NywzLjM3NS0xLjQyNSw1LjU2NmMtMC4zODIsMi4xOS0wLjU3MSw0LjQyOC0wLjU3MSw2LjcxIGMwLDEyLjU2Myw2LjA4NiwyNi43NDQsMTguMjcxLDQyLjU0MWMtMTQuNDY1LDAuMzg3LTI4LjczNywxLjY3LTQyLjgyNSwzLjg2Yy0xNC4wODQsMi4xOS0yOC44MzMsNS42MTYtNDQuMjUyLDEwLjI4IGMtMTUuNDE3LDQuNjYxLTI5LjIxNywxMS40Mi00MS4zOTYsMjAuMjdjLTEyLjE4Miw4Ljg1NC0yMS4zMTcsMTkuMzY2LTI3LjQwOCwzMS41NDlDMy41MzMsMzYxLjU1OSwwLjAxLDM3NC40MDUsMC4wMSwzODYuMDE3IGMwLDEyLjc1MSwyLjg1NywyNC4zMTQsOC41NjUsMzQuNjljNS43MDgsMTAuMzY5LDEzLjAzNSwxOC44NDIsMjEuOTgyLDI1LjQwNmM4Ljk0NSw2LjU3LDE5LjI3MywxMi4wODMsMzAuOTc4LDE2LjU2MiBjMTEuNzA0LDQuNDcsMjMuMzE1LDcuNjU5LDM0LjgyOSw5LjU2MmMxMS41MTYsMS45MDMsMjIuODg4LDIuODU0LDM0LjExOSwyLjg1NGM1MS4wMDcsMCw5MC45ODEtMTIuNDY0LDExOS45MDktMzcuMzk3IGMyNi42NDgtMjMuMjIzLDM5Ljk3MS01MC4wNjIsMzkuOTcxLTgwLjUxN2MwLTEwLjg1NS0xLjU3LTIwLjk4NC00LjcxMi0zMC40MDlDMjgyLjUxLDMxNy4zMzcsMjc4LjQyLDMwOS4yNTQsMjczLjM3MiwzMDIuNDk4eiBNMTYzLjMxMSwxOTguNzIyYy05LjcwNywwLTE4LjkzNy0yLjQ3NS0yNy42OTQtNy40MjZjLTguNzU3LTQuOTUtMTYuMTgtMTEuMzc0LTIyLjI3LTE5LjI3MyBjLTYuMDg4LTcuODk4LTExLjQxOC0xNi43OTYtMTUuOTg3LTI2LjY5NWMtNC41NjctOS44OTYtNy45NDQtMTkuNzkyLTEwLjEzNS0yOS42OTJjLTIuMTktOS44OTUtMy4yODQtMTkuMzE4LTMuMjg0LTI4LjI2NSBjMC0xOC4yNzEsNC44NTQtMzMuOTc0LDE0LjU2Mi00Ny4xMDhjOS43MDUtMTMuMTM0LDIzLjQxMS0xOS43MDEsNDEuMTEyLTE5LjcwMWMxMi41NjMsMCwyMy45MzUsMy44OTksMzQuMTE4LDExLjcwNCBjMTAuMTgzLDcuODA0LDE4LjE3NywxNy43MDEsMjMuOTg0LDI5LjY5MmM1LjgwMiwxMS45OTEsMTAuMjc3LDI0LjQwNywxMy40MTcsMzcuMjU3YzMuMTQsMTIuODQ3LDQuNzExLDI0Ljk4Myw0LjcxMSwzNi40MDMgYzAsMTkuMDM2LTQuMTM5LDM0LjMxNy0xMi40MTksNDUuODMzQzE5NS4xNDQsMTkyLjk2NCwxODEuNzc1LDE5OC43MjIsMTYzLjMxMSwxOTguNzIyeiBNMjQyLjI1MSw0MTMuMTIzIGMtNS4yMyw4Ljk0OS0xMi4zMTksMTUuOTQtMjEuMjY3LDIwLjk4MWMtOC45NDYsNS4wNDgtMTguNTA5LDguNzU4LTI4LjY5MywxMS4xNGMtMTAuMTgzLDIuMzg1LTIwLjg4OSwzLjU3Mi0zMi4xMiwzLjU3MiBjLTEyLjE4MiwwLTI0LjI3LTEuNDMxLTM2LjI1OC00LjI4NGMtMTEuOTktMi44NTEtMjMuNDU5LTcuMTg3LTM0LjQwMy0xMi45OTFjLTEwLjk0NC01LjgtMTkuNzk1LTEzLjc5OC0yNi41NTEtMjMuOTgyIGMtNi43NTctMTAuMTg0LTEwLjEzNS0yMS43NDQtMTAuMTM1LTM0LjY5YzAtMTEuNDE5LDIuNTY4LTIxLjYwMSw3LjcwOC0zMC41NWM1LjE0Mi04Ljk0NSwxMS43MDktMTYuMDg0LDE5LjcwMi0yMS40MDggYzcuOTk0LTUuMzMyLDE3LjMxOS05LjcxMywyNy45NzktMTMuMTMxYzEwLjY2LTMuNDMzLDIwLjkzNy01LjgwOCwzMC44MzMtNy4xMzljOS44OTUtMS4zMzUsMTkuOTg1LTEuOTk1LDMwLjI2Mi0xLjk5NSBjNi4yODMsMCwxMS4wNDMsMC4xOTEsMTQuMjc3LDAuNTY3YzEuMTQzLDAuNzY3LDQuMDQzLDIuNzU5LDguNzA4LDUuOTk2czcuODA0LDUuNDI4LDkuNDIzLDYuNTcgYzEuNjE1LDEuMTM3LDQuNTY3LDMuMzI2LDguODUsNi41NjNjNC4yODEsMy4yMzcsNy4zMjcsNS42NjEsOS4xMzUsNy4yNzljMS44MDMsMS42MTgsNC40MjEsNC4wNDUsNy44NDksNy4yNzkgYzMuNDI0LDMuMjM3LDUuOTQ4LDYuMDQzLDcuNTY2LDguNDIyYzEuNjE1LDIuMzc4LDMuNjE2LDUuMjgsNS45OTYsOC43MDJjMi4zOCwzLjQzMyw0LjA0Myw2LjcxNSw0Ljk5OCw5Ljg1NSBjMC45NDgsMy4xNDIsMS44NTQsNi41NjcsMi43MDcsMTAuMjc3YzAuODU1LDMuNzIsMS4yODMsNy41NjksMS4yODMsMTEuNTdDMjUwLjEwNSwzOTMuNzEzLDI0Ny40ODcsNDA0LjE4MiwyNDIuMjUxLDQxMy4xMjN6Ii8+IDxwb2x5Z29uIHBvaW50cz0iNDAxLjk5OCw3My4wODkgNDAxLjk5OCwwIDM2NS40NDksMCAzNjUuNDQ5LDczLjA4OSAyOTIuMzU4LDczLjA4OSAyOTIuMzU4LDEwOS42MzYgMzY1LjQ0OSwxMDkuNjM2ICAzNjUuNDQ5LDE4Mi43MjUgNDAxLjk5OCwxODIuNzI1IDQwMS45OTgsMTA5LjYzNiA0NzUuMDgxLDEwOS42MzYgNDc1LjA4MSw3My4wODkiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-ms { display:none;} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-ms::before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTcgMTciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE3IDE3IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNOC4wMjEsMS4zODV2Ni40MzdoOC43OTFWMC4xMjdMOC4wMjEsMS4zODV6IE0wLDcuODIyaDYuNjQ4VjEuNDk0TDAsMi40NDNWNy44MjJ6IE0wLDE0LjE3NSBsNi42NDgsMS4wMzFWOC42M0gwVjE0LjE3NXogTTguMDIxLDE1LjMyMWw4Ljc5MSwxLjM2NFY4LjYzSDguMDIxVjE1LjMyMXoiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-social .wpmchimpa-soc.wpmchimpa-ms:hover:before { background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMEJDRjIiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMTcgMTciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE3IDE3IiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNOC4wMjEsMS4zODV2Ni40MzdoOC43OTFWMC4xMjdMOC4wMjEsMS4zODV6IE0wLDcuODIyaDYuNjQ4VjEuNDk0TDAsMi40NDNWNy44MjJ6IE0wLDE0LjE3NSBsNi42NDgsMS4wMzFWOC42M0gwVjE0LjE3NXogTTguMDIxLDE1LjMyMWw4Ljc5MSwxLjM2NFY4LjYzSDguMDIxVjE1LjMyMXoiLz48L3N2Zz4=')} #wpmchimpa-main .wpmchimpa-close-button{ position: absolute; display: block; top: 0; right: 0; width: 25px; text-align: center; cursor: pointer; } #wpmchimpa-main .wpmchimpa-close-button::before{ content: "\00D7"; font-size: 25px; line-height: 25px; font-weight: 100; color: #999; opacity: 0.4; color:;} #wpmchimpa-main .wpmchimpa-close-button:hover:before{ opacity: 1; } #wpmchimpa-main .wpmchimpa-feedback.wpmchimpa-done{ font-size: 15px; margin: 10px; height: auto;} #wpmchimpa-main .wpmchimpa-feedback.wpmchimpa-done:before{ content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiNmZmYiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNTEyIDUxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSIxNDIuOCwzMjMuODUgMzUuNywyMTYuNzUgMCwyNTIuNDUgMTQyLjgsMzk1LjI1IDQ0OC44LDg5LjI1IDQxMy4xLDUzLjU1Ii8+PC9zdmc+'); width: 40px; height: 40px; border-radius: 20px; line-height: 46px; display: block; background-color: #01E169; margin: 40px auto; } .wpmc_2col #wpmchimpa .wpmc_colsplit{ width: calc(50% - 5px); display: inline-block; float: left; } .wpmc_2col #wpmchimpa .wpmc_coleven{ margin-left: 10px; } @media only screen and (max-width: 600px){ .wpmc_2col #wpmchimpa .wpmc_colsplit{ width: 100%; margin-left: 0; } } .animated { -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes bounceInDown { 0%, 60%, 75%, 90%, 100% { -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 0; -webkit-transform: translate3d(0, -3000px, 0); transform: translate3d(0, -3000px, 0); } 60% { opacity: 1; -webkit-transform: translate3d(0, 25px, 0); transform: translate3d(0, 25px, 0); } 75% { -webkit-transform: translate3d(0, -10px, 0); transform: translate3d(0, -10px, 0); } 90% { -webkit-transform: translate3d(0, 5px, 0); transform: translate3d(0, 5px, 0); } 100% { -webkit-transform: none; transform: none; } } @keyframes bounceInDown { 0%, 60%, 75%, 90%, 100% { -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 0; -webkit-transform: translate3d(0, -3000px, 0); transform: translate3d(0, -3000px, 0); } 60% { opacity: 1; -webkit-transform: translate3d(0, 25px, 0); transform: translate3d(0, 25px, 0); } 75% { -webkit-transform: translate3d(0, -10px, 0); transform: translate3d(0, -10px, 0); } 90% { -webkit-transform: translate3d(0, 5px, 0); transform: translate3d(0, 5px, 0); } 100% { -webkit-transform: none; transform: none; } } .bounceInDown { -webkit-animation-name: bounceInDown; animation-name: bounceInDown; } .animatedout { -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes rollOut { 0% { opacity: 1; } 100% { opacity: 0; -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); } } @keyframes rollOut { 0% { opacity: 1; } 100% { opacity: 0; -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); } } .rollOut { -webkit-animation-name: rollOut; animation-name: rollOut; } @-webkit-keyframes zoomIn { 0% { opacity: 0; -webkit-transform: scale3d(.3, .3, .3); transform: scale3d(.3, .3, .3); } 50% { opacity: 1; } } </style> <div class="wpmchimpa-reset wpmchimpa-overlay-bg wpmchimpselector chimpmatecss"> <div class="wpmchimpa-maina bounceInDown animated" wpmcexitanim> <div class="wpmchimpa-mainc"> <div id="wpmchimpa-main"> <div id="wpmchimpa-newsletterform" class="wpmchimpa-wrapper"> <div class="wpmchimpa" id="wpmchimpa"> <h3>LA CAMPANA</h3> <div class="wpmchimpa_para"><div style="text-align: center;">C'è chi ha letto questa notizia prima di te.</div><div style="text-align: center;">Iscriviti per ricevere gli ultimi articoli. <img src="http://" loading=lazy></div></div> <form wpmc_suc wpmc_msg="Спасибо! ПРОВЕРЬТЕ ПОЧТУ" action="" method="post"> <input type="hidden" name="action" value="wpmchimpa_add_email_ajax"/> <input type="hidden" name="wpmcform" value="1"/> <div class="formbox wpmchimpa-field"><div class="wpmchimpa-text wpmc-ficon"><input type="text" name="email" wpmctype="email" wpmcfield="email" wpmcreq="true" required/><span class="inputlabel">E-mail</span><span class="inputicon"></span><div class="wpmcinfierr" wpmcerr="email"></div></div><div class="wpmchimpa-subsc"><div class="wpmchimpa-subs-button"></div><div class="wpmchimpa-signal"><style type="text/css">#wpmchimpa-main .sp8 { margin: 0 auto;width: 50px;height: 30px;} #wpmchimpa-main .sp8 > div { background-color: #3d3d3d;margin-left: 3px;height: 100%;width: 6px;display: inline-block;-webkit-animation: wpmchimpa-mainsp8 1.2s infinite ease-in-out;animation: wpmchimpa-mainsp8 1.2s infinite ease-in-out;} #wpmchimpa-main .sp8 .sp82 { -webkit-animation-delay: -1.1s;animation-delay: -1.1s;} #wpmchimpa-main .sp8 .sp83 { -webkit-animation-delay: -1.0s;animation-delay: -1.0s;} #wpmchimpa-main .sp8 .sp84 { -webkit-animation-delay: -0.9s;animation-delay: -0.9s;} #wpmchimpa-main .sp8 .sp85 { -webkit-animation-delay: -0.8s;animation-delay: -0.8s;} @-webkit-keyframes wpmchimpa-mainsp8 { 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } 20% { -webkit-transform: scaleY(1.0) } }@keyframes wpmchimpa-mainsp8 { 0%, 40%, 100% { transform: scaleY(0.4);-webkit-transform: scaleY(0.4);} 20% { transform: scaleY(1.0);-webkit-transform: scaleY(1.0);} }</style><div class="sp8"><div class="sp81"></div><div class="sp82"></div><div class="sp83"></div><div class="sp84"></div><div class="sp85"></div></div></div></div><div style="clear:both"></div></div><div class="wpmchimpa-field wpmchimpa-text wpmc_colsplit wpmc-ficon"><input type="text" name="merge_fields[FNAME]" wpmctype="text" wpmcfield="FNAME" wpmcreq="true" required/><span class="inputlabel">Nome</span><span class="inputicon"></span><div class="wpmcinfierr" wpmcerr="FNAME"></div></div><div class="wpmchimpa-field wpmchimpa-text wpmc_colsplit wpmc-ficon"><input type="text" name="merge_fields[LNAME]" wpmctype="text" wpmcfield="LNAME" wpmcreq="true" required/><span class="inputlabel">Cognome</span><span class="inputicon"></span><div class="wpmcinfierr" wpmcerr="LNAME"></div></div><div class="wpmchimpa-field wpmchimpa-radio"><div class="wpmchimpa-itemh">Come vuoi leggere The Bell</div><div class="wpmchimpa-itemb"><label class="wpmchimpa-item"><input type="radio" name="group[f899931c09]" value="a22e2103b4" wpmctype="radio" wpmcfield="f899931c09" wpmcreq="true"><span>Due volte al giorno</span></label><label class="wpmchimpa-item"><input type="radio" name="group[f899931c09]" value="4ab55de31a" wpmctype="radio" wpmcfield="f899931c09" wpmcreq="true"><span>Mailing mattutino</span></label><label class="wpmchimpa-item"><input type="radio" name="group[f899931c09]" value="e386c1935e" wpmctype="radio" wpmcfield="f899931c09" wpmcreq="true"><span>Mailing serale</span></label></div><div class="wpmcinfierr" wpmcerr="f899931c09"></div></div> <div style="clear:both"></div> <div class="wpmchimpa-tag">Niente spam</div> </form> <div class="wpmchimpa-feedback" wpmcerr="gen"></div> </div> </div> <div class="wpmchimpa-close-button"></div> </div> </div> </div> </div><script data-cfasync="false" src="/cdn-cgi/scripts/af2821b0/cloudflare-static/email-decode.min.js"></script><script type='text/javascript' src='https://qipu.ru/wp-content/themes/authentic/js/vendors.min.js?ver=201710093'></script> <script type='text/javascript'> /* <![CDATA[ */ var translation = { "next":"Next","previous":"Previous"} ; /* ]]> */ </script> <script type='text/javascript' src='https://qipu.ru/wp-content/themes/authentic/js/scripts.js?ver=201710093'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=9.9.9'></script> <script type='text/javascript' src='https://qipu.ru/wp-content/plugins/chimpmatepro/public/assets/js/public.js?ver=1.3.2'></script> </body> </html>