Folosind modelul de document XML. Ghid de internet - toată distracția de pe net Cum se creează un fișier XML Delphi

XML este utilizat din ce în ce mai mult pentru a stoca informații și a le schimba între aplicații și site-uri web. Multe aplicații folosesc acest limbaj ca limbaj de bază pentru stocarea datelor, în timp ce altele îl folosesc pentru exportul și importul de date XML. Așadar, este timpul ca dezvoltatorii să înceapă să se gândească la modul în care datele XML pot fi utilizate în propriile aplicații.

În acest articol, vom analiza Modelul obiectelor documentului XML (DOM) și implementarea Microsoft DOM XML.

XML DOM este un model de obiect care oferă unui dezvoltator obiecte pentru încărcarea și procesarea fișierelor XML. Modelul de obiecte constă din următoarele obiecte de bază: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap și XMLDOMParseError. Fiecare dintre aceste obiecte (cu excepția XMLDOMParseError) conține proprietăți și metode care vă permit să obțineți informații despre obiect, să manipulați valorile și structura obiectului și să navigați în structura unui document XML.

Să ne uităm la principalele obiecte DOM XML și să arătăm câteva exemple de utilizare a acestora în Borland Delphi.

Utilizarea XML DOM în Borland Delphi

Pentru a utiliza Microsoft XML DOM în aplicațiile Delphi, trebuie să conectați biblioteca de tipuri corespunzătoare la proiect. Pentru a face acest lucru, executăm comanda Project | Import Tip Library și în caseta de dialog Import Type Library, selectați biblioteca Microsoft XML versiunea 2.0 (Versiunea 2.0), care se află de obicei în fișierul Windows \ System \ MSXML.DLL

După ce faceți clic pe butonul Creați unitatea, va fi creat modulul de interfață MSXML_TLB, care ne va permite să utilizăm obiectele XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest și o serie de altele, implementate în biblioteca MSXML.DLL. Referința la modulul MSXML_TLB trebuie să fie în lista Utilizări.

Dispozitiv XML DOM

Modelul de obiecte document reprezintă un document XML într-o structură arborescentă a ramurilor. API-urile XML DOM permit aplicațiilor să navigheze în arborele documentului și să manipuleze ramurile acestuia. Fiecare ramură poate avea un tip specific (DOMNodeType), în funcție de care sunt determinate ramurile părinte și copil. Majoritatea documentelor XML conțin ramuri ale elementului de tip, atribut și text. Atributele sunt un tip special de ramură și nu sunt ramuri copil. Pentru a gestiona atributele, utilizați metode speciale furnizate de obiectele XML DOM.

Pe lângă implementarea interfețelor recomandate de World Wide Web Consortium (W3C), Microsoft XML DOM conține metode care acceptă XSL, șabloane XSL, spații de nume și tipuri de date. De exemplu, metoda SelectNodes vă permite să utilizați sintaxa modelului XSL pentru a găsi ramuri într-un context specific, iar metoda TransformNode acceptă utilizarea XSL pentru a efectua transformări.

Testați documentul XML

Ca exemplu de document XML, să luăm un director de CD-ROM muzical, care are următoarea structură:

Imperiul burlesc Bob Dylan Statele Unite ale Americii Columbia 10.90 1985 Ascunde-ți inima Bonnie tylor Regatul Unit CBS Records 9.90 1988 ... Descătușează-mi inima Joe cocker Statele Unite ale Americii EMI 8.20 1987

Acum suntem gata să începem să analizăm modelul de obiect XML DOM, începând cu obiectul XMLDOMDocument.

Document XML - Obiect XMLDOMDocument

Lucrul cu un document XML începe cu încărcarea acestuia. Pentru a face acest lucru, folosim metoda Load, care are un singur parametru care specifică adresa URL a documentului încărcat. La încărcarea fișierelor de pe un disc local, este specificat doar numele complet al fișierului (protocolul fișier: /// poate fi omis în acest caz). Dacă documentul XML este stocat ca un șir, utilizați metoda LoadXML pentru a încărca documentul.

Proprietatea Async este utilizată pentru a controla modul în care documentul este încărcat (sincron sau asincron). În mod implicit, această proprietate este setată la True, indicând faptul că documentul este încărcat asincron și că controlul este returnat aplicației înainte ca documentul să fie încărcat complet. În caz contrar, documentul se încarcă sincron, apoi trebuie să verificați valoarea proprietății ReadyState pentru a vedea dacă documentul s-a încărcat sau nu. De asemenea, puteți crea un gestionar de evenimente pentru evenimentul OnReadyStateChange care va prelua controlul atunci când se modifică valoarea proprietății ReadyState.

Următorul arată cum se încarcă un document XML folosind metoda Load:

Utilizează ... MSXML_TLB ... procedura TForm1.Button1Click (Expeditor: TObject); var XMLDoc: IXMLDOMDocument; începe XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load („C: \ DATA \ DATA.xml”); // // Aici este codul care manipulează // documentul XML și ramurile acestuia // XMLDoc: = Nil; Sfârșit;

După ce documentul este încărcat, putem accesa proprietățile acestuia. Deci, proprietatea NodeName va conține valoarea #document, proprietatea NodeTypeString va conține valoarea documentului, iar proprietatea URL va conține fișierul: /// C: /DATA/DATA.xml.

Eroare de manipulare

Un interes deosebit sunt proprietățile legate de procesarea documentelor la încărcare. De exemplu, proprietatea ParseError returnează un obiect XMLDOMParseError care conține informații despre o eroare care a apărut în timpul procesării documentului.

Pentru a scrie un gestionar de erori, puteți adăuga următorul cod:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml’); XMLError: = XMLDoc.ParseError; Dacă XMLError.ErrorCode<>0 Apoi // // Aici gestionăm eroarea // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;

Pentru a afla ce informații sunt returnate în caz de eroare, modificați următoarea intrare în director:

Imperiul burlesc Bob Dylan Statele Unite ale Americii Columbia 10.90 1985

scoaterea elementului de închidere pe a doua linie:</p><p> <CD> <TITLE>Imperiul burlesc <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Statele Unite ale Americii</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Acum să scriem un cod care returnează valorile proprietății obiectului XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Dacă XMLError.ErrorCode<>0 Apoi, cu XMLError, Memo1.Lines începe Add (‘File:’ + URL); Add (‘Cod:’ + IntToStr (ErrorCode)); Adăugați („Eroare:” + Motiv); Adăugați (‘Text:’ + SrcText); Adăugați (‘Linie:’ + IntToStr (Linie)); Add (‘Poziție:’ + IntToStr (LinePos)); încheie Else Memo1.Lines.Add (XMLDoc.XML); Sfârșit;</p><p>și executați aplicația noastră. Ca urmare, primim următoarele informații despre eroare.</p> <p>După cum puteți vedea din exemplul de mai sus, informațiile returnate de obiectul XMLDOMParseError sunt destul de suficiente pentru a localiza eroarea și a înțelege cauza apariției acesteia.</p> <p>Acum vom restabili elementul de închidere <TITLE>în documentul nostru și continuați discuția despre DOM XML.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Accesarea arborelui documentului</h2> <p>Pentru a accesa arborele documentului, puteți obține elementul rădăcină și apoi itera pe ramurile copilului său, sau puteți găsi o ramură specifică. În primul caz, obținem elementul rădăcină prin proprietatea DocumentElement, care returnează un obiect de tip XMLDOMNode. Iată cum să utilizați proprietatea DocumentElement pentru a obține conținutul fiecărui element copil:</p><p>Nod Var: IXMLDOMNode; Rădăcină: IXMLDOMElement; I: Întreg; ... Rădăcină: = XMLDoc.DocumentElement; Pentru I: = 0 la Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Sfârșit;</p><p>Pentru documentul nostru XML, primim următorul text.</p> <p>Dacă ne interesează o anumită ramură sau o ramură sub prima ramură copil, putem folosi fie metoda NodeFromID, fie metoda GetElementByTagName a obiectului XMLDOMDocument.</p> <p>Metoda NodeFromID necesită un identificator unic așa cum este definit în schema XML sau definiția tipului de document (DTD) și returnează o ramură cu acel identificator.</p> <p>Metoda GetElementByTagName necesită un șir cu un anumit element (etichetă) și returnează toate ramurile cu acest element. Iată cum puteți utiliza această metodă pentru a găsi toți artiștii în directorul nostru CD-ROM:</p><p>Noduri: IXMLDOMNodeList; Nod: IXMLDOMNode; ... Noduri: = XMLDoc.GetElementsByTagName („ARTIST”); Pentru I: = 0 la Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Sfârșit;</p><p>Pentru documentul nostru XML, vom primi următorul text</p> <p>Rețineți că metoda SelectNodes a obiectului XMLDOMNode oferă o modalitate mai flexibilă de accesare a ramurilor de documente. Dar mai multe despre asta mai jos.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Document Branch - XMLDOMNode Object</h2> <p>Obiectul XMLDOMNode reprezintă o ramură a documentului. Am întâlnit deja acest obiect când am obținut elementul rădăcină al documentului:</p><p>Rădăcină: = XMLDoc.DocumentElement;</p><p>Pentru a obține informații despre o ramură a unui document XML, puteți utiliza proprietățile obiectului XMLDOMNode (Tabelul 1).</p> <p>Pentru a accesa datele stocate într-o ramură, este obișnuit să folosiți fie proprietatea NodeValue (disponibilă pentru atribute, ramuri text, comentarii, instrucțiuni de procesare și secțiuni CDATA), fie proprietatea Text, care returnează conținutul text al ramurii, sau proprietatea NodeTypedValue. Totuși, acesta din urmă poate fi utilizat doar pentru ramuri cu articole dactilografiate.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigarea în arborele documentului</h3> <p>Obiectul XMLDOMNode oferă multe modalități de a naviga în arborele documentului. De exemplu, proprietatea ParentNode (tip XMLDOMNode) este utilizată pentru a accesa ramura părinte, ramurile copil sunt accesate prin proprietățile ChildNodes (tip XMLDOMNodeList), FirstChild și LastChild (tip XMLDOMNode) etc. Proprietatea OwnerDocument returnează un obiect XMLDOMDocument care identifică documentul XML în sine. Proprietățile enumerate mai sus facilitează navigarea în arborele documentului.</p> <p>Acum să parcurgem toate ramurile documentului XML:</p><p>Rădăcină: = XMLDoc.DocumentElement; Pentru I: = 0 la Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Dacă Node.HasChildNodes, atunci GetChilds (Node, 0); Sfârșit;</p><p>După cum sa menționat mai sus, SelectNodes al obiectului XMLDOMNode oferă o modalitate mai flexibilă de accesare a ramurilor de documente. În plus, există o metodă SelectSingleNode care returnează doar prima ramură a documentului. Ambele metode vă permit să definiți șabloane XSL pentru căutări de sucursale.</p> <p>Să ne uităm la procesul de utilizare a metodei SelectNodes pentru a prelua toate ramurile care au o ramură CD și o subramă PRICE:</p><p>Rădăcină: = XMLDoc.DocumentElement; Noduri: = Root.SelectNodes („CD / PRICE”);</p><p>Toate ramurile PRICE ale ramurii CD vor fi plasate în colecția Nodes. Vom reveni la discuțiile despre șabloanele XSL puțin mai târziu.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipularea ramurilor copilului</h3> <p>Pentru a manipula ramurile copil, putem folosi metodele obiectului XMLDOMNode (Tabelul 2).</p> <p>Pentru a șterge complet înregistrarea despre primul disc, trebuie să rulați următorul cod:</p><p>Var XMLDoc: IXMLDOMDocument; Rădăcină: IXMLDOMNode; Nod: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load („C: \ DATA \ DATA.xml”); // Obțineți elementul rădăcină Root: = XMLDoc.DocumentElement; Nod: = Rădăcină; // Eliminați prima ramură copil Node.RemoveChild (Node.FirstChild);</p><p>Rețineți că în acest exemplu ștergem prima ramură copil. Cum se elimină primul element al primei ramuri copil este prezentat mai jos:</p><p>Var XMLDoc: IXMLDOMDocument; Rădăcină: IXMLDOMNode; Nod: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load („C: \ DATA \ DATA.xml”); // Obțineți elementul rădăcină Root: = XMLDoc.DocumentElement; // și prima ramură copil Nod: = Root.FirstChild; // Eliminați prima ramură copil Node.RemoveChild (Node.FirstChild);</p><p>În exemplul de mai sus, nu am șters prima ramură <CD>…</CD> iar primul element al ramurii este <TITLE>….

Acum să adăugăm o nouă ramură. Mai jos este codul care arată cum să adăugați o nouă intrare CD-ROM muzicală:

Var NewNode: IXMLDOMNode; Copil: IXMLDOMNode; ... // Creați o ramură nouă - NewNode: = XMLDoc.CreateNode (1, „CD”, „”); // Adăugați un element Copil: = XMLDoc.CreateNode (1, „TITLE”, „”); // Adăugați un element NewNode.AppendChild (Child); // Și setați-i valoarea Child.Text: = ‘Pink Floyd’; // Adăugați un element <ARTIST>Copil: = XMLDoc.CreateNode (1, „ARTIST”, „”); // Adăugați un element NewNode.AppendChild (Child); // Și setați-i valoarea Child.Text: = ‘Divizia Clopot’; // Adăugați un element <COUNTRY>Copil: = XMLDoc.CreateNode (1, „ȚARA”, „”); // Adăugați un element NewNode.AppendChild (Child); // Și setați-i valoarea Child.Text: = ‘UK’; // Adăugați un element <COMPANY>Copil: = XMLDoc.CreateNode (1, „COMPANIE”, „”); // Adăugați un element NewNode.AppendChild (Child); // Și setați valoarea Child.Text: = ‘EMI Records Ltd.’; // Adăugați un element <PRICE>Copil: = XMLDoc.CreateNode (1, „PRICE”, „”); // Adăugați un element NewNode.AppendChild (Child); // Și setați valoarea Child.Text: = '11 .99 "; // Adăugați un element <YEAR>Copil: = XMLDoc.CreateNode (1, „YEAR”, „”); // Adăugați un element NewNode.AppendChild (Child); // Și setați valoarea Child.Text: = ‘1994’; // Și adăugați o ramură Root.AppendChild (NewNode); ...</p><p>Codul de mai sus arată următorii pași pentru a adăuga o nouă ramură:</p> <ul><li>Crearea unei noi ramuri utilizând metoda CreateNode: <ul><li>crearea unui element folosind metoda CreateNode;</li> <li>adăugarea unui element la o ramură folosind metoda AppendChild;</li> <li>setarea valorii unui element prin proprietatea Text;</li> <li>… Repetați pentru toate elementele.</li> </ul></li> <li>Adăugarea unei noi ramuri la document utilizând metoda AppendChild.</li> </ul><p>Reamintim că metoda AppendChild adaugă o ramură la capătul arborelui. Pentru a adăuga o ramură la un anumit loc din arbore, trebuie să utilizați metoda InsertBefore.</p> <h2>Set de sucursale - obiect XMLDOMNodeList</h2> <p>Obiectul XMLNodeList conține o listă de ramuri, care pot fi construite folosind metodele SelectNodes sau GetElementsByTagName și, de asemenea, obținute din proprietatea ChildNodes.</p> <p>Am discutat deja despre utilizarea acestui obiect în exemplul furnizat în secțiunea „Navigarea în arborele documentului”. Iată câteva comentarii teoretice.</p> <p>Numărul de ramuri din listă poate fi obținut ca valoare a proprietății Lungime. Ramurile sunt indexate de la 0 la Lungimea-1 și fiecare ramură individuală este accesibilă prin elementul indexat corespunzător din matricea Item.</p> <p>Navigarea prin lista de ramuri se poate face și folosind metoda NextNode, care returnează următoarea ramură din listă sau Nil dacă ramura curentă este ultima. Pentru a reveni în partea de sus a listei, apelați metoda Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Creați și salvați documente</h2> <p>Așadar, am prezentat modul în care puteți adăuga sucursale și elemente la documentele XML existente. Acum să creăm un document XML din mers. În primul rând, amintiți-vă că un document poate fi încărcat nu numai dintr-un URL, ci și dintr-un șir obișnuit. Următorul arată cum să creați un element rădăcină, care poate fi apoi utilizat pentru a construi dinamic restul elementelor (pe care le-am tratat deja în secțiunea „Manipularea ramurilor copil”):</p><p>Var XMLDoc: IXMLDOMDocument; Rădăcină: IXMLDOMNode; Nod: IXMLDOMNode; S: WideString; ... S: = ‘ <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Rădăcină: = XMLDoc.DocumentElement; Nod: = XMLDoc.CreateNode (1, „CD”, „”); Root.AppendChild (Node); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;</p><p>După construirea documentului XML, salvați-l într-un fișier folosind metoda Salvare. De exemplu:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Pe lângă salvarea într-un fișier, metoda Salvare vă permite să salvați un document XML într-un nou obiect XMLDOMDocument. În acest caz, documentul este procesat complet și, ca urmare, structura și sintaxa acestuia sunt verificate. Iată cum puteți salva un document într-un alt obiect:</p><p>Procedură TForm1.Button2Click (Expeditor: TObject); var XMLDoc2: IXMLDOMDocument; începe XMLDoc2: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Nil; Sfârșit;</p><p>În concluzie, metoda Salvare vă permite, de asemenea, să salvați documentul XML în alte obiecte COM care acceptă interfețele IStream, IPersistStream sau IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Utilizarea șabloanelor XSL</h2> <p>Când am discutat despre metoda SelectNodes a obiectului XMLDOMNode, am menționat că oferă o modalitate mai flexibilă de accesare a ramurilor de documente. Flexibilitatea este că puteți specifica un șablon XSL ca criteriu pentru selectarea sucursalelor. Astfel de șabloane oferă un mecanism puternic pentru găsirea informațiilor în documentele XML. De exemplu, pentru a obține o listă a tuturor titlurilor CD-ROM muzicale din directorul nostru, puteți rula următoarea interogare:</p><p>Pentru a afla ce discuri ale artiștilor sunt lansate în SUA, cererea este formată după cum urmează:</p><p>Noduri: = Root.SelectNodes („CD / ARTIST”);</p><p>Iată cum puteți găsi prima unitate într-un director:</p><p>Noduri: = Root.SelectNodes („CD / TITLE”);</p><p>Și ultimul:</p><p>Noduri: = Root.SelectNodes („CD / TITLE”);</p><p>Pentru a găsi discurile lui Bob Dylan, puteți rula următoarea interogare:</p><p>Noduri: = Root.SelectNodes (‘CD [$ any $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>și pentru a obține o listă de discuri realizate după 1985, executăm următoarea interogare:</p><p>Noduri: = Root.SelectNodes („CD / TITLE”);</p><p>O discuție mai detaliată a sintaxei XSL necesită o publicație separată. Pentru a intriga cititorii și a încuraja cercetările suplimentare, voi da doar un mic exemplu de posibilă utilizare a XSL. Să presupunem că trebuie să ne convertim directorul într-un tabel HTML obișnuit. Folosind metodele tradiționale, trebuie să iterăm pe toate ramurile arborelui și pentru fiecare element primit să formăm etichetele corespunzătoare <TD>…</TD>.</p> <p>Folosind XSL, creăm pur și simplu un șablon (sau foaie de stil) care specifică ce și cum să transformăm. Apoi, suprapunem acest șablon pe catalogul nostru - și am terminat: avem textul unui șablon XSL care transformă catalogul într-un tabel (Listarea 2).</p> <p>Codul pentru a suprapune un șablon XSL în directorul nostru arată astfel:</p><p>Procedură TForm1.Button2Click (Expeditor: TObject); var XSLDoc: IXMLDOMDocument; începe XSLDoc: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = Nil; Sfârșit;</p><p>În încheierea discuției noastre despre XSL, trebuie spus că în prezent acest limbaj este utilizat în mod activ pentru transformarea între diferite documente XML, precum și pentru formatarea documentelor.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Concluzie</h2> <p>Din motive evidente, este imposibil să acoperiți toate obiectele Microsoft XML DOM și să furnizați exemple de utilizare a acestora într-un singur articol. Aici tocmai am atins problemele de bază ale utilizării XML DOM în aplicații. Masa 3 arată toate obiectele implementate în Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>COMANDĂ O SOLUȚIE LA DELPHI <br>Delphi este al doilea limbaj de programare cel mai important la care elevii sunt cel mai des introduși în procesul de învățare. Acesta este începutul învățării despre programarea orientată pe obiecte. Ca student, am ajuns la concluzia că nu există o metodă mai ușoară de a învăța o limbă decât să scrii un calculator în ea. Chiar dacă implementați o funcție rudimentară de a adăuga două numere, aceasta va arunca multă lumină.</p> <p>CodeGaear, Delphi 7, Lazarus sunt diferite compilatoare, programe care vor transfera codul pe care îl scrieți pe mașină, convertindu-l în unul și altele. Acestea sunt toate programe pentru crearea de programe, nu limbaje de programare separate. Acești compilatori folosesc limbajul de programare Object Pascal, care stă la baza limbajului Delphi, care este similar în sintaxă cu Pascal obișnuit, dar funcțional diferă semnificativ. <br></p> <h2>Care este sintaxa unui limbaj de programare?</h2> <p>Acesta este formatul pentru scrierea diferiților operatori. De exemplu, un pascal pentru buclă are următorul format: pentru n: = 1 până la k do și așa mai departe.</p><p>În limbajul de programare C ++, aceeași buclă este scrisă puțin diferit: pentru (n = 1; n Scriem un calculator</p><p>Acest lucru vă va oferi o înțelegere a modului în care obiectele interacționează cu codul programului, ce sunt „variabilele” și cum funcționează funcțiile matematice. Orice programare va fi în orice caz un calcul. Un joc este, de asemenea, un program care calculează constant ceva, funcționează cu numere și funcții numerice. Programarea este inseparabilă de matematică.</p> <p>Să folosim mediul de dezvoltare Lazarus pentru scriere. Funcționalitatea sa nu este la fel de bogată ca, să zicem, CodeGear, dar este disponibilă gratuit și este destinată instruirii.</p><p>Deschizând mediul de dezvoltare, vedem formularul și caseta de instrumente. Iată formularul.</p> <p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-24.jpg' width="100%" loading=lazy loading=lazy></p><p>Iată cutia de instrumente.</p><p>Primul lucru pe care îl vom face este să adăugăm cele trei elemente de care avem nevoie pentru a implementa funcția pentru adăugarea a două numere. Avem nevoie de „Tedit” în cantitate de trei bucăți și „TButton”. În imaginea de mai jos sunt afișate pe panou cu săgeți. Facem clic pe ele o dată, apoi o dată pe formular, iar acestea apar pe acesta.</p><p>Acestea sunt câmpuri de text pentru introducere și un buton obișnuit. Găsiți aceste elemente folosind aproape orice program Windows. Aruncă o privire.</p><p><img src='https://i1.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-27.jpg' width="100%" loading=lazy loading=lazy><br></p> <p>Acum să ștergem aceste etichete. Faceți clic pe fila „Vizualizare”. Și faceți clic pe articolul „Inspector de obiecte. Va apărea o fereastră ca aceasta.</p><p><img src='https://i0.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-28.jpg' width="100%" loading=lazy loading=lazy></p><p>Facem clic o dată pe elementul „Buton” din formular și schimbăm valoarea „Subtitrare” din fereastra inspectorului cu oricare alta. De exemplu, cuvântul „Ok”. Apăsăm Enter. Vedem pe formular modul în care elementul și-a schimbat numele.</p><p>Să facem același lucru cu Edit-urile, pur și simplu nu le redenumiți, ci creați-le fără conținut. Selectați-le unul câte unul și ștergeți valoarea Text în inspector. Nu uitați să apăsați Enter.</p><p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-29.jpg' width="100%" loading=lazy loading=lazy></p><p>Drept urmare, formularul nostru arată astfel.</p><p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-30.jpg' width="100%" loading=lazy loading=lazy><br></p> <p>Acum, pentru ca calculatorul nostru să funcționeze, trebuie să scrieți codul de program necesar pentru procedura butonului nostru. Faceți clic pe elementul Buton de două ori și deschideți editorul sursă.</p><p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-31.jpg' width="100%" loading=lazy loading=lazy></p><p>Vedea? Butonul Procedură 1 Faceți clic pe. Aceasta este procedura care este responsabilă pentru ceea ce se întâmplă atunci când facem clic pe buton o dată. Și ar trebui să se întâmple următoarele: programul trebuie să afișeze suma numerelor introduse în primele două câmpuri din a treia editare. Scriem codul.</p><p><img src='https://i1.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-32.jpg' width="100%" loading=lazy loading=lazy></p><p>Trebuie să scriem 5 linii de cod atât de simple. Comentariile și explicațiile pot fi văzute în imaginea de mai sus. După aceea, apăsăm acest buton.</p> <p>Proiectul nostru va fi compilat. Acesta va fi compilat într-un program. Introducem numere în primele două câmpuri, facem clic pe buton și obținem valoarea sumei.</p><p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-34-2.jpg' width="100%" loading=lazy loading=lazy></p> <h2>Concluzie</h2> <p>Puteți face clic pe butonul „Fișier”, apoi „Salvați tot”, selectați un folder de salvat și veți avea un program complet care poate fi lansat de pe desktop. Acum încercați să vă dați seama singuri ce trebuie să rescrieți în acest cod, astfel încât programul să împartă două numere și să nu adauge. Sugestie: trebuie să modificați tipul de date. Videoclipul de mai jos prezintă un exemplu similar, dar în mediul Delphi 7, nu în Lazarus.</p><p><span class="6qR5tjJKK3g"></span></p> <p>Pentru mulți programatori Delphi, salvarea setărilor este asociată cu utilizarea <i>INI</i> fișiere din programele lor. Utilizarea acestei metode, în proiecte mai mult sau mai puțin serioase, ar trebui evitată, deoarece limitează flexibilitatea, ceea ce împiedică extinderea în continuare a programului. Ar trebui spus că această abordare este destul de populară datorită ușurinței sale de utilizare și prezenței instrumentelor încorporate în mediul de dezvoltare. <br><br>Cu toate acestea, structurat <i>XML</i> fișiere. Avantajul lor este că este posibil ca numărul parametrilor să nu fie fixat. Pentru a înțelege mai bine acest lucru, luați în considerare un exemplu specific.</p><p>În programul USearch, când faceți clic pe o intrare, apare un meniu contextual, care afișează o listă de articole. Aceste elemente sunt comenzi, care la rândul lor sunt încărcate din fișierul de setări. În cazul în care setările au fost stocate în <i>INI</i> fișier, atunci programul ar putea salva și încărca un anumit număr de comenzi, de exemplu 10 sau 50. De îndată ce este necesară o valoare mai mare, va trebui să rescrieți codul și să îl recompilați corespunzător.</p><p><img src='https://i1.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.ini_.jpg' height="145" width="247" loading=lazy loading=lazy><br>Aplicarea unei abordări folosind <i>XML</i> fișiere, vom putea încărca dinamic toți parametrii secțiunii. În plus, fișierul de configurare va deveni mai elegant, fără numerotarea parametrilor redundanți. Cu toate acestea, instrumentele standard pentru lucrul cu <i>XML</i> Delphi are multe dezavantaje, așa că vă recomand să utilizați biblioteca standard <b>MSXML</b>... De obicei, este inclus în mod implicit cu sistemele de operare ale familiei Windows.</p><p><img src='https://i2.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.xml_.jpg' align="center" width="100%" loading=lazy loading=lazy><br>A conecta <b>MSXML</b>, trebuie să creăm un fișier de interfață cu o listă a tuturor funcțiilor, importându-l de pe serverul COM. Au fost scrise multe articole detaliate despre cum să importați interfața, dar vă sugerez să descărcați fișierul <b>MSXML2_TLB.PAS</b> gata de folosire. După ce fișierul este descărcat, plasați-l lângă proiectul dvs. sau plasați-l în folderul lib din mediul Delphi. Astfel, toate programele create vor putea folosi modulul <b>MSXML</b>, trebuie doar să adăugați linia MSXML2_TLB la utilizări.</p><p>Pentru claritate, luați în considerare următorul exemplu de utilizare a acestei biblioteci:</p><p>Procedură LoadData; var XMLDoc: DOMDocument; Rădăcină: IXMLDOMElement; începe XMLDoc: = CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Rădăcină: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("dimensiune / lățime"). Text); Rădăcină: = nul; XMLDoc: = nul; Sfârșit;</p><p>Mai întâi, se creează o instanță a clasei DOMDocument și apoi conținutul fișierului settings.xml este încărcat în memorie. Deoarece conform standardului orice <i>XML</i> fișierul trebuie să conțină eticheta rădăcină (în acest caz <i>config</i>), atunci trebuie să-l obținem folosind funcția <i>DocumentElement</i>... Apoi, conținutul este afișat între etichete. <width></width>, care la rândul lor se află între etichete <size></size>... Astfel, din fișierul settings.xml, metoda noastră va afișa textul în MessageBox <i>„100 px”</i>.</p><p> <?xml version="1.0" encoding="utf-8"?> <config> <size> <height>500 px</height> <width>100 px</width> </size> </config> </p><p>Aici se aplică metoda SelectSingleNode, care ia un șir ca parametru</p> <p>Bine ati venit! Acest blog este despre internet și computere sau, mai bine zis, le-a fost dedicat lor.</p> <p>Probabil, este imediat evident că nu au apărut articole noi pe site de mulți ani. Da, aceasta este soarta majorității blogurilor. Acest proiect a fost odată o întreprindere ambițioasă, iar autorul, ca mulți alții care au scris la acea vreme, avea planuri ambițioase de a deveni unul dintre cei mai buni bloggeri ruși. Ei bine, dacă te uiți acum, atunci dintre acele bloguri create simultan cu ale mele, majoritatea au dispărut deja în eternitate. Și pur și simplu nu am avut suficient timp pentru blog. Deci da, nu mai este actualizat. Deși odată ce am câștigat cu acest site concursul „Blogul Runet 2011”.</p> <p>Am avut chiar o idee să șterg toate acestea, dar apoi am revizuit materialele vechi și mi-am dat seama că acestea pot fi în continuare utile cititorilor. Da, unele articole sunt învechite (dacă am suficientă putere, vor primi note adecvate), dar site-ul, de exemplu, poate fi util pentru începători - aici puteți citi despre conceptele de bază ale internetului, aflați cum să configurați Internet, Windows sau chiar decide să treacă la Linux. Așadar, uitați-vă la rubricile și alegeți-o pe cea potrivită pentru dvs.</p> <p>Și totuși, sper că acesta este mai mult decât un simplu blog, ci un adevărat ghid pentru Internet. Site-ul poate fi vizualizat în modul director, unde toate articolele disponibile sunt structurate pe categorii. Și cine știe, poate într-o zi vor începe să apară noi articole de înaltă calitate aici.</p> <p><i>Sander</i></p> <p>Picodi.ru este un portal de reduceri de la International Coupons, un expert polonez în economii și cumpărături ieftine. Polonezii sunt considerați una dintre cele mai economice națiuni din lume, așa că nu este surprinzător faptul că acest tip de proiect a luat naștere din startup-ul polonez kodyrabatowe.pl. Cum poate acest portal să fie util pentru un utilizator obișnuit de internet din Rusia?</p> <p>Telefoanele Android moderne sunt mai mult decât telefoane. Te obișnuiești cu setul de programe instalate, istoricul apelurilor și mesajelor text, colecția ta de fotografii și multe altele. Dar timpul trece, iar dispozitivul care vi se potrivește complet începe să încetinească, să scape sau pur și simplu să-și piardă aspectul prezentabil din cauza jetoanelor de pe carcasă sau zgârieturilor de pe ecran. Se pune întrebarea alegerii unui telefon nou și schimbarea telefonului Android. Și dacă ocolim acum problema alegerii, atunci „mutarea” la un nou telefon rămâne o problemă serioasă - nu vrem absolut să pornim toate datele de la zero. Despre asta vom vorbi astăzi.</p> <p>Majoritatea cititorilor acestui blog, cel mai probabil, nu au întâlnit niciodată sisteme de control al versiunilor și nu vor întâlni niciunul în viitorul apropiat. E pacat. Această invenție extrem de convenabilă este folosită pe scară largă de programatori, dar, în opinia mea, ar putea fi foarte utilă pentru cei care lucrează activ cu texte. Dar, probabil, acum nu există un sistem de control al unei singure versiuni care să fie ușor de utilizat pentru a lucra la „birou” (Microsoft Office). Cu toate acestea, cred că materialul prezentat în articol poate fi interesant pentru toți cititorii.</p> <p>Dacă v-ați gândit cum să vizionați filme pe rețea de pe televizor și să intrați online, acest articol este pentru dvs. Nu, știu că unele televizoare au deja funcționalitate Smart TV, dar nu am văzut niciodată că funcționează corect. Aparent, prin urmare, recent, corporația Google a demonstrat un dispozitiv absolut uimitor, care a devenit imediat o senzație. Vorbim despre media streamer Chromecast (Chromecast), o versiune mai avansată și mai accesibilă a dezastruosului Nexus Q de anul trecut.</p> <p>Chromcast Dongle, care are o dimensiune mai mică de 2 inci, se conectează la portul HDMI al televizorului și vă permite să vă bucurați de streaming de conținut web. Pentru a controla streamerul, puteți utiliza orice dispozitiv (tabletă, PC, smartphone) bazat pe platforma de operare iOS, Windows, Android sau Mac OS.</p> <p>Acest articol este dedicat dispozitivului memoriei sistemului Android, problemelor care pot apărea din cauza lipsei sale și modului de rezolvare a acestora. Recent, eu am dat peste faptul că telefonul meu Android a început să trimită în mod regulat mesaje despre memorie insuficientă atunci când încerc să instalez o aplicație. Ceea ce a fost foarte ciudat pentru mine, în condițiile în care, conform descrierii de pe piață, ar fi trebuit să existe aproximativ 16 GB și am mărit și acest volum cu un card de memorie suplimentar. Cu toate acestea, a existat o problemă și a trebuit să fac multe lucruri înainte să găsesc soluția potrivită, care nu necesita acces root sau să restabilească complet telefonul la starea sa din fabrică.</p> <p>Recent, s-a acordat multă atenție construcției sistemelor de e-business, sau așa cum sunt denumite și - B2B (business to business). Luând în considerare recomandările privind construirea sistemelor de streaming de schimb ale organismului de coordonare a tehnologiilor Internet - WWW Consortium: se pune accentul pe tehnologiile XML și construcția de sisteme pentru schimbul de documente XML.</p> <p>Avantajul utilizării XML în e-business este eficiența ridicată a sistemelor B2B la costuri reduse pentru crearea sa datorită unei prezentări clare și vizuale a informațiilor structurate, capacității de a utiliza protocoale de rețea moderne și de a crea sisteme de afaceri în timp real.</p> <p>Independența prezentării informațiilor sub formă de documente XML permite diferitelor companii implicate în e-business să producă software independent unul de celălalt.</p> <p>În toate sistemele, schimbul, de regulă, este construit după aceeași schemă, utilizând cereri HTTP. Protocolul SSL este utilizat ca protocol de securitate a informațiilor (dar acesta este un subiect separat).</p> <p>Una dintre opțiunile posibile pentru procesarea mesajelor XML este de a construi aplicații BIN / CGI (ISAPI) sau componente COM (server) care generează sau procesează documente XML.</p> <p>Pe de o parte, aplicația acționează ca un client, care emite o cerere HTTP în modul POST, pe de altă parte, există un server WEB pe partea căruia cererea este procesată și se emite un răspuns. Schimbul de informații utilizează documente XML.</p> <p>Una dintre cele mai eficiente opțiuni de implementare este utilizarea unui analizor XML existent care acceptă modelul DOM. Un astfel de parser este un pachet de distribuție de Win'98 sau o parte integrantă a IE 4.7 și mai mare (pentru Win'95) și reprezintă un server COM situat în biblioteca msxml.dll.</p> <p>Component Object Model (COM) - Reprezintă datele și metodele încapsulate într-o singură entitate și o modalitate de a le accesa printr-un sistem de interfețe. Folosind instrumentele Delphi, este destul de ușor să accesați clasele unui obiect COM (mai multe clase pot fi incluse într-un singur server COM). Obiectele sunt accesate prin inițializarea unei instanțe a clasei prin sistemul de interfață. Descrierea interfețelor este realizată de limbajul de definire a interfeței (IDL), care poate fi realizat automat prin intermediul mediului.</p> <p>Instrumentele Delphi sunt utilizate pentru a importa de pe un server COM <i>msxml.dll</i>, sunt construite fișierele pentru descrierea interfeței IDL și fișierul pentru descrierea binară a tipurilor de bibliotecă - TLB. Această operațiune se efectuează prin meniul sistemului: <b>Proiect | Import bibliotecă de tipuri:</b>(poza 1). Apoi, apare o casetă de dialog (Figura 2), în care trebuie să selectați un obiect COM (în cazul nostru, obiectul este înregistrat sub numele „Microsoft.XMLDom (Versiunea 2.0)”) și să creați un fișier TLB (buton <b>Creați unitatea</b>). Folosind fișierul TLB, cadrul generează un fișier descriere server Pascal COM - MSXML_TLB.pas</p> <p>Fișierul MSXML_TLB.pas descrie toate interfețele, constantele și coclasele serverului COM.</p> <p>Pentru a accesa obiectele unui element COM, aveți nevoie în directivă <b>UTILIZĂRI</b> adăugați numele fișierului de descriere a bibliotecii (MSXML_TLB.pas). Mai jos este un program simplu care utilizează analizorul DOM standard msxml.dll, care încarcă un document XML și îl afișează într-un element de câmp de text Memo1.</p> <b>utilizări</b> Windows, Mesaje, SysUtils, Clase, Grafică, Controale, Formulare, Dialoguri, OleServer, MSXML_TLB, StdCtrls; <b>tip</b> TForm1 = <b>clasă</b>(TForm) Buton1: TButton; Memo1: TMemo; <b>procedură</b> Buton1Click (Expeditor: TObject); <b>Sfârșit;</b> <b>var</b> Form1: TForm1; <b>implementare</b>($ R * .DFM) <b>Procedură</b> TForm1.Button1Click (Expeditor: Tobject); <span>// declararea soclasei obiectului DOMDocument;</span> <b>var</b> coDoc: CoDOMDocument; <span>// clasă compatibilă cu interfața IDOMDocument;</span> <b>var</b> Doc: IXMLDOMDocument; <b>începe</b> <span>// creați o instanță a obiectului DOMDocument;</span> Doc: = coDoc.Create; <span>// apelează metoda Load a unei instanțe a obiectului DOMDocument;</span> Doc.load ("data.xml"); <span>// accesați proprietatea xml a instanței DOMDocument;</span> Memo1.Text: = Doc.xml; <b>Sfârșit;</b> <b>Sfârșit.</b> <h2>Concept DOM - Model de obiect document</h2> <p>Fiecare document XML este reprezentat ca un set de multe obiecte (clase), cu ajutorul cărora este posibilă accesarea elementelor individuale (câmpuri de obiecte). DOM - interfața descrie accesul atât la obiecte simple de tipul DOMString sau CharacterData, cât și la părți sau elemente individuale ale unui document XML: DOMFragmentElement, DOMNode, DOMElement.</p> <p>Următoarele sunt cele mai importante proprietăți și metode ale obiectelor XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Trebuie remarcat faptul că metodele și funcțiile obiectelor DOM prezentate mai jos (Document Object Model) sunt utilizate de analizorul Microsoft XML msxml.dll și sunt oarecum mai largi decât modelul aprobat de W3C DOM Consortium.</p> <p>O descriere mai completă a interfeței obiectului DOM poate fi găsită la</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2">Obiect XMLDOMDocument</td> </tr><tr><td valign="top" colspan="2">Reprezintă nivelul superior al ierarhiei obiectelor și conține metode de lucru cu un document: încărcarea acestuia, analizarea acestuia, crearea de elemente, atribute, comentarii etc. ...</td> </tr><tr><td valign="top" colspan="2"><b>Proprietăți</b> </td> </tr><tr><td valign="top" width="39%"><b>Asincron</b> </td> <td valign="top" width="61%">Proprietate care identifică modul de procesare curent</td> </tr><tr><td valign="top" width="39%" height="19"><b>ParseError</b> </td> <td valign="top" width="61%" height="19">Returnează o referință la obiectul de tratare a erorilor XMLDOMParseError</td> </tr><tr><td valign="top" width="39%"><b>Activați - dezactivați verificarea documentelor.</b> </td> <td> </td> </tr><tr><td valign="top" width="39%"><b>url</b> </td> <td valign="top" width="61%">Returnează adresa URL a documentului</td> </tr><tr><td valign="top" width="39%"><b>documentElement</b> </td> <td valign="top" width="61%">Conține o referință la elementul rădăcină al documentului ca obiect XMLDOMElement.</td> </tr><tr><td valign="top" colspan="2"><b>Metode</b> </td> </tr><tr><td valign="top" width="39%"><b>încărcare (url) <br>loadXML (xmlString)</b> </td> <td valign="top" width="61%">Încarcă un document XML,</td> </tr><tr><td valign="top" width="39%"><b>salvare (objTarget)</b> </td> <td valign="top" width="61%">Salvează documentul XML în fișier</td> </tr><tr><td valign="top" width="39%"><b>avorta</b> </td> <td valign="top" width="61%">Întreruperea procesului de încărcare și procesare a documentului.</td> </tr><tr><td valign="top" width="39%"><b>createAttribute (nume)</b> </td> <td valign="top" width="61%">Creează un nou atribut cu numele specificat pentru elementul curent.</td> </tr><tr><td valign="top" width="39%"><b>createNode (Tip, nume, numeSpaceURI)</b> </td> <td valign="top" width="61%">Creează un nod cu tipul și numele specificat</td> </tr><tr><td valign="top" width="39%"><b>createElement (tagName)</b> </td> <td valign="top" width="61%">Creează un element de document cu numele specificat.</td> </tr><tr><td valign="top" width="39%"><b>createTextNode (date)</b> </td> <td valign="top" width="61%">Creează text într-un document</td> </tr><tr><td valign="top" width="39%"><b>getElementsByTagName (tagname)</b> </td> <td valign="top" width="61%">Returnează o referință la colecția de elemente ale documentului cu numele dat</td> </tr><tr><td valign="top" width="39%"><b>nodeFromID (idString)</b> </td> <td valign="top" width="61%">Găsirea unui articol după ID</td> </tr></tbody></table><br><table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" colspan="2"> <b>Obiect XMLDOMNode</b> </td> </tr><tr><td valign="top" colspan="2">Obiect XMLDOMNode care implementează interfața de bază DOM <b>Nodul</b>, este destinat manipulării unui nod separat al arborelui documentului. Proprietățile și metodele sale vă permit să obțineți și să modificați informații complete despre nodul curent - tipul, numele, numele complet, conținutul său, lista elementelor copil etc.</td> </tr><tr><td valign="top" colspan="2"><b>Proprietăți</b> </td> </tr><tr><td valign="top" width=" "><b>numeNod, numeNume</b> </td> <td valign="top" width="65%">Returnează numele nodului curent.</td> </tr><tr><td valign="top" width="35%"><b>prefix</b> </td> <td valign="top" width="65%">Returnează prefixul spațiului de nume.</td> </tr><tr><td valign="top" width="35%"><b>dataType</b> </td> <td valign="top" width="65%">Specifică tipul de conținut al nodului curent</td> </tr><tr><td valign="top" width="35%"><b>nodeType, nodeTypeString</b> </td> <td valign="top" width="65%">Returnează tipul nodului curent:</td> </tr><tr><td valign="top" width="35%"><b>atribute</b> </td> <td valign="top" width="65%">Obține o listă a atributelor nodului curent ca colecție XMLDOMNamedNodeMap.</td> </tr><tr><td valign="top" width="35%"><b>text</b> </td> <td valign="top" width="65%">Returnează conținutul subarborelui curent ca text</td> </tr><tr><td valign="top" width="35%"><b>xml</b> </td> <td valign="top" width="65%">Returnează o reprezentare XML a subarborelui curent.</td> </tr><tr><td valign="top" width="35%"><b>Valoare nod</b> </td> <td valign="top" width="65%">Returnează conținutul nodului curent.</td> </tr><tr><td valign="top" width="35%"><b>childNodes</b> </td> <td valign="top" width="65%">Returnează o listă de elemente copil ca XMLDOMNodeList.</td> </tr><tr><td valign="top" width="35%"><b>firstChild, lastChild</b> </td> <td valign="top" width="65%">Returnează primul / ultimul copil</td> </tr><tr><td valign="top" width="35%"><b>previousSibling, nextSibling</b> </td> <td valign="top" width="65%">Returnează elementul frate anterior / următor.</td> </tr><tr><td valign="top" width="35%"><b>parentNode</b> </td> <td valign="top" width="65%">Conține un link către elementul părinte.</td> </tr><tr><td valign="top" width="35%"><b>proprietarDocument</b> </td> <td valign="top" width="65%">Returnează un indicator către documentul care conține nodul curent.</td> </tr><tr><td valign="top" colspan="2"><b>Metode</b> </td> </tr><tr><td valign="top" width="35%"><b>appendChild (newChild)</b> </td> <td valign="top" width="65%">Adaugă un nou copil la nodul curent.</td> </tr><tr><td valign="top" width="35%"><b>insertBefore (newChild, refChild)</b> </td> <td valign="top" width="65%">Inserează un nod copil, poziționându-l în subarborele curent „la stânga” nodului specificat de refChild.</td> </tr><tr><td valign="top" width="35%"><b>cloneNode (profund)</b> </td> <td valign="top" width="65%">Creează o copie a elementului curent.</td> </tr><tr><td valign="top" width="35%"><b>getAttribute</b><b>(Nume) <br> </b><b>getAttributeNode</b><b><span>(Nume) <br>setAttribute (nume, valoare) <br>setAttributeNode (XMLDOMAttribute)</span> </b> </td> <td valign="top" width="65%">Acces la atributele (creați, citiți, scrieți) obiectului. Nume este numele atributului, valoarea este valoarea acestuia. Returnează un obiect XMLDOMAttribute.</td> </tr><tr><td valign="top" width="35%"><b>replaceChild (newChild, oldChild) removeChild (oldChild)</b> </td> <td valign="top" width="65%">Înlocuirea obiectului oldChild din lista curentă de obiecte copil cu newChild. Ștergerea obiectului oldChild</td> </tr><tr><td valign="top" width="35%"><b>selectNodes (patternString) selectSingleNode (patternString)</b> </td> <td valign="top" width="65%">Returnează un obiect XMLDOMNodeList selectat după modelul de căutare sau primul nod</td> </tr><tr><td valign="top" width="35%"><b>transformNode (foaie de stil) <br>transformNodeToObject (foaie de stil, outputObject)</b> </td> <td valign="top" width="65%">Atribuie o foaie de stil subarborelui nodului curent și returnează un șir care reprezintă rezultatul procesării. Parametrul este o referință la obiectul DOMDocument care conține instrucțiunile XSL.</td> </tr></tbody></table><br><h2>Utilizarea XML în afaceri.</h2> <p>Pentru o imagine mai clară, este nevoie de o explicație și de ce sunt necesare toate acestea pentru a înțelege cum funcționează:</p> <p>La construirea unui sistem ERP B2B sau corporativ, la organizarea schimbului de informații de documente XML între întreprinderi sau sucursale ale pr-I, se utilizează un sistem dovedit eficient de transfer de informații bazat pe servere WEB existente prin protocoale HTTP.</p> <p>Pe de o parte, aplicația acționează ca un client, care emite o cerere HTTP în modul POST; pe de altă parte, există un server WEB, pe partea căruia cererea este procesată și este emis un răspuns. Documentele XML sunt utilizate ca schimb.</p> <p>De exemplu, într-un sistem ERP corporativ simplu, un program de contabilitate (ACS Accounting), este necesar să formați o cerere de factură și să o trimiteți la o sucursală care are un depozit (ACS Warehouse). AWP O declarație similară de problemă la crearea unui sistem B2B, atunci când Enterprise A solicită disponibilitatea produselor (face o comandă pentru achiziție) de la Furnizorul B.</p> <p>Enterprise A și programul său acționează ca un client. Depozitul este deservit de furnizorul B, care are un complex de depozite cu o bază de date pe un server SQL. Schimbul se efectuează prin intermediul serverului WEB corporativ al Furnizorului V.</p> <p>Mai jos este următorul algoritm tipic de schimb:</p> <br>Figura 3. <ol><li><b>Întreprinderea A</b> inițiază <b>procesul A</b>(comanda produsului), care acționează ca un client WEB.</li><li><b>Procesul A</b> generează un document XML (de exemplu, o solicitare de factură) și îl transmite ca o cerere POST http către serverul WEB al furnizorului B. Ca URI, este utilizat identificatorul de resursă al aplicației de procesare. URI-ul poate fi același pentru toate tipurile de documente sau individual pentru fiecare tip. Totul depinde de structura serverului B2B (WEB).</li><li>Serverul WEB analizează cererea și generează un server <b>Procesul B</b> prin trecerea corpului documentului XML ca parametru. <br>Procesul B este lansat de serverul WEB și este procesat fie ca pagină ASP, CGI (ISAPI) - aplicație sau server JAVA (aplicație server)</li><li><b>Procesul B</b>- generează o cerere către serverul de baze de date SQL.</li><li>Serverul SQL efectuează operațiunile necesare în baza de date, generează un răspuns și îl returnează <b>Procesul B</b>.</li><li>Conform răspunsului de la serverul SQL <b>Procesul B</b> generează un document XML (răspuns) și îl returnează ca răspuns la o cerere http către aplicația client.</li><li>Mai mult, în funcție de situația din partea clientului, fie se formează o nouă solicitare http, fie sesiunea se încheie.</li> </ol><h2>Câteva cuvinte despre organizarea fluxului de documente.</h2> <p>Regula generală pentru dezvoltarea unui sistem de schimb de documente XML este:</p><ul><li><b>in primul rand</b>- elaborarea unei diagrame a documentelor electronice și a structurii acestora;</li><li><b>În al doilea rând</b>- dezvoltarea tabelelor funcțiilor procesului (subprocese), adică ce funcție va implementa fiecare proces în raport cu ce document XML.</li> </ul><p>Fiecare document XML, la fel ca un document HTML, trebuie să fie alcătuit dintr-un antet de mesaj (informații cuprinse de etichete) și un corp de mesaj (pentru o cerere, aceste informații sunt încadrate cu etichete pentru a răspunde la o cerere). Pentru ca documentul XML să fie bine format, este necesar să încadrați cele două părți componente „Titlu” și „Solicitare” cu etichete, de exemplu. Tipul unui document tipic este prezentat mai jos:</p> <p>Antetul (Figura 4), spre deosebire de un document HTML, trebuie să conțină diverse tipuri de informații despre servicii, inclusiv informații despre tipul documentului transmis și procesul de procesare a acestuia. Corpul documentului intră în procesarea informațiilor, adică conținut încadrat de etichete. Trebuie remarcat faptul că structura titlurilor ar trebui să fie aceeași pentru toate tipurile de documente.</p> <p>Pentru Procesul pornit de server, este preferabil (dar nu este necesar) să construiți algoritmul de procesare după cum urmează:</p> <img src='https://i1.wp.com/codenet.ru/np-includes/upload/2005/01/05/128666.jpg' height="500" width="408" loading=lazy loading=lazy><br>Figura 6. <h2>Câteva puncte fundamentale atunci când se creează partea clientului</h2> <p>După cum sa explicat deja, la crearea unui document XML, se utilizează reprezentarea acestuia sub forma unui model DOM. Mai jos este un exemplu de porțiune text Delphi a unui program de generare a antetului de mesaj XML.</p> <b>procedură</b> TThread1.HeaderCreate (Expeditor: Tobject); <b>var</b> <span>// declarație de clasă, necesară pentru a crea</span> coDoc: CoDomDocument; <span>// Obiect XMLDomDocument</span> Doc: DomDocument; r: IXMLDOMElement; Nod: IXMLDOMElement; // DOMText txt: IXMLDOMText; // DOMAttribute attr: IXMLDOMAttribute; <b>începe</b> <span>// creați un document DOM</span> Doc: = coDoc.Create; Doc.Set_async (fals); <span>// inițierea inițială a documentului DOM</span> Doc.LoadXML („ <Header/>"); <span>// creați DOMElement (etichetă<<b>Expeditor</b>>) </span> Nod: = Doc.createElement („Expeditor”); <span>// creați un nod text " <b>Typhoon LLC</b>" </span> txt: = Doc.createTextNode ("Typhoon LLC"); <span>// atribuire către nod<<b>Expeditor</b>> valoare</span> <span>// nod text " <b>Typhoon LLC</b>" </span> Node.appendChild (txt); <span>// adaugă element<<b>Expeditor</b>> la rădăcina documentului în copilărie</span> r.appendChild (Nod); <span> <<b>Din</b>> </span> Nod: = Doc.createElement ("De la"); txt: = Doc.createTextNode ("http://tayfun.ru/xml/default.asp"); Node.appendChild (txt); r.appendChild (Nod); <span>// operațiuni similare pentru etichetă<<b>La</b>> </span> Nod: = Doc.createElement („Către”); txt: = Doc.createTextNode ("http://irbis.ru"); Node.appendChild (txt); r.appendChild (Nod); <span>// creați DOMElement ()</span> Nod: = Doc.createElement ("TypeDocument"); <span>// creați nodul XMLDOMAttribute</span> Att: = Doc.createAttribute ("Id", "Order"); <span> // <TypeDocument Id="Order"/> </span> Node.appendChild (Att); r.appendChild (Nod); <b>Sfârșit;</b> <p>Trebuie remarcat faptul că declarația variabilei coDoc: CoDomDocument și Doc: DomDocument, precum și crearea acesteia prin metoda Create (Doc: = coDoc.Create;) se face o dată. Declarația variabilelor se află în secțiunea care descrie variabilele globale și nu în procedura locală, așa cum a fost demonstrat pentru claritate în acest exemplu (adică o variabilă globală de tip DomDocument pentru un modul de program).</p> <p>Rezultatul activității programului de mai sus va fi antetul creat, aplicat exemplului nostru de document XML: prezentat în Figura 5.</p> <img src='https://i0.wp.com/codenet.ru/np-includes/upload/2005/01/05/128662.gif' height="116" width="298" loading=lazy 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 loading=lazy><br>Figura 6.</p><p>Principalul avantaj al transferului de informații sub formă de documente XML este că este posibil să se formeze un mesaj folosind structuri de tabel independente în SGBD, atât pe partea de recepție, cât și pe cea de transmisie. Utilizând exemplul nostru, să presupunem că este necesar să se transfere informații despre facturile Enterprise A, din SGBD având structura prezentată în Figura 6</p> <p>Pentru a genera un document XML care conține o factură, o interogare SQL (interogarea A) este inițial construită cu informații despre factura în sine:</p> <b>SELECTAȚI</b>* FROM Factură_General <b>UNDE</b> Număr factură =: num <b>SELECTAȚI</b> Bunuri, Qulity, Preț, HZ_cod <b>DIN</b> Bunuri <b>UNDE</b> Număr factură =: num <span>//: num este un parametru care specifică numărul facturii.</span> <p>Mai jos este o parte a programului care generează corpul documentului XML:</p> <b>procedură</b> TThread1.DataBodyCreate (Expeditor: Tobject); <b>var</b> <span>// declarația clasei și a obiectului XMLDomDocument</span>// coDoc: CoDomDocument; <span>// trebuie să fie global pentru întregul modul.</span>// Doc: DomDocument; <span>// declarați obiecte DOMElement</span> r: IXMLDOMElement; // DOMElement; Nod, Nod2: IXMLDOMElement; Nod3, Nod4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: String; <span>// Număr de factură: <b>întreg;</b>- variabilă globală - // are valoarea 987654 // queryA, queryB: <b>Şir;</b>- o variabilă globală, // are o valoare corespunzătoare cererii // interogareA - cerere A cu informații generale despre factură // interogareB - cerere B informații despre bunurile descrise în // factură (vezi text)</span> <b>începe</b> Interogare.Închidere; <span>// vezi textul „cerere A”</span> Query.Text: = interogareA; <span>// executați cererea</span> Query.ExecSQL; Interogare.Open; <span>// obțineți adresa elementului rădăcină</span> r: = Doc.Get_documentElement; Nod2: = Doc.createElement („Cerere”); <span>// creați DOMElement (etichetă)</span> Nod: = Doc.createElement ("Factură"); <span>// adaugă un element la rădăcină</span> r.appendChild (Node2); <span>// adaugă un articol la</span> Nod2. appendChild (Node); <span>// creați DOMElement (etichetă)</span> Nodul 3: = Doc.createElement ("Depurture"); <span>// adaugă un articol la</span> Nodul. appendChild (Node3); <span>// apelați la câmpul „Depurture” al cererii</span> str: = Query.FieldByName ("Depurture"). AsString; <span>// creați text nod = valoare câmp</span><span>// atribuiți o valoare nodului</span> <span>// nod text, variabilă str</span> Node.appendChild (txt); <span>// operațiuni similare pentru etichetă <Destination>, <DataSend>, // <DataDepurture>, <Currency> // <DestinationCompany>(Câmpul DB „Destinatar”)</span> Nod: = Doc.createElement („Destinație”); <span>// numele câmpului bazei de date poate să nu fie același cu numele</span> str: = Query.FieldByName ("Destinatar") .AsString; <span>// tag, acesta este avantajul utilizării</span> txt: = Doc.createTextNode (str); <span>// DOM al interfeței din fața unui SGBD care acceptă interfața XML, // cum ar fi ORACLE 8i sau Ms SQL 2000</span> Node.appendChild (txt); ... <span>// generarea unei cereri pentru o specificație pentru bunuri</span> <span>// închideți cererea de acces</span> Interogare.Închidere; <span>// vezi în textul „cerere B”, informații. Despre bunuri</span> Query.Text: = interogareВ; <span>// alocarea valorilor parametrilor</span> Query.Params.AsInteger: = Număr factură; <span>// executați cererea</span> Query2.ExecSQL; <span>// acces deschis pentru a solicita date</span> Interogare.Open; <span>// creați DOMElement (etichetă)</span> Nodul 3: = Doc.createElement („Imemuri”); <span>// adaugă un articol la</span> Nodul. appendChild (Node3); <span>// parcurgeți toate liniile interogării</span> <b>in timp ce</b> <b>nu</b> Eof.Intrebare <b>do</b>începe Nodul 4: = Doc.createElement ("Imem"); <span>// adaugă un articol la</span> Node3.appendChild (Node4); <span>// formarea datelor pentru etichetă</span> str: = Query.FieldByName ("Preț"). AsString; txt: = Doc.createTextNode (str); Node.appendChild (txt); ... <span>// operațiuni similare pentru etichete <HZ_Cod>, <Quality>, <GoodName> </span> <b>Sfârșit;</b> <b>Sfârșit;</b> <p>Ca urmare a acestei proceduri, este generat următorul text al unui document XML:</p> <table width="100%"><tbody><tr><td align="middle"><br><img src='https://i2.wp.com/codenet.ru/np-includes/upload/2005/01/05/128661.gif' width="100%" loading=lazy loading=lazy></td> </tr></tbody></table><p>Pentru a forma o cerere, se utilizează metoda Open a obiectului <b>IXMLHttpRequest</b>:</p> <b>procedură</b> Deschis (const bstrMethod, - method type = "POST" bstrUrl, - URL server varAsync, - mod de comunicare asincron / sincron = true bstrUser, - nume de utilizator pentru autentificare bstrPassword) - parolă <h2>Crearea partea de server a procesării documentelor</h2> <p>După cum sa menționat anterior, procesarea unei cereri HTTP poate fi gestionată fie de aplicații CGI, fie de servleturi Java. Este posibilă și varianta de scriere a paginilor ASP. Dar, în acest caz, transferul de date este posibil doar prin metoda „GET” prin șirul de interogare. Cu toate acestea, gestionarea unei cereri HTTP pentru paginile ASP este mai eficientă decât o aplicație CGI. Cu toate acestea, în opinia mea, nu contează cum să-l procesăm, dar este mai important să rezolvăm întrebarea - cum să construim un program de procesare și nu prin ce mijloace.</p> <p>Dacă din capitolul anterior am examinat opțiunile pentru formarea unui document XML, atunci sarcina aplicației server este opusă - analizarea documentelor XML. Mai jos este o parte a programului care analizează un document XML:</p> <b>procedură</b> Tthread1.DataParser (Expeditor: Tobject); <b>var</b> <span>// declarați obiecte DOMElement</span> r, FNode: IXMLDOMElement; Str, Numele fișierului: String; parm: String; <span>// declarație soclass și</span> CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; <span>// obiect XMLDomDocument</span> XMLDoc, XSLDoc, ResultDoc: DomDocument; <span>// HttpStr: String; - o variabilă globală care conține șirul de solicitare HTTP</span> <b>Începe</b> XMLDoc: = coDocXML.Create; XMLDoc.LoadXML (HttpStr); <span>// obțineți adresa elementului rădăcină</span> r: = Doc.Get_documentElement; <span>// obțineți valoarea elementului</span> FNode: = r.SelectSingleNode ("// TypeDocument"); <span>// obțineți valoarea atributului id = "Comandă"</span> FileName: = FNode.GetAttibute ("id"); <span>// și formând numele fișierului Order.xsl</span> FileName: = FileName + ". Xsl"; <span>// creați documentul XSLDoc</span> XSLDoc: = coDocXSL.Create; XSLDoc.LoadXML (FileName); <span>// creați document XMLDoc</span> ResultDoc: = coDocResult.Create; <span>// setați modul de procesare sincronă</span> ResultDoc.Set_async (false); <span>// setează verificarea analizei</span> ResultDoc.validateOnParse: = adevărat; <span>// analizarea XMLDoc folosind șablonul XSL</span> XMLDoc.transformNodeToObject (XSLDoc, ResultDoc); <span>// variabilei Str i se atribuie o valoare text</span> <span>// din documentul rezultat.</span> Str: = ResultDoc.text; <span>// gaseste un element</span> FNode: = r.SelectSingleNode ("// Număr de factură"); <span>// și obțineți valoarea elementului</span> parm: = FNode.text; <span>// închideți cererea de acces</span> Interogare.Închidere; Query.Text: = Str; <span>// atribuirea valorii parametrului</span> Query.Params.AsString: = parm; <span>// executați cererea</span> Query.ExecSQL; <b>Sfârșit;</b> <p>Punctul culminant al analizei este utilizarea unui șablon XSL, care este generat individual pentru fiecare tip de document. Rezultatul analizei este un șir de interogare SQL. Ulterior, executarea șirului de interogare SQL generat va face modificările necesare la datele din SGBD.</p> <p>Avantajul utilizării analizei printr-un șablon este, de asemenea, că obțineți un fel de flexibilitate a datelor și obțineți independență completă a algoritmului față de codul programului. Mai jos este textul șablonului XSL utilizat pentru a procesa un document COMANDĂ:</p><p> <!-- файл Order.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:for-each select="//header">INSERAȚI în TABREG (DE LA, PÂNĂ, TYPEDOC, corp) VALORI („ <xsl:value-of select="from" />", "<xsl:value-of select="to" />", "<xsl:value-of select="TypeDocument/@id" />") </xsl:for-each> <xsl:for-each select="//item">INSERAȚI ÎN MARFURI (Numărul facturii, numele, prețul, calitatea) VALORI („: 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>Explicând exemplul de mai sus, trebuie remarcat faptul că utilizarea unei perechi de etichete este de natură formală, deoarece după analiză, documentul XML rezultat trebuie să conțină formal cel puțin un nod. Metoda ResultDoc.text atribuie valoarea textului ResultDoc obținut în timpul analizei documentului XML. În acest caz, valoarea este tot ceea ce este încadrat de o pereche de etichete și, adică interogarea SQL pe care am generat-o.</p> <p>O altă caracteristică a scrierii programului trebuie remarcată posibilitatea utilizării parametrului SQL <b>: num.</b> Utilizarea parametrului simplifică textul șablonului xsl. Definiția valorii elementelor corespunzătoare ale nodurilor documentului XML este determinată inițial de selecția de numele nodului corespunzător, de exemplu:</p><h2>XSL dintr-o privire</h2> <p>Abrevierea XSL provine de la eXtensible Stylesheet Language - un limbaj de formatare a foii de stil (date XML). După cum puteți vedea din antet, eXtensible Stylesheet Language (XSL) este utilizat pentru formatarea datelor XML. Prin definiție, W3C XSL constă din două părți:</p> <ul><li>XSLT - Transformare XSL. Limbajul folosit pentru transformarea sau formatarea (transformarea) documentelor XML. Astfel, folosind XSLT, putem obține diferite secțiuni ale unui set de date și forme de prezentare a datelor.</li><li>Elemente de formatare. Aceste elemente includ toate elementele tipografice ale datelor, după prelucrarea lor cu XSL. Folosit numai pentru generarea de pagini HTML.</li> </ul><p>Cu ajutorul XSLT, putem selecta datele de care avem nevoie dintr-un fișier XML și le putem aranja într-un formular pentru prezentare utilizatorului. De exemplu, în cazul nostru, am transformat date XML sub forma unei interogări SQL. Utilizarea clasică a XSL este de obicei formatarea datelor sub formă de pagini HTML sau, mai rar, sub formă de fișiere RTF.</p> <p>Fișierul XSL descrie un șablon, conform căruia va fi efectuată transformarea datelor XML. Revenind la șabloanele xsl, următoarele elemente (directive) pot fi distinse în XSLT:</p> <table cellspacing="0" cellpadding="4" width="500" border="1"><tbody><tr><td valign="top" width="31%"> <b>Directivele XSL</b> </td><th align="middle" width="69%"> <b>Descriere</b> </th> </tr><tr><td>xsl: apply-templates</td> <td>O directivă care indică utilizarea șabloanelor potrivite pentru atributul select = "numele șablonului"</td> </tr><tr><td>xsl: atribut</td> <td>creează un arbore de atribute și îl adaugă la elementul de ieșire, nume parametru = "nume atribut", spațiul de nume este spațiul de nume URI (prefixul spațiului de nume)</td> </tr><tr><td>xsl: șablon de apel</td> <td>apelează un șablon, numele atributului = "URI la șablon"</td> </tr><tr><td>xsl: alege <br>xsl: când <br>xsl: altfel</td> <td>selecție după condiția xsl: când expr = "evaluarea expresiei pe script", <br>language = "nume-limbă" <br>test = "expresie evaluată"</td> </tr><tr><td>xsl: comentariu</td> <td>generează un comentariu în documentul de ieșire</td> </tr><tr><td>xsl: copie <br>xsl: copie</td> <td>copiază nodul curent în sursa de ieșire sau introduce un fragment de document într-un nod în care atributul select = "numele nodului sursă"</td> </tr><tr><td>xsl: element</td> <td>creează un element de ieșire după nume, nume de atribut = "numele elementului", nume de spațiu = "referință spațiu de nume uri"</td> </tr><tr><td>xsl: pentru fiecare</td> <td>reaplică șablonul la toate nodurile din lista nodurilor, atributul select specifică lista nodurilor</td> </tr><tr><td>xsl: dacă</td> <td>verificarea stării, specificată de atributul test ca expresie</td> </tr><tr><td>xsl: include</td> <td>include șablon extern, atribut href = "referință URI"</td> </tr><tr><td>xsl: ieșire</td> <td>specifică ieșirea, atributul metodei poate fi „xml”, „html” sau „text”</td> </tr><tr><td>xsl: param</td> <td>specifică valoarea parametrilor, numele atributului = "numele parametrului", selectați = "valoare"</td> </tr><tr><td>xsl: procesare-instrucțiuni</td> <td>creează o instrucțiune de procesare, nume de atribut = "numele procesului de instrucțiuni"</td> </tr><tr><td>xsl: sortare</td> <td>sortează setul de noduri, atribute select = "nume nod", tip de date = tip de date ("text" | "număr" | Qname), ordine = direcție de sortare ("ascendent" | "descendent")</td> </tr><tr><td>xsl: foaie de stil</td> <td>definește un document șablon xsl, este elementul rădăcină pentru XSLT</td> </tr><tr><td>xsl: șablon</td> <td>definește un șablon xsl, nume de atribut = "prefix URI la numele șablonului", match = "o indicație a nodului la care este aplicat șablonul"</td> </tr><tr><td>xsl: text</td> <td>generează text în fluxul de ieșire, atributul disable-output-escaping = "da" sau "nu", indică capacitatea de a genera caractere ESC</td> </tr><tr><td>xsl: valoare-de</td> <td>introduce valoarea nodului selectat ca text, atributul select = "pointer to nod" din care se ia valoarea</td> </tr><tr><td>xsl: variabilă</td> <td>specifică valoarea limitelor variabilei, numele atributului = "numele variabilei", selectați = "calculul valorii variabilei"</td> </tr><tr><td>xsl: cu-param</td> <td>aplică parametrul șablonului, numele atributului = "numele parametrului", selectați = expresie pentru a evalua contextul curent, valoarea implicită "."</td> </tr></tbody></table><h2>Concluzie</h2> <p>În cele din urmă, trebuie remarcat faptul că utilizarea parserului XML standard <i>msxml.dll</i> nu este singurul instrument pentru analizarea și crearea documentelor XML. De exemplu, pentru a crea documente XML utilizați în mod eficient componentele <b>TPageProduser</b>și <b>TableProduser</b>... Dar acest articol subliniază doar amploarea și aplicabilitatea modelului DOM în practică.</p> <p>Autorul va fi foarte recunoscător pentru feedback-ul dvs. cu privire la relevanța subiectului, conținutul general, stilul de prezentare, precum și toate celelalte comentarii care vor ajuta la îmbunătățirea în continuare a calității scrierii unei colecții de articole și a lansării unei cărți care acoperă subiectul laturii practice a utilizării documentelor XML în comerțul electronic. Informații mai detaliate despre aspectul practic al utilizării documentelor electronice pot fi găsite pe site-ul autorului www.eDocs.al.ru De asemenea, este planificată plasarea textelor sursă și a exemplelor pe site-ul autorului.</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 loading=lazy>");</script> <div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div> </div> <footer> <div class="td-block-row td-post-next-prev"> <div class="td-block-span6 td-post-prev-post"> <div class="td-post-next-prev-content"><span>Articolul anterior</span><a href="https://obanracer.ru/ro/i-helicopter-igrushechnyi-vertolet-upravlyaemyi-s-pomoshchyu-iphone-ihelicopter-aivertolet.html">I-Helicopter un elicopter de jucărie controlat de un iPhone</a></div> </div> <!-- /next_post --> <div class="td-next-prev-separator"></div> <div class="td-block-span6 td-post-next-post"> <div class="td-post-next-prev-content"><span>Următorul articol</span><a href="https://obanracer.ru/ro/zvonok-idet-odnovremenno-na-dva-raznyh-aifona---otklyuchaem.html">Cum să dezactivați apelurile primite pe iPad și Mac când sună iPhone Pe ambele telefoane din apeluri, numerele sunt duplicate</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/ro/author/iulia">Yulia</a></span></div> <span style="display: none;" itemprop="author" itemscope itemtype="https://schema.org/Person"><meta itemprop="name" content="Юлия"></span> <meta itemprop="datePublished" content="2016-05-16T15:47:37+00:00"> <meta itemprop="dateModified" content="2016-10-25T16:54:41+00:00"> <meta itemscope itemprop="mainEntityOfPage" itemType="https://schema.org/WebPage" itemid="/other/kak-zavyazat-galstuk-foto-poshagovo.html" /><span style="display: none;" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><span style="display: none;" itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="//obanracer.ru/wp-content/uploads/2017/01/logo-300x100.png"></span> <meta itemprop="name" content="Мой секрет"> </span> <meta itemprop="headline " content="Как завязать галстук пошагово фото"><span style="display: none;" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="/wp-content/uploads/2016/05/1-19.jpg"><meta itemprop="width" content="640"><meta itemprop="height" content="450"></span> </footer> </article> <div class="td_block_wrap td_block_related_posts td_uid_3_5a236fb03c961_rand td_with_ajax_pagination td-pb-border-top td_block_template_1" data-td-block-uid="td_uid_3_5a236fb03c961" ><script>var block_td_uid_3_5a236fb03c961 = new tdBlock(); block_td_uid_3_5a236fb03c961.id = "td_uid_3_5a236fb03c961"; block_td_uid_3_5a236fb03c961.atts = '{ "limit":9,"sort":"","post_ids":"","tag_slug":"","autors_id":"","installed_post_types":"","category_id":"","category_ids":"","custom_title":"","custom_url":"","show_child_cat":"","sub_cat_ajax":"","ajax_pagination":"next_prev","header_color":"","header_text_color":"","ajax_pagination_infinite_stop":"","td_column_number":3,"td_ajax_preloading":"","td_ajax_filter_type":"td_custom_related","td_ajax_filter_ids":"","td_filter_default_txt":"\u0412\u0441\u0435","color_preset":"","border_top":"","class":"td_uid_3_5a236fb03c961_rand","el_class":"","offset":"","css":"","tdc_css":"","tdc_css_class":"td_uid_3_5a236fb03c961_rand","live_filter":"cur_post_same_categories","live_filter_cur_post_id":10046,"live_filter_cur_post_author":"694350","block_template_id":""} '; block_td_uid_3_5a236fb03c961.td_column_number = "3"; block_td_uid_3_5a236fb03c961.block_type = "td_block_related_posts"; block_td_uid_3_5a236fb03c961.post_count = "9"; block_td_uid_3_5a236fb03c961.found_posts = "26"; block_td_uid_3_5a236fb03c961.header_color = ""; block_td_uid_3_5a236fb03c961.ajax_pagination_infinite_stop = ""; block_td_uid_3_5a236fb03c961.max_num_pages = "3"; tdBlocksArray.push(block_td_uid_3_5a236fb03c961); </script><h4 class="td-related-title td-block-title"><a id="td_uid_4_5a236fb03e35d" class="td-related-left td-cur-simple-item" data-td_filter_value="" data-td_block_id="td_uid_3_5a236fb03c961" href="#">ARTICOLE SIMILARE</a></h4><div id=td_uid_3_5a236fb03c961 class="td_block_inner"> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/wi-fi-calling-i-volte-v-rossii-chto-takoe-volte-na-megafon-kak-podklyuchit-i-otklyuchit.html" rel="bookmark" title="Ce este VoLTE pentru megafon"><img width="218" height="150" class="entry-thumb" src="/uploads/bbbc4b232a078221b88e1f8b5e576068.jpg" alt="Ce este VoLTE pentru megafon" title="Ce este VoLTE pentru megafon"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/processors/" class="td-post-category">Procesoare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/wi-fi-calling-i-volte-v-rossii-chto-takoe-volte-na-megafon-kak-podklyuchit-i-otklyuchit.html" rel="bookmark" title="Ce este VoLTE pentru megafon">Ce este VoLTE pentru megafon</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/ploho-slyshno-iphone-6-preobrazhenskaya-ploshchad-ne-slyshit-sobesednik-na-iphone-kuda.html" rel="bookmark" title="Nu o aud pe cealaltă persoană de pe iPhone"><img width="218" height="150" class="entry-thumb" src="/uploads/102a4c2557c4a10020042ec0d6eb9b69.jpg" alt="Nu o aud pe cealaltă persoană de pe iPhone" title="Nu o aud pe cealaltă persoană de pe iPhone"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/processors/" class="td-post-category">Procesoare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/ploho-slyshno-iphone-6-preobrazhenskaya-ploshchad-ne-slyshit-sobesednik-na-iphone-kuda.html" rel="bookmark" title="Nu o aud pe cealaltă persoană de pe iPhone">Nu o aud pe cealaltă persoană de pe iPhone</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/perestala-rabotat-kamera-iphone-chto-delat-chto-delat-esli.html" rel="bookmark" title="Ce trebuie făcut dacă camera de pe iPhone nu pornește?"><img width="218" height="150" class="entry-thumb" src="/uploads/639cdf9c9efd357d67d9b4007212352f.jpg" alt="Ce trebuie făcut dacă camera de pe iPhone nu pornește?" title="Ce trebuie făcut dacă camera de pe iPhone nu pornește?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/processors/" class="td-post-category">Procesoare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/perestala-rabotat-kamera-iphone-chto-delat-chto-delat-esli.html" rel="bookmark" title="Ce trebuie făcut dacă camera de pe iPhone nu pornește?">Ce trebuie făcut dacă camera de pe iPhone nu pornește?</a></h3> </div> </div> </div> </div> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/ustanovka-ipad-mini-v-avtomobil-kreplenie-v-mashinu-dlya-ipad-mini-produkciya-ppyple.html" rel="bookmark" title="Suport auto pentru iPad mini"><img width="218" height="150" class="entry-thumb" src="/uploads/e1870990765dbe14fa659d4f8891897f.jpg" alt="Suport auto pentru iPad mini" title="Suport auto pentru iPad mini"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/more/" class="td-post-category">Alte</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/ustanovka-ipad-mini-v-avtomobil-kreplenie-v-mashinu-dlya-ipad-mini-produkciya-ppyple.html" rel="bookmark" title="Suport auto pentru iPad mini">Suport auto pentru iPad mini</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/ne-rabotaet-pereklyuchatel-vibro-v-iphone-kak-vklyuchit-ili-otklyuchit.html" rel="bookmark" title="Cum să activați sau să dezactivați tastele lipicioase de pe tastatură Remediați singur butonul de volum lipicios de pe smartphone"><img width="218" height="150" class="entry-thumb" src="/uploads/a57ceb2d85fcd3a6a84e80a7720a75a0.jpg" alt="Cum să activați sau să dezactivați tastele lipicioase de pe tastatură Remediați singur butonul de volum lipicios de pe smartphone" title="Cum să activați sau să dezactivați tastele lipicioase de pe tastatură Remediați singur butonul de volum lipicios de pe smartphone"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/windows-7/" class="td-post-category">Windows 7</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/ne-rabotaet-pereklyuchatel-vibro-v-iphone-kak-vklyuchit-ili-otklyuchit.html" rel="bookmark" title="Cum să activați sau să dezactivați tastele lipicioase de pe tastatură Remediați singur butonul de volum lipicios de pe smartphone">Cum să activați sau să dezactivați tastele lipicioase de pe tastatură Remediați singur butonul de volum lipicios de pe smartphone</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/kompyuter-ne-vidit-provodnoi-internet-chto-delat-esli-setevoi-kabel.html" rel="bookmark" title="Ce se întâmplă dacă cablul de rețea nu este conectat, deși este conectat?"><img width="218" height="150" class="entry-thumb" src="/uploads/1ad40d3c31d715414e86ee53d4b967a9.jpg" alt="Ce se întâmplă dacă cablul de rețea nu este conectat, deși este conectat?" title="Ce se întâmplă dacă cablul de rețea nu este conectat, deși este conectat?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/more/" class="td-post-category">Alte</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kompyuter-ne-vidit-provodnoi-internet-chto-delat-esli-setevoi-kabel.html" rel="bookmark" title="Ce se întâmplă dacă cablul de rețea nu este conectat, deși este conectat?">Ce se întâmplă dacă cablul de rețea nu este conectat, deși este conectat?</a></h3> </div> </div> </div> </div> <div class="td-related-row"> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/karta-lenty-skrinshot-stocard-i-koshelek-diskontnye-karty-iz-prilozheniya.html" rel="bookmark" title="StoCard și Wallet: carduri de reducere din aplicație"><img width="218" height="150" class="entry-thumb" src="/uploads/699946ee81a5b2d7e73da816d03ef5b5.jpg" alt="StoCard și Wallet: carduri de reducere din aplicație" title="StoCard și Wallet: carduri de reducere din aplicație"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/motherboard/" class="td-post-category">plăci de bază</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/karta-lenty-skrinshot-stocard-i-koshelek-diskontnye-karty-iz-prilozheniya.html" rel="bookmark" title="StoCard și Wallet: carduri de reducere din aplicație">StoCard și Wallet: carduri de reducere din aplicație</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/proveryaem-naushniki-onlain-bolshoe-testirovanie-naushnikov-testovye-treki.html" rel="bookmark" title="Testarea căștilor mari Piste de testare a căștilor"><img width="218" height="150" class="entry-thumb" src="/uploads/e9b9ae6b2a7800e08657922453538ce8.jpg" alt="Testarea căștilor mari Piste de testare a căștilor" title="Testarea căștilor mari Piste de testare a căștilor"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/processors/" class="td-post-category">Procesoare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/proveryaem-naushniki-onlain-bolshoe-testirovanie-naushnikov-testovye-treki.html" rel="bookmark" title="Testarea căștilor mari Piste de testare a căștilor">Testarea căștilor mari Piste de testare a căștilor</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/obzor-besprovodnyh-naushnikov-beatsx-besprovodnye-naushniki-beats-x-wireless.html" rel="bookmark" title="Căști fără fir Beats X Beats EP On-Ear"><img width="218" height="150" class="entry-thumb" src="/uploads/1c44eddbac75bbfaa6ef248247af38bd.jpg" alt="Căști fără fir Beats X Beats EP On-Ear" title="Căști fără fir Beats X Beats EP On-Ear"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/motherboard/" class="td-post-category">plăci de bază</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/obzor-besprovodnyh-naushnikov-beatsx-besprovodnye-naushniki-beats-x-wireless.html" rel="bookmark" title="Căști fără fir Beats X Beats EP On-Ear">Căști fără fir Beats X Beats EP On-Ear</a></h3> </div> </div> </div> </div></div></div> </div> </div> <div class="td-pb-span4 td-main-sidebar"> <div class="td-ss-main-sidebar"> <aside class="widget �lambda_169101"> <div style="margin:10px 0"> </div> </aside> <div class="td_block_wrap td_block_1 td_block_widget td_uid_2_5a23c04f0cdc0_rand td-pb-border-top td_block_template_1 td-column-1" data-td-block-uid="td_uid_2_5a23c04f0cdc0"> <div class="td-block-title-wrap"> <h4 class="block-title"><span class="td-pulldown-size">Recomandat</span></h4> </div> <div id=td_uid_2_5a23c04f0cdc0 class="td_block_inner"> <div class="td-block-span12"> <div class="td_module_4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/kak-sdelat-skrinshot-na-iphone-ipad-ili-ipod-pyatyu-sposobami-kak-delaetsya.html" rel="bookmark" title="Cum sunt realizate capturile de ecran pe iPad?"><img width="324" height="235" class="entry-thumb" src="/uploads/9d0281b09616e893bf302ab23b80c95c.jpg" alt="Cum sunt realizate capturile de ecran pe iPad?" title="Cum sunt realizate capturile de ecran pe iPad?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/motherboard/" class="td-post-category">plăci de bază</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-sdelat-skrinshot-na-iphone-ipad-ili-ipod-pyatyu-sposobami-kak-delaetsya.html" rel="bookmark" title="Cum sunt realizate capturile de ecran pe iPad?">Cum sunt realizate capturile de ecran pe iPad?</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Când utilizează iPad (iPhone sau iPod Touch), mulți oameni doresc să-și surprindă realizările în jocuri pe o captură de ecran, să trimită o captură de ecran din ...</div> </div> <!-- /next_post --> </div> <div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/chto-oznachaet-miganie-zelenogo-signala-svetofora-signaly-svetofora-i.html" rel="bookmark" title="Semafoare și semnale de circulație"><img width="100" height="70" class="entry-thumb" src="/uploads/7b4c198aa9c04d679094613077d57b14.jpg" alt="Semafoare și semnale de circulație" title="Semafoare și semnale de circulație"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/chto-oznachaet-miganie-zelenogo-signala-svetofora-signaly-svetofora-i.html" rel="bookmark" title="Semafoare și semnale de circulație">Semafoare și semnale de circulație</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/security/" class="td-post-category">Siguranță</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/vosklicatelnyi-znak-u-soobshcheniya-v-kontakte-avtomaticheskoe.html" rel="bookmark" title="Schimbați automat culoarea mesajelor și fonturilor primite în funcție de expeditor, subiect sau destinatari"><img width="100" height="70" class="entry-thumb" src="/uploads/8b1e96f942de4cdece9e268635802ad7.jpg" alt="Schimbați automat culoarea mesajelor și fonturilor primite în funcție de expeditor, subiect sau destinatari" title="Schimbați automat culoarea mesajelor și fonturilor primite în funcție de expeditor, subiect sau destinatari"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/vosklicatelnyi-znak-u-soobshcheniya-v-kontakte-avtomaticheskoe.html" rel="bookmark" title="Schimbați automat culoarea mesajelor și fonturilor primite în funcție de expeditor, subiect sau destinatari">Schimbați automat culoarea mesajelor și fonturilor primite în funcție de expeditor, subiect sau destinatari</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/power-supply/" class="td-post-category">Surse de alimentare</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/dobavlenie-kistei-v-fotoshop-ustanovka-kistei-v-fotoshop-ustanovka-v.html" rel="bookmark" title="Instalarea pensulelor în Photoshop"><img width="100" height="70" class="entry-thumb" src="/uploads/c7160c400ca69639e087fee70820efc4.jpg" alt="Instalarea pensulelor în Photoshop" title="Instalarea pensulelor în Photoshop"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/dobavlenie-kistei-v-fotoshop-ustanovka-kistei-v-fotoshop-ustanovka-v.html" rel="bookmark" title="Instalarea pensulelor în Photoshop">Instalarea pensulelor în Photoshop</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/kak-vstavit-nabor-kistei-v-fotoshop-kak-pravilno-ustanovit.html" rel="bookmark" title="Cum se instalează (se adaugă) noi pensule în Photoshop?"><img width="100" height="70" class="entry-thumb" src="/uploads/7cae51ab18b8209681e433ebbd68ba1f.jpg" alt="Cum se instalează (se adaugă) noi pensule în Photoshop?" title="Cum se instalează (se adaugă) noi pensule în Photoshop?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-vstavit-nabor-kistei-v-fotoshop-kak-pravilno-ustanovit.html" rel="bookmark" title="Cum se instalează (se adaugă) noi pensule în Photoshop?">Cum se instalează (se adaugă) noi pensule în Photoshop?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/case/" class="td-post-category">Carcase</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/prodvinutaya-rabota-s-rezervnymi-kopiyami-iphone-rukovodstvo-kuda.html" rel="bookmark" title="Unde iTunes stochează o copie de rezervă: Găsirea datelor salvate Cum se schimbă magazinele de copiere de rezervă iTunes"><img width="100" height="70" class="entry-thumb" src="/uploads/96e205ed8f76e586ee340e1e001a9bec.jpg" alt="Unde iTunes stochează o copie de rezervă: Găsirea datelor salvate Cum se schimbă magazinele de copiere de rezervă iTunes" title="Unde iTunes stochează o copie de rezervă: Găsirea datelor salvate Cum se schimbă magazinele de copiere de rezervă iTunes"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/prodvinutaya-rabota-s-rezervnymi-kopiyami-iphone-rukovodstvo-kuda.html" rel="bookmark" title="Unde iTunes stochează o copie de rezervă: Găsirea datelor salvate Cum se schimbă magazinele de copiere de rezervă iTunes">Unde iTunes stochează o copie de rezervă: Găsirea datelor salvate Cum se schimbă magazinele de copiere de rezervă iTunes</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/security/" class="td-post-category">Siguranță</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/chto-oznachaet-v-aifone-blok-knizhnoi-orientacii-blokirovka.html" rel="bookmark" title="Blocați orientarea portretului pe iPhone - ce este"><img width="100" height="70" class="entry-thumb" src="/uploads/837cde8a9b3fd79255936ab2638fabab.jpg" alt="Blocați orientarea portretului pe iPhone - ce este" title="Blocați orientarea portretului pe iPhone - ce este"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/chto-oznachaet-v-aifone-blok-knizhnoi-orientacii-blokirovka.html" rel="bookmark" title="Blocați orientarea portretului pe iPhone - ce este">Blocați orientarea portretului pe iPhone - ce este</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> </div> </div> </div> </div> </div> </div> <aside class="widget_text td_block_template_1 widget widget_custom_html"> <div class="textwidget custom-html-widget"> </div> </aside> </div> </div> </div> </div> </div> <div class="td-footer-wrapper td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span12"> </div> </div> <div class="td-pb-row"> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_11_5a23980e76adb_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_11_5a23980e76adb" > <div class="td-block-title-wrap"></div><div id=td_uid_11_5a23980e76adb class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/aifon-6-ne-rabotaet-datchik-priblizheniya-prichiny-chto-delat-esli.html" rel="bookmark" title="Ce trebuie făcut dacă senzorul de proximitate de pe iPhone nu funcționează?"><img width="218" height="150" class="entry-thumb" src="/uploads/1c10f71b96ae7365a76cc55c8e45ccc4.jpg" alt="Ce trebuie făcut dacă senzorul de proximitate de pe iPhone nu funcționează?" title="Ce trebuie făcut dacă senzorul de proximitate de pe iPhone nu funcționează?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/aifon-6-ne-rabotaet-datchik-priblizheniya-prichiny-chto-delat-esli.html" rel="bookmark" title="Ce trebuie făcut dacă senzorul de proximitate de pe iPhone nu funcționează?">Ce trebuie făcut dacă senzorul de proximitate de pe iPhone nu funcționează?</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/vatsap-prihodit-bez-zvuka-osnovnye-problemy-s-whatsapp-nastraivaem-v-messendzhere.html" rel="bookmark" title="Principalele probleme cu WhatsApp"><img width="218" height="150" class="entry-thumb" src="/uploads/efd1dbf34d1d46d16ed69300328041c5.jpg" alt="Principalele probleme cu WhatsApp" title="Principalele probleme cu WhatsApp"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/vatsap-prihodit-bez-zvuka-osnovnye-problemy-s-whatsapp-nastraivaem-v-messendzhere.html" rel="bookmark" title="Principalele probleme cu WhatsApp">Principalele probleme cu WhatsApp</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/skolko-vesit-prilozhenie-yandeks-yandeks-taksi-prilozhenie-a-gde-zhe-yandeks.html" rel="bookmark" title="Cât cântărește o aplicație Yandex?"><img width="218" height="150" class="entry-thumb" src="/uploads/245428eb5d2f64d9ca4da098e2b1df5e.jpg" alt="Cât cântărește o aplicație Yandex?" title="Cât cântărește o aplicație Yandex?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/skolko-vesit-prilozhenie-yandeks-yandeks-taksi-prilozhenie-a-gde-zhe-yandeks.html" rel="bookmark" title="Cât cântărește o aplicație Yandex?">Cât cântărește o aplicație Yandex?</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/polozheniya-i-usloviya-apple-na-chto-my-soglashaemsya-kogda.html" rel="bookmark" title="La ce suntem de acord când instalăm software-ul Apple"><img width="218" height="150" class="entry-thumb" src="/uploads/cbfca76555c98cc8054c2bf7e9e17d16.jpg" alt="La ce suntem de acord când instalăm software-ul Apple" title="La ce suntem de acord când instalăm software-ul Apple"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/polozheniya-i-usloviya-apple-na-chto-my-soglashaemsya-kogda.html" rel="bookmark" title="La ce suntem de acord când instalăm software-ul Apple">La ce suntem de acord când instalăm software-ul Apple</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/chto-delat-esli-oshibka-zapisi-disk-chto-delat-esli.html" rel="bookmark" title="Ce trebuie făcut dacă Steam a întâmpinat o eroare în timp ce scria pe disc"><img width="218" height="150" class="entry-thumb" src="/uploads/fa7aa840c94dc3579deb9bc1bb6029d7.jpg" alt="Ce trebuie făcut dacă Steam a întâmpinat o eroare în timp ce scria pe disc" title="Ce trebuie făcut dacă Steam a întâmpinat o eroare în timp ce scria pe disc"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/chto-delat-esli-oshibka-zapisi-disk-chto-delat-esli.html" rel="bookmark" title="Ce trebuie făcut dacă Steam a întâmpinat o eroare în timp ce scria pe disc">Ce trebuie făcut dacă Steam a întâmpinat o eroare în timp ce scria pe disc</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/stiralnye-mashiny-samsung-stiralnye-mashiny-samsung-stiralnaya-mashina-samsung-diamond-4.html" rel="bookmark" title="Mașini de spălat Samsung Mașină de spălat Samsung diamant 4 kg"><img width="218" height="150" class="entry-thumb" src="/uploads/80407b440b674ad38f251e80a369687c.jpg" alt="Mașini de spălat Samsung Mașină de spălat Samsung diamant 4 kg" title="Mașini de spălat Samsung Mașină de spălat Samsung diamant 4 kg"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/stiralnye-mashiny-samsung-stiralnye-mashiny-samsung-stiralnaya-mashina-samsung-diamond-4.html" rel="bookmark" title="Mașini de spălat Samsung Mașină de spălat Samsung diamant 4 kg">Mașini de spălat Samsung Mașină de spălat Samsung diamant 4 kg</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div> </div> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_12_5a23980e79990_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_12_5a23980e79990" > <div class="td-block-title-wrap"></div><div id=td_uid_12_5a23980e79990 class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/naushniki-haiper-iks-harakteristiki-garnitury-ot-kingston-operativnaya.html" rel="bookmark" title="HyperX RAM: recenzie, caracteristici, overclocking HyperX"><img width="218" height="150" class="entry-thumb" src="/uploads/f87324493054b8532f1069482cba169e.jpg" alt="HyperX RAM: recenzie, caracteristici, overclocking HyperX" title="HyperX RAM: recenzie, caracteristici, overclocking HyperX"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/naushniki-haiper-iks-harakteristiki-garnitury-ot-kingston-operativnaya.html" rel="bookmark" title="HyperX RAM: recenzie, caracteristici, overclocking HyperX">HyperX RAM: recenzie, caracteristici, overclocking HyperX</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/tnt-club---chto-takoe-tnt-club-i-kak-eto-rabotaet-foto-realnyh-pokupok-v-club-markete.html" rel="bookmark" title="Fotografii cu achiziții reale pe piața CLUB"><img width="218" height="150" class="entry-thumb" src="/uploads/f796ddb66e163580efec2e9ccfad0958.jpg" alt="Fotografii cu achiziții reale pe piața CLUB" title="Fotografii cu achiziții reale pe piața CLUB"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/tnt-club---chto-takoe-tnt-club-i-kak-eto-rabotaet-foto-realnyh-pokupok-v-club-markete.html" rel="bookmark" title="Fotografii cu achiziții reale pe piața CLUB">Fotografii cu achiziții reale pe piața CLUB</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/vot-chem-zanimalsya-vova-zhigan-do-proekta-skandalnoe-video-vova-zhigan.html" rel="bookmark" title="Vova Zhigan s-a dovedit a fi un corp străin în cadrul proiectului Videoclip scandalos: Vladimir Zhigan în fața unei camere web"><img width="218" height="150" class="entry-thumb" src="/uploads/2adbf34ea1f4b8b5b7fc83bceb1e7512.jpg" alt="Vova Zhigan s-a dovedit a fi un corp străin în cadrul proiectului Videoclip scandalos: Vladimir Zhigan în fața unei camere web" title="Vova Zhigan s-a dovedit a fi un corp străin în cadrul proiectului Videoclip scandalos: Vladimir Zhigan în fața unei camere web"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/vot-chem-zanimalsya-vova-zhigan-do-proekta-skandalnoe-video-vova-zhigan.html" rel="bookmark" title="Vova Zhigan s-a dovedit a fi un corp străin în cadrul proiectului Videoclip scandalos: Vladimir Zhigan în fața unei camere web">Vova Zhigan s-a dovedit a fi un corp străin în cadrul proiectului Videoclip scandalos: Vladimir Zhigan în fața unei camere web</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/servisy-menyu-sim-karty-megafon-usluga-megafon-sim-menyu-dlya.html" rel="bookmark" title="Serviciul Megafon „Meniul Sim” pentru conectarea conținutului de divertisment"><img width="218" height="150" class="entry-thumb" src="/uploads/70f4c71081075785c34b6be4b43a97b4.jpg" alt="Serviciul Megafon „Meniul Sim” pentru conectarea conținutului de divertisment" title="Serviciul Megafon „Meniul Sim” pentru conectarea conținutului de divertisment"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/servisy-menyu-sim-karty-megafon-usluga-megafon-sim-menyu-dlya.html" rel="bookmark" title="Serviciul Megafon „Meniul Sim” pentru conectarea conținutului de divertisment">Serviciul Megafon „Meniul Sim” pentru conectarea conținutului de divertisment</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/servisy-menyu-sim-karty-megafon-megafonpro-chto-eto-takoe-i-kak.html" rel="bookmark" title="MegaFonPRO: ce este și cum să dezactivați abonamentele mobile"><img width="218" height="150" class="entry-thumb" src="/uploads/494fcf77c503830a2b84742c55d50908.jpg" alt="MegaFonPRO: ce este și cum să dezactivați abonamentele mobile" title="MegaFonPRO: ce este și cum să dezactivați abonamentele mobile"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/servisy-menyu-sim-karty-megafon-megafonpro-chto-eto-takoe-i-kak.html" rel="bookmark" title="MegaFonPRO: ce este și cum să dezactivați abonamentele mobile">MegaFonPRO: ce este și cum să dezactivați abonamentele mobile</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/kak-zarabatyvat-bally-v-tnt-klube-kak-skachat-i-ustanovit-prilozhenie.html" rel="bookmark" title="Cum să descărcați și să instalați aplicația „TNT-Club” pe telefon pentru votul în proiectele de stele pentru participanți: link de descărcare"><img width="218" height="150" class="entry-thumb" src="/uploads/9f11636bc243b7c3a60f6c8770c77f4c.jpg" alt="Cum să descărcați și să instalați aplicația „TNT-Club” pe telefon pentru votul în proiectele de stele pentru participanți: link de descărcare" title="Cum să descărcați și să instalați aplicația „TNT-Club” pe telefon pentru votul în proiectele de stele pentru participanți: link de descărcare"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-zarabatyvat-bally-v-tnt-klube-kak-skachat-i-ustanovit-prilozhenie.html" rel="bookmark" title="Cum să descărcați și să instalați aplicația „TNT-Club” pe telefon pentru votul în proiectele de stele pentru participanți: link de descărcare">Cum să descărcați și să instalați aplicația „TNT-Club” pe telefon pentru votul în proiectele de stele pentru participanți: link de descărcare</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div> </div> <div class="td-pb-span4"> <div class="td_block_wrap td_block_15 td_block_widget td_uid_13_5a23980e7caa8_rand td-pb-border-top td_block_template_1 td-column-1 td_block_padding" data-td-block-uid="td_uid_13_5a23980e7caa8" > <div class="td-block-title-wrap"></div><div id=td_uid_13_5a23980e7caa8 class="td_block_inner td-column-1"><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/nado-registrirovatsya-v-tnt-klab-uchastniki-shou-tancy.html" rel="bookmark" title="Participanții la spectacolul „Dansuri” se luptă pentru titlul de cel mai bun dansator din Rusia"><img width="218" height="150" class="entry-thumb" src="/uploads/5b0cf76098fd9b8bda024018110f0f0e.jpg" alt="Participanții la spectacolul „Dansuri” se luptă pentru titlul de cel mai bun dansator din Rusia" title="Participanții la spectacolul „Dansuri” se luptă pentru titlul de cel mai bun dansator din Rusia"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/nado-registrirovatsya-v-tnt-klab-uchastniki-shou-tancy.html" rel="bookmark" title="Participanții la spectacolul „Dansuri” se luptă pentru titlul de cel mai bun dansator din Rusia">Participanții la spectacolul „Dansuri” se luptă pentru titlul de cel mai bun dansator din Rusia</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/kak-sobirat-bally-v-tnt-klab-kak-golosovat-v-tnt-klab-v-tancah-bitve.html" rel="bookmark" title="Cum se votează în TNT-Club în dansuri, Bătălia psihicilor pentru participanții la aplicație de la telefon: instrucțiuni"><img width="218" height="150" class="entry-thumb" src="/uploads/d449bd5fd85d77bc1b6e4670e71f04e9.jpg" alt="Cum se votează în TNT-Club în dansuri, Bătălia psihicilor pentru participanții la aplicație de la telefon: instrucțiuni" title="Cum se votează în TNT-Club în dansuri, Bătălia psihicilor pentru participanții la aplicație de la telefon: instrucțiuni"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-sobirat-bally-v-tnt-klab-kak-golosovat-v-tnt-klab-v-tancah-bitve.html" rel="bookmark" title="Cum se votează în TNT-Club în dansuri, Bătălia psihicilor pentru participanții la aplicație de la telefon: instrucțiuni">Cum se votează în TNT-Club în dansuri, Bătălia psihicilor pentru participanții la aplicație de la telefon: instrucțiuni</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/li-pozvonit-operatoru-bilain-kak-i-po-kakim-nomeram-pozvonit-operatoru.html" rel="bookmark" title="Cum și cu ce numere să apelați operatorul beeline pentru consultare"><img width="218" height="150" class="entry-thumb" src="/uploads/cb5381a8ef10c3e2387568a6d180ea51.jpg" alt="Cum și cu ce numere să apelați operatorul beeline pentru consultare" title="Cum și cu ce numere să apelați operatorul beeline pentru consultare"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/li-pozvonit-operatoru-bilain-kak-i-po-kakim-nomeram-pozvonit-operatoru.html" rel="bookmark" title="Cum și cu ce numere să apelați operatorul beeline pentru consultare">Cum și cu ce numere să apelați operatorul beeline pentru consultare</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/niveya-testirovanie-produkcii-klub-ekspertov-nivea-vozmozhnost-pervymi.html" rel="bookmark" title="Testarea produsului Nivea"><img width="218" height="150" class="entry-thumb" src="/uploads/a426c67bb5d3a81992a8ecb80608dc91.jpg" alt="Testarea produsului Nivea" title="Testarea produsului Nivea"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/niveya-testirovanie-produkcii-klub-ekspertov-nivea-vozmozhnost-pervymi.html" rel="bookmark" title="Testarea produsului Nivea">Testarea produsului Nivea</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/kak-vosstanovit-dialogi-ili-soobshcheniya-v-kontakte-kak.html" rel="bookmark" title="Cum se restaurează dialogurile sau mesajele dintr-un contact Ce trebuie făcut dacă toate mesajele VKontakte au dispărut"><img width="218" height="150" class="entry-thumb" src="/uploads/0ec300c584941c8328c267cd04d8ef87.jpg" alt="Cum se restaurează dialogurile sau mesajele dintr-un contact Ce trebuie făcut dacă toate mesajele VKontakte au dispărut" title="Cum se restaurează dialogurile sau mesajele dintr-un contact Ce trebuie făcut dacă toate mesajele VKontakte au dispărut"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-vosstanovit-dialogi-ili-soobshcheniya-v-kontakte-kak.html" rel="bookmark" title="Cum se restaurează dialogurile sau mesajele dintr-un contact Ce trebuie făcut dacă toate mesajele VKontakte au dispărut">Cum se restaurează dialogurile sau mesajele dintr-un contact Ce trebuie făcut dacă toate mesajele VKontakte au dispărut</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ro/pochta-servis-a-ya-37-kompaniya-pochta-servis-otzyvy-osobennosti-i-uslugi-ooo-pochta-servis-otzy.html" rel="bookmark" title="Companie"Почта сервис": отзывы, особенности и услуги"><img width="218" height="150" class="entry-thumb" src="/uploads/5f7e45819a7965f3d42196211084f6af.jpg" alt="Companie"Почта сервис": отзывы, особенности и услуги" title="Companie"Почта сервис": отзывы, особенности и услуги"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/pochta-servis-a-ya-37-kompaniya-pochta-servis-otzyvy-osobennosti-i-uslugi-ooo-pochta-servis-otzy.html" rel="bookmark" title="Companie"Почта сервис": отзывы, особенности и услуги">Companie de servicii de corespondență: recenzii, caracteristici și servicii</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside> </div> </div> </div> </div> <div class="td-sub-footer-container td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span td-sub-footer-menu"> </div> <div class="td-pb-span td-sub-footer-copy">Copyright 2021 - Repararea computerelor și laptopurilor. Plăci video, hard disk-uri, internet, monitoare.</div> </div> </div> </div> </div> <style type="text/css" media="screen"> /* custom css theme panel */ .td-post-header .entry-title { font-weight: normal !important; } h1.entry-title { font-weight: normal !important; border-bottom:#c44c4c 2px dotted; } h1.entry-title:before { content: "\f184"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .sf-menu ul .td-menu-item > a:hover, .sf-menu ul .sfHover > a, .sf-menu ul .current-menu-ancestor > a, .sf-menu ul .current-category-ancestor > a, .sf-menu ul .current-menu-item > a { color: #edf3f7; } .td-post-content h2 { border-bottom:#c44c4c 2px dotted;} .td-post-content h2:before { content: "\f184"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-post-content h3 { border-bottom:#c44c4c 2px dotted;} .td-post-content h3:before { content: "\f103"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .category-my .td-page-title { color:#c44c4c; font-weight: 400; font-size: 36px; } .post header .entry-title { line-height: 40px; } .td-category-description h2, .td-category-description h3 { color:#c44c4c;} .td-category-description h2 { border-bottom:#c44c4c 2px solid;} .td-category-description h2:before { content: "\f055"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-category-description h3 { border-bottom:#c44c4c 2px solid;} .td-category-description h3:before { content: "\f103"; font-family: "FontAwesome"; margin-right:10px; color:#c44c4c; } .td-category-description ol, .td-category-description ul { margin-top:20px !important; margin-bottom:20px !important;} .td-category-description ul, .td-post-content ul { padding:0; margin:0; list-style:none; clear:both;} .td-category-description ul li, .td-post-content ul li { padding:0 0 0 15px; margin:0 0 10px 35px; position:relative;} .td-category-description ul li:before, .td-post-content ul li:before { content: "\f192"; font-family: "FontAwesome"; color:#c44c4c; position:absolute; left:-10px;} .td-category-description ol, .td-post-content ol { padding:0; margin:0 0 0 5px; list-style:none; counter-reset: lipoint; clear:both;} .td-category-description ol li, .td-post-content ol li { padding:0 0 0 15px; margin:0 0 10px 35px; position:relative;} .td-category-description ol li:before, .td-post-content ol li:before { content: counter(lipoint); counter-increment: lipoint; color:#fff; position:absolute; left:-16px; background:#c44c4c; width:20px; height:20px; line-height:20px; text-align:center; -webkit-border-radius: 20px;border-radius: 20px; font-size:12px; top:3px;} .toc_list li:before { display:none} .td-header-style-9 .td-header-menu-wrap-full { /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#c44c4c+0,c10000+100 */ background: #c44c4c; /* Old browsers */ background: -moz-linear-gradient(top, #c44c4c 0%, #c10000 100%); /* FF3.6-15 */ background: -webkit-linear-gradient(top, #c44c4c 0%,#c10000 100%); /* Chrome10-25,Safari5.1-6 */ background: linear-gradient(to bottom, #c44c4c 0%,#c10000 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c44c4c', endColorstr='#c10000',GradientType=0 ); /* IE6-9 */ } .sf-menu > li > a { color: #fff; } .td-header-style-9 .header-search-wrap .td-icon-search { color: #fff; } .td-affix a { color:#000 !important;} </style> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1"} ; /* ]]> */ </script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/table-of-contents-plus/front.min.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/wp-postratings/js/postratings-js.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/themes/Newspaper/js/tagdiv_theme.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var boxzilla_options = { "testMode":"","boxes":[]} ; /* ]]> */ </script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/boxzilla/assets/js/script.min.js'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/client/js/prod/lib.core.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/client/js/prod/lib.view.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/themes/baseline/js/prod/client.js'></script> <script type='text/javascript' src='/assets/client1.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/template-tags/item/js/prod/tag.item.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/template-tags/ui/js/prod/tag.ui.js'></script> <script type='text/javascript' src='https://obanracer.ru/wp-content/plugins/simple-lightbox/content-handlers/image/js/prod/handler.image.js'></script> <script> (function(){ var html_jquery_obj = jQuery('html'); if (html_jquery_obj.length && (html_jquery_obj.is('.ie8') || html_jquery_obj.is('.ie9'))) { var path = '/wp-content/themes/Newspaper/style.css'; jQuery.get(path, function(data) { var str_split_separator = '#td_css_split_separator'; var arr_splits = data.split(str_split_separator); var arr_length = arr_splits.length; if (arr_length > 1) { var dir_path = '/wp-content/themes/Newspaper'; var splited_css = ''; for (var i = 0; i < arr_length; i++) { if (i > 0) { arr_splits[i] = str_split_separator + ' ' + arr_splits[i]; } //jQuery('head').append('<style>' + arr_splits[i] + '</style>'); var formated_str = arr_splits[i].replace(/\surl\(\'(?!data\:)/gi, function regex_function(str) { return ' url(\'' + dir_path + '/' + str.replace(/url\(\'/gi, '').replace(/^\s+|\s+$/gm,''); } ); splited_css += "<style>" + formated_str + "</style>"; } var td_theme_css = jQuery('link#td-theme-css'); if (td_theme_css.length) { td_theme_css.after(splited_css); } } } ); } } )(); </script> </body> </html>