Cum se lucrează cu documente XML în Delphi? Folosind în mod specific TXMLDocument? Utilizarea modelului obiect de document XML.

Mulți programatori Delphi asociază setările de salvare cu utilizarea INI fișierele din programele dvs. Utilizarea acestei metode în proiecte mai puțin serioase ar trebui evitată, deoarece limitează flexibilitatea, ceea ce împiedică extinderea ulterioară a programului. Merită spus că această abordare este destul de populară datorită ușurinței sale de utilizare și disponibilității instrumentelor încorporate în mediul de dezvoltare.

Cu toate acestea, opțiunea ideală pentru stocarea setărilor programului este structurată XML fișiere. Avantajul lor este că este posibil ca numărul de parametri să nu fie fixat. Pentru a înțelege mai bine acest lucru, să ne uităm la un exemplu specific.

Î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. Dacă setările au fost stocate în INI 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 nevoie de o valoare mai mare, codul va trebui rescris și recompilat corespunzător.


Folosind abordarea folosind XML fișiere, vom putea încărca dinamic toți parametrii secțiunii. Pe lângă toate acestea, fișierul de configurare va deveni mai elegant, fără numerotarea redundantă a parametrilor. In orice caz, mijloace standard a lucra cu XMLîn Delphi au multe dezavantaje, așa că recomand să folosești bibliotecă standard MSXML. De obicei, este inclus în mod implicit sisteme de operare Familia Windows.


A conecta MSXML, trebuie să generăm un fișier de interfață cu o listă a tuturor funcțiilor, importându-l de pe serverul COM. Au fost scrise destul de multe articole detaliate despre cum să importați o interfață, dar vă sugerez să descărcați fișierul MSXML2_TLB.PAS deja gata de utilizare. După ce fișierul este descărcat, plasați-l lângă proiectul dvs. sau plasați-l în folderul lib al mediului Delphi. Astfel, toate programele create vor putea folosi modulul MSXML, trebuie doar să adăugați linia MSXML2_TLB la utilizări.

Pentru claritate, luați în considerare următorul exemplu de utilizare a acestei biblioteci:

Procedura LoadData; var XMLDoc: DOMDocument; Rădăcină: IXMLDOMElement; începe XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("size/width").Text); Rădăcină:= zero; XMLDoc:= zero; Sfârşit;

Mai întâi, este creată o instanță a clasei DOMDocument și apoi conținutul fișierului settings.xml este încărcat în memorie. Deoarece conform standardului orice XML fișierul trebuie să conțină o etichetă rădăcină (în în acest caz, config), atunci trebuie să-l obținem folosind funcția DocumentElement. Apoi, conținutul dintre etichete este scos , care la rândul lor sunt situate între etichete . Astfel, din fișierul settings.xml, metoda noastră va afișa text în MessageBox "100px".

500px 100px

Aici este folosită metoda SelectSingleNode, care ia ca parametru un șir

În ciuda faptului că subiectul lucrului cu XML în Delphi a fost destul de discutat pe Internet, întrebările pe această temă apar destul de des pe diferite forumuri.

De asemenea, am scris deja, dar aș dori să revin la cazul real al analizei rapide a unui fișier XML și al extragerii datelor, ceea ce am făcut astăzi la serviciu. Nu mi-a luat mai mult de 5 minute să obțin datele necesare.

Fundal. Astăzi trebuia să procesăm date despre programe instalate pe computerele utilizatorilor (da, da, detectăm pirați :)). Departamentul tehnic mi-a furnizat aceste informații, dezlipite de utilizatorii nebănuiți prin rețea folosind WMI. Programul pe care l-au folosit produce rapoarte în format XML. În consecință, mi-au adus un munte de fișiere XML cu o structură destul de complexă din care aveam nevoie doar să extrag numele produselor software instalate.

Tratament . După ce am căutat manual câteva fișiere, mi-am dat seama că nu va dura mult să îmbătrânesc și am decis să scriu un convertor mic. După ce am lansat Delphi, am selectat obiectul XML DataBinding din depozit și i-am alimentat unul dintre fișiere. Am lăsat implicit toate setările și parametrii și ca rezultat am creat un modul cu o cantitate mare clase și interfețe pentru accesarea elementelor acestui fișier XML. Nu am petrecut mult timp să-mi dau seama de structura clasei și am trecut imediat la scrierea unui convertor.

În noua aplicație de consolă am scris un cod destul de simplu:


programul XML2TXT;

utilizări
Forme
Clase, SysUtils,
SoftwareXML în „SoftwareXML.pas”;

procedura CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i:întreg;
sr: TSearchRec;
CurDir: șir;
ExportFile: TStringList;
ÎNCEPE
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
dacă FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0 atunci
repeta
ExportFile:= TStringList.Create;
softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
pentru i:= 0 la softbase.InstalledSoftware.source.software.Count - 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt");
ExportFile.Free;
până la FindNext(sr) 0;
Sfârşit;

ÎNCEPE
Application.Initialize;
CovertXML2Text;
Sfârşit.

Ca urmare, am avut câte un fișier text pentru fiecare computer din rețea, care conținea o listă de software instalat.

Simt că acest cod necesită o explicație. De exemplu, de ce am folosit modulul Forms într-o aplicație consolă și am apelat procedura Application.Initialize;?

De fapt, este simplu - este un mic hack care vă permite să utilizați XML Data Binding într-o aplicație de consolă. Pentru că a refuzat cu încăpățânare să inițialeze clasa pentru lucrul cu XML. Nu mi-am dat seama încă motivele reale - timpul a fost important astăzi, am petrecut deja 4 din 5 minute luptând cu această eroare. :) Cred că mă voi ocupa de această problemă mai târziu și voi scrie care este motivul real.

Ciudată clasă softbase a fost creată pe baza unui fișier XML - acesta era numele elementului rădăcină și softbase.InstalledSoftware.source.software[i].DisplayName - pur și simplu navigați prin elementele imbricate la cel dorit și obțineți valoarea acestuia.

Acesta este de fapt cum arată unul dintre cele mai multe moduri rapide lucrul cu XML în Delphi.

XML este din ce în ce mai folosit 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 importarea datelor XML. Aceasta înseamnă că este timpul ca dezvoltatorii să se gândească la modul în care pot folosi datele XML în propriile aplicații.

În acest articol ne vom uita la documentul XML Model obiect(DOM) și implementarea acesteia de către Microsoft - Microsoft XML DOM.

XML DOM este un model de obiecte care oferă dezvoltatorului obiecte pentru încărcarea și procesarea fișierelor XML. Modelul obiect constă din următoarele obiecte principale: 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 prin structura documentului XML.

Să ne uităm la principalele obiecte XML DOM și să dă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 tip corespunzătoare la proiect. Pentru a face acest lucru, executăm comanda Project | Import Type 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 facem clic pe butonul Create Unit, va fi creat modulul de interfață MSXML_TLB, care ne va permite să folosim obiecte XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest și o serie de altele implementate în biblioteca MSXML.DLL. O referință la modulul MSXML_TLB trebuie să fie listată în lista Utilizări.

Dispozitiv XML DOM

Document Object Model reprezintă un document XML ca o structură arborescentă constând din ramuri. Interfețele de programare XML DOM permit aplicațiilor să navigheze în arborele de documente și să manipuleze ramurile acestuia. Fiecare ramură poate avea un anumit tip (DOMNodeType), în funcție de care sunt determinate ramurile părinte și fii. În majoritatea documentelor XML veți găsi ramuri precum element, atribut și text. Atributele sunt un tip special de ramură și nu sunt ramuri copil. Atributele sunt folosite pentru a gestiona metode speciale, furnizat 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, modele 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.

Testează documentul XML

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

Empire Burlesque 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ă ne uităm la modelul de obiect XML DOM, pe care îl vom începe 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 indică adresa URL a documentului de î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 șir, ar trebui să utilizați metoda LoadXML pentru a încărca documentul.

Pentru a controla modul în care este încărcat documentul (sincron sau asincron), utilizați proprietatea Async. În mod implicit, această proprietate este setată la True, ceea ce indică faptul că documentul este încărcat asincron și controlul este returnat aplicației înainte ca documentul să fie încărcat complet. În caz contrar, documentul este încărcat sincron, iar apoi trebuie să verificați valoarea proprietății ReadyState pentru a afla dacă documentul s-a încărcat sau nu. De asemenea, puteți crea un handler de evenimente OnReadyStateChange care va primi control atunci când valoarea proprietății ReadyState se schimbă.

Următoarele arată cum să încărcați un document XML utilizând metoda Load:

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

Odată ce documentul este încărcat, putem accesa proprietățile acestuia. Astfel, proprietatea NodeName va conține valoarea #document, proprietatea NodeTypeString va conține documentul cu valoare, iar proprietatea URL va conține valoarea fișier:///C:/DATA/DATA.xml.

Eroare de manipulare

De un interes deosebit sunt proprietățile asociate procesării documentului atunci când este încărcat. Astfel, 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 handler 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 ne ocupăm de eroare // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;

Pentru a vedea ce informații sunt returnate în cazul unei erori, să schimbăm următoarea intrare din director:

Empire Burlesque Bob Dylan STATELE UNITE ALE AMERICII Columbia 10.90 1985

îndepărtarea elementului de închidere in a doua linie:</p><p> <CD> <TITLE>Empire Burlesque <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 cod care returnează valorile proprietăților obiectului XMLDOMParseError:</p><p>XMLError:= XMLDoc.ParseError; Dacă XMLError.ErrorCode<>0 Apoi, cu XMLError, Memo1.Lines începe Add(‘File:’ + URL); Add('Cod: ' + IntToStr(ErrorCode)); Add(‘Eroare: ‘+ Motiv); Add(‘Text: ‘+SrcText); Add('Linie: ' + IntToStr(Line)); Add(‘Poziție: ‘ + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); Sfârşit;</p><p>și să rulăm 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 motivul apariției acesteia.</p> <p>Acum să restabilim elementul de închidere <TITLE>în documentul nostru și continuăm discuția despre XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Accesarea arborelui documentelor</h2> <p>Pentru a accesa un arbore de document, puteți fie să obțineți elementul rădăcină și apoi să iterați prin ramurile sale secundare, fie să găsiți o anumită ramură. În primul caz, obținem elementul rădăcină prin proprietatea DocumentElement, care returnează un obiect de tip XMLDOMNode. Următoarele arată cum să utilizați proprietatea DocumentElement pentru a obține conținutul fiecărui element copil:</p><p>Var Nod: IXMLDOMNode; Rădăcină: IXMLDOMElement; I: întreg; ... Root:= XMLDoc.DocumentElement; Pentru I:= 0 la Root.ChildNodes.Length-1 face Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Nod.Text); Sfârşit;</p><p>Pentru documentul nostru XML vom obține următorul text.</p> <p>Dacă suntem interesați de o anumită ramură sau de 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 definit în Schema XML sau Definiția tipului de document (DTD) și returnează o ramură cu acel identificator.</p> <p>Metoda GetElementByTagName necesită specificarea unui șir cu un anumit element (etichetă) și returnează toate ramurile cu acest element. Mai jos este cum să folosiți această metodă pentru a găsi toți artiștii din directorul nostru CD-ROM:</p><p>Noduri: IXMLDOMNodeList; Nod: IXMLDOMNode; ... Noduri:= XMLDoc.GetElementsByTagName('ARTIST'); Pentru I:= 0 la Noduri.Lungime-1 nu Începe Nodul:= Noduri.Element[I]; Memo1.Lines.Add(Nod.Text); Sfârşit;</p><p>Pentru documentul nostru XML vom obține următorul text</p> <p>Rețineți că metoda SelectNodes a obiectului XMLDOMNode oferă o modalitate mai flexibilă de a accesa ramurile documentului. 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>Ramura document - obiect XMLDOMNode</h2> <p>Un obiect XMLDOMNode reprezintă o ramură a documentului. Am întâlnit deja acest obiect când am primit elementul rădăcină al documentului:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Pentru a obține informații despre ramura unui document XML, puteți utiliza proprietățile obiectului XMLDOMNode (Tabelul 1).</p> <p>Pentru a accesa datele stocate într-o ramură, utilizați de obicei fie proprietatea NodeValue (disponibilă pentru atribute, ramuri de text, comentarii, instrucțiuni de procesare și secțiuni CDATA), proprietatea Text, care returnează conținutul text al ramurii, fie proprietatea NodeTypedValue . Acesta din urmă, însă, poate fi folosit doar pentru ramuri cu elemente tipizate.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigarea în arborele documentelor</h3> <p>Obiectul XMLDOMNode oferă multe modalități de a naviga în arborele documentului. De exemplu, pentru a accesa ramura părinte se folosește proprietatea ParentNode (tip XMLDOMNode), ramurile copil sunt accesate prin proprietățile ChildNodes (tip XMLDOMNodeList), FirstChild și LastChild (tip XMLDOMNode) etc. Proprietatea OwnerDocument returnează un obiect de tip XMLDOMDocument care identifică documentul XML însuși. Proprietățile enumerate mai sus vă permit să navigați cu ușurință în arborele documentului.</p> <p>Acum să trecem prin toate ramurile documentului XML:</p><p>Root:= XMLDoc.DocumentElement; Pentru I:= 0 la Root.ChildNodes.Length-1 face 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-ul obiectului XMLDOMNode oferă o modalitate mai flexibilă de a accesa ramurile documentelor. În plus, există o metodă SelectSingleNode care returnează doar prima ramură a documentului. Ambele metode vă permit să specificați șabloane XSL pentru a căuta ramuri.</p> <p>Să parcurgem procesul de utilizare a metodei SelectNodes pentru a prelua toate ramurile care au o ramură CD și o subramură PRICE:</p><p>Root:= XMLDoc.DocumentElement; Noduri:= Root.SelectNodes('CD/PRICE');</p><p>Toate sub-ramurile PRICE ale sucursalei CD vor fi plasate în colecția Nodes. Vom reveni la discuția 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 copiilor</h3> <p>Pentru a manipula ramurile copil, putem folosi metodele obiectului XMLDOMNode (Tabelul 2).</p> <p>Pentru a șterge complet intrarea pentru 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 elementul rădăcină Root:= XMLDoc.DocumentElement; Nod:= Rădăcină; // Îndepărtați prima ramură copil Node.RemoveChild(Node.FirstChild);</p><p>Rețineți că în acest exemplu ștergem prima ramură copil. Cum să eliminați 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 elementul rădăcină Root:= XMLDoc.DocumentElement; // și prima ramură copil Node:= Root.FirstChild; // Îndepărtaț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 nouă ramură - 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 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 valoarea Child.Text:= 'Division Bell'; // Adăugați un element <COUNTRY>Copil:= XMLDoc.CreateNode(1, 'COUNTRY', ''); // Adăugați un element NewNode.AppendChild(Child); // Și setați valoarea Child.Text:= 'UK'; // Adăugați un element <COMPANY>Copil:= XMLDoc.CreateNode(1, 'COMPANY', ''); // Adăugați un element NewNode.AppendChild(Child); // Și setați valoarea Child.Text:= ‘EMI Records Ltd.’; // Adăugați un element <PRICE>Child:= 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, 'AN', ''); // 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ătoarea secvență de pași pentru a adăuga o nouă ramură:</p> <ul><li>Crearea unei noi ramuri folosind 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 elementului prin proprietatea Text;</li> <li>...repetați pentru toate elementele.</li> </ul></li> <li>Adăugarea unei noi ramuri la un document utilizând metoda AppendChild.</li> </ul><p>Amintiți-vă că metoda AppendChild adaugă o ramură la sfârșitul arborelui. Pentru a adăuga o ramură într-o anumită locație din arbore, trebuie să utilizați metoda InsertBefore.</p> <h2>Set de ramuri - obiect XMLDOMNodeList</h2> <p>Obiectul XMLNodeList conține o listă de ramuri care pot fi construite folosind metodele SelectNodes sau GetElementsByTagName sau obținute din proprietatea ChildNodes.</p> <p>Am analizat deja utilizarea acestui obiect în exemplul dat în secțiunea „Navigarea în arborele documentelor”. Vă prezentăm aici câteva remarci teoretice.</p> <p>Numărul de ramuri din listă poate fi obținut ca valoare a proprietății Length. Ramurile au indici de la 0 la Lungimea-1, iar fiecare ramură individuală este accesibilă prin elementul matrice Item cu indexul corespunzător.</p> <p>Navigarea printr-o listă 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 la începutul listei, apelați metoda Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Crearea și salvarea documentelor</h2> <p>Până acum am analizat cum puteți adăuga ramuri și elemente la documentele XML existente. Acum să creăm un document XML din mers. În primul rând, permiteți-ne să vă reamintim că un document poate fi încărcat nu numai dintr-un URL, ci și dintr-un șir obișnuit. Următoarele arată cum să creați un element rădăcină, care poate fi apoi folosit pentru a construi dinamic alte elemente (pe care le-am acoperit deja în secțiunea Manipularea ramurilor copiilor):</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); Root:= XMLDoc.DocumentElement; Nod:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Nod); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;</p><p>După construirea documentului XML, îl vom salva într-un fișier folosind metoda Save. 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 documentul XML într-un nou obiect XMLDOMDocument. În acest caz, documentul este complet procesat și, ca urmare, structura și sintaxa acestuia sunt verificate. Următoarele arată cum să salvați un document într-un alt obiect:</p><p>Procedura 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 cele din urmă, rețineți că metoda Salvare vă permite, de asemenea, să salvați un document XML pe 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 discutăm despre metoda SelectNodes a obiectului XMLDOMNode, am menționat că oferă o modalitate mai flexibilă de a accesa ramurile documentelor. Flexibilitatea constă în faptul că puteți specifica un șablon XSL ca criteriu de selectare a ramurilor. Astfel de șabloane oferă un mecanism puternic pentru căutarea informațiilor în documente XML. De exemplu, pentru a obține o listă cu toate titlurile CD-ROM-urilor muzicale din catalogul nostru, puteți rula următoarea interogare:</p><p>Pentru a afla ce discuri ale artiștilor au fost lansate în SUA, cererea se formează după cum urmează:</p><p>Noduri:= Root.SelectNodes('CD/ARTIST');</p><p>Următoarele arată cum să găsiți prima unitate din director:</p><p>Noduri:= Root.SelectNodes('CD/TITLE');</p><p>Și în ultimul rând:</p><p>Noduri:= Root.SelectNodes('CD/TITLE');</p><p>Pentru a găsi CD-uri 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 lansate după 1985, rulăm următoarea interogare:</p><p>Noduri:= Root.SelectNodes('CD/TITLE');</p><p>O discuție mai detaliată despre sintaxa XSL necesită o postare separată. Pentru a intriga cititorii și pentru a încuraja cercetările ulterioare, voi da doar un mic exemplu de posibile utilizări ale XSL. Să presupunem că trebuie să ne transformăm catalogul într-un tabel HTML obișnuit. Folosind metode tradiționale, trebuie să trecem prin toate ramurile arborelui și să formăm etichetele corespunzătoare pentru fiecare element primit. <TD>…</TD>.</p> <p>Folosind XSL, pur și simplu creăm un șablon (sau o foaie de stil) în care indicăm ce trebuie convertit și cum. Apoi suprapunem acest șablon pe directorul nostru - și am terminat: avem textul unui șablon XSL care convertește directorul într-un tabel (Listing 2).</p> <p>Codul pentru suprapunerea șablonului XSL în directorul nostru arată astfel:</p><p>Procedura 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>Încheind discuția noastră despre XSL, trebuie spus că în prezent acest limbaj este utilizat activ pentru transformarea între diverse 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ă revizuiți toate obiectele Microsoft XML DOM și să furnizați exemple de utilizare a acestora într-un articol. Aici am atins doar problemele de bază ale utilizării XML DOM în aplicații. În tabel Figura 3 prezintă toate obiectele implementate în Microsoft XML DOM.</p> <p>ComputerPress 12"2000</p> <p>XML este din ce în ce mai folosit 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 importarea datelor XML. Aceasta înseamnă că este timpul ca dezvoltatorii să se gândească la modul în care pot folosi datele XML în propriile aplicații.</p> <p>În acest articol ne vom uita la XML Document Object Model (DOM) și implementarea acestuia de către Microsoft - Microsoft XML DOM.</p> <p>XML DOM este un model de obiecte care oferă dezvoltatorului obiecte pentru încărcarea și procesarea fișierelor XML. Modelul obiect constă din următoarele obiecte principale: 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 prin structura documentului XML.</p> <p>Să ne uităm la principalele obiecte XML DOM și să dăm câteva exemple de utilizare a acestora în Borland Delphi.</p> <h2>Utilizarea XML DOM în Borland Delphi</h2> <p>Pentru a utiliza Microsoft XML DOM în aplicațiile Delphi, trebuie să conectați biblioteca de tip corespunzătoare la proiect. Pentru a face acest lucru, executăm comanda Project | Import Type 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</p> <p>După ce facem clic pe butonul Create Unit, va fi creat modulul de interfață MSXML_TLB, care ne va permite să folosim obiecte XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest și o serie de altele implementate în biblioteca MSXML.DLL. O referință la modulul MSXML_TLB trebuie să fie listată în lista Utilizări.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Dispozitiv XML DOM</h2> <p>Document Object Model reprezintă un document XML ca o structură arborescentă constând din ramuri. Interfețele de programare XML DOM permit aplicațiilor să navigheze în arborele de documente și să manipuleze ramurile acestuia. Fiecare ramură poate avea un anumit tip (DOMNodeType), în funcție de care sunt determinate ramurile părinte și fii. În majoritatea documentelor XML veți găsi ramuri precum element, atribut și text. Atributele sunt un tip special de ramură și nu sunt ramuri copil. Atributele sunt manipulate folosind metode speciale oferite de obiectele XML DOM.</p> <p>Pe lângă implementarea interfețelor recomandate de World Wide Web Consortium (W3C), Microsoft XML DOM conține metode care acceptă XSL, modele 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.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Testează documentul XML</h2> <p>Ca exemplu de document XML, să luăm un director de CD-ROM-uri muzicale, care are următoarea structură:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Empire Burlesque 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ă ne uităm la modelul de obiect XML DOM, pe care îl vom începe 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 indică adresa URL a documentului de î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 șir, ar trebui să utilizați metoda LoadXML pentru a încărca documentul.

Pentru a controla modul în care este încărcat documentul (sincron sau asincron), utilizați proprietatea Async. În mod implicit, această proprietate este setată la True, ceea ce indică faptul că documentul este încărcat asincron și controlul este returnat aplicației înainte ca documentul să fie încărcat complet. În caz contrar, documentul este încărcat sincron, iar apoi trebuie să verificați valoarea proprietății ReadyState pentru a afla dacă documentul s-a încărcat sau nu. De asemenea, puteți crea un handler de evenimente OnReadyStateChange care va primi control atunci când valoarea proprietății ReadyState se schimbă.

Următoarele arată cum să încărcați un document XML utilizând metoda Load:

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

Odată ce documentul este încărcat, putem accesa proprietățile acestuia. Astfel, proprietatea NodeName va conține valoarea #document, proprietatea NodeTypeString va conține documentul cu valoare, iar proprietatea URL va conține valoarea fișier:///C:/DATA/DATA.xml.

Eroare de manipulare

De un interes deosebit sunt proprietățile asociate procesării documentului atunci când este încărcat. Astfel, 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 handler 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 ne ocupăm de eroare // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;

Pentru a vedea ce informații sunt returnate în cazul unei erori, să schimbăm următoarea intrare din director:

Empire Burlesque Bob Dylan STATELE UNITE ALE AMERICII Columbia 10.90 1985

îndepărtarea elementului de închidere in a doua linie:</p><p> <CD> <TITLE>Empire Burlesque <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 cod care returnează valorile proprietăților obiectului XMLDOMParseError:</p><p>XMLError:= XMLDoc.ParseError; Dacă XMLError.ErrorCode<>0 Apoi, cu XMLError, Memo1.Lines începe Add(‘File:’ + URL); Add('Cod: ' + IntToStr(ErrorCode)); Add(‘Eroare: ‘+ Motiv); Add(‘Text: ‘+SrcText); Add('Linie: ' + IntToStr(Line)); Add(‘Poziție: ‘ + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); Sfârşit;</p><p>și să rulăm 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 motivul apariției acesteia.</p> <p>Acum să restabilim elementul de închidere <TITLE>în documentul nostru și continuăm discuția despre XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Accesarea arborelui documentelor</h2> <p>Pentru a accesa un arbore de document, puteți fie să obțineți elementul rădăcină și apoi să iterați prin ramurile sale secundare, fie să găsiți o anumită ramură. În primul caz, obținem elementul rădăcină prin proprietatea DocumentElement, care returnează un obiect de tip XMLDOMNode. Următoarele arată cum să utilizați proprietatea DocumentElement pentru a obține conținutul fiecărui element copil:</p><p>Var Nod: IXMLDOMNode; Rădăcină: IXMLDOMElement; I: întreg; ... Root:= XMLDoc.DocumentElement; Pentru I:= 0 la Root.ChildNodes.Length-1 face Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Nod.Text); Sfârşit;</p><p>Pentru documentul nostru XML vom obține următorul text.</p> <p>Dacă suntem interesați de o anumită ramură sau de 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 definit în Schema XML sau Definiția tipului de document (DTD) și returnează o ramură cu acel identificator.</p> <p>Metoda GetElementByTagName necesită specificarea unui șir cu un anumit element (etichetă) și returnează toate ramurile cu acest element. Mai jos este cum să folosiți această metodă pentru a găsi toți artiștii din directorul nostru CD-ROM:</p><p>Noduri: IXMLDOMNodeList; Nod: IXMLDOMNode; ... Noduri:= XMLDoc.GetElementsByTagName('ARTIST'); Pentru I:= 0 la Noduri.Lungime-1 nu Începe Nodul:= Noduri.Element[I]; Memo1.Lines.Add(Nod.Text); Sfârşit;</p><p>Pentru documentul nostru XML vom obține următorul text</p> <p>Rețineți că metoda SelectNodes a obiectului XMLDOMNode oferă o modalitate mai flexibilă de a accesa ramurile documentului. 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>Ramura document - obiect XMLDOMNode</h2> <p>Un obiect XMLDOMNode reprezintă o ramură a documentului. Am întâlnit deja acest obiect când am primit elementul rădăcină al documentului:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Pentru a obține informații despre ramura unui document XML, puteți utiliza proprietățile obiectului XMLDOMNode (Tabelul 1).</p> <p>Pentru a accesa datele stocate într-o ramură, utilizați de obicei fie proprietatea NodeValue (disponibilă pentru atribute, ramuri de text, comentarii, instrucțiuni de procesare și secțiuni CDATA), proprietatea Text, care returnează conținutul text al ramurii, fie proprietatea NodeTypedValue . Acesta din urmă, însă, poate fi folosit doar pentru ramuri cu elemente tipizate.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigarea în arborele documentelor</h3> <p>Obiectul XMLDOMNode oferă multe modalități de a naviga în arborele documentului. De exemplu, pentru a accesa ramura părinte se folosește proprietatea ParentNode (tip XMLDOMNode), ramurile copil sunt accesate prin proprietățile ChildNodes (tip XMLDOMNodeList), FirstChild și LastChild (tip XMLDOMNode) etc. Proprietatea OwnerDocument returnează un obiect de tip XMLDOMDocument care identifică documentul XML însuși. Proprietățile enumerate mai sus vă permit să navigați cu ușurință în arborele documentului.</p> <p>Acum să trecem prin toate ramurile documentului XML:</p><p>Root:= XMLDoc.DocumentElement; Pentru I:= 0 la Root.ChildNodes.Length-1 face 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-ul obiectului XMLDOMNode oferă o modalitate mai flexibilă de a accesa ramurile documentelor. În plus, există o metodă SelectSingleNode care returnează doar prima ramură a documentului. Ambele metode vă permit să specificați șabloane XSL pentru a căuta ramuri.</p> <p>Să parcurgem procesul de utilizare a metodei SelectNodes pentru a prelua toate ramurile care au o ramură CD și o subramură PRICE:</p><p>Root:= XMLDoc.DocumentElement; Noduri:= Root.SelectNodes('CD/PRICE');</p><p>Toate sub-ramurile PRICE ale sucursalei CD vor fi plasate în colecția Nodes. Vom reveni la discuția 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 copiilor</h3> <p>Pentru a manipula ramurile copil, putem folosi metodele obiectului XMLDOMNode (Tabelul 2).</p> <p>Pentru a șterge complet intrarea pentru 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 elementul rădăcină Root:= XMLDoc.DocumentElement; Nod:= Rădăcină; // Îndepărtați prima ramură copil Node.RemoveChild(Node.FirstChild);</p><p>Rețineți că în acest exemplu ștergem prima ramură copil. Cum să eliminați 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 elementul rădăcină Root:= XMLDoc.DocumentElement; // și prima ramură copil Node:= Root.FirstChild; // Îndepărtaț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 nouă ramură - 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 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 valoarea Child.Text:= 'Division Bell'; // Adăugați un element <COUNTRY>Copil:= XMLDoc.CreateNode(1, 'COUNTRY', ''); // Adăugați un element NewNode.AppendChild(Child); // Și setați valoarea Child.Text:= 'UK'; // Adăugați un element <COMPANY>Copil:= XMLDoc.CreateNode(1, 'COMPANY', ''); // Adăugați un element NewNode.AppendChild(Child); // Și setați valoarea Child.Text:= ‘EMI Records Ltd.’; // Adăugați un element <PRICE>Child:= 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, 'AN', ''); // 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ătoarea secvență de pași pentru a adăuga o nouă ramură:</p> <ul><li>Crearea unei noi ramuri folosind 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 elementului prin proprietatea Text;</li> <li>...repetați pentru toate elementele.</li> </ul></li> <li>Adăugarea unei noi ramuri la un document utilizând metoda AppendChild.</li> </ul><p>Amintiți-vă că metoda AppendChild adaugă o ramură la sfârșitul arborelui. Pentru a adăuga o ramură într-o anumită locație din arbore, trebuie să utilizați metoda InsertBefore.</p> <h2>Set de ramuri - obiect XMLDOMNodeList</h2> <p>Obiectul XMLNodeList conține o listă de ramuri care pot fi construite folosind metodele SelectNodes sau GetElementsByTagName sau obținute din proprietatea ChildNodes.</p> <p>Am analizat deja utilizarea acestui obiect în exemplul dat în secțiunea „Navigarea în arborele documentelor”. Vă prezentăm aici câteva remarci teoretice.</p> <p>Numărul de ramuri din listă poate fi obținut ca valoare a proprietății Length. Ramurile au indici de la 0 la Lungimea-1, iar fiecare ramură individuală este accesibilă prin elementul matrice Item cu indexul corespunzător.</p> <p>Navigarea printr-o listă 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 la începutul listei, apelați metoda Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Crearea și salvarea documentelor</h2> <p>Până acum am analizat cum puteți adăuga ramuri și elemente la documentele XML existente. Acum să creăm un document XML din mers. În primul rând, permiteți-ne să vă reamintim că un document poate fi încărcat nu numai dintr-un URL, ci și dintr-un șir obișnuit. Următoarele arată cum să creați un element rădăcină, care poate fi apoi folosit pentru a construi dinamic alte elemente (pe care le-am acoperit deja în secțiunea Manipularea ramurilor copiilor):</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); Root:= XMLDoc.DocumentElement; Nod:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Nod); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;</p><p>După construirea documentului XML, îl vom salva într-un fișier folosind metoda Save. 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 documentul XML într-un nou obiect XMLDOMDocument. În acest caz, documentul este complet procesat și, ca urmare, structura și sintaxa acestuia sunt verificate. Următoarele arată cum să salvați un document într-un alt obiect:</p><p>Procedura 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 cele din urmă, rețineți că metoda Salvare vă permite, de asemenea, să salvați un document XML pe 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 discutăm despre metoda SelectNodes a obiectului XMLDOMNode, am menționat că oferă o modalitate mai flexibilă de a accesa ramurile documentelor. Flexibilitatea constă în faptul că puteți specifica un șablon XSL ca criteriu de selectare a ramurilor. Astfel de șabloane oferă un mecanism puternic pentru căutarea informațiilor în documente XML. De exemplu, pentru a obține o listă cu toate titlurile CD-ROM-urilor muzicale din catalogul nostru, puteți rula următoarea interogare:</p><p>Pentru a afla ce discuri ale artiștilor au fost lansate în SUA, cererea se formează după cum urmează:</p><p>Noduri:= Root.SelectNodes('CD/ARTIST');</p><p>Următoarele arată cum să găsiți prima unitate din director:</p><p>Noduri:= Root.SelectNodes('CD/TITLE');</p><p>Și în ultimul rând:</p><p>Noduri:= Root.SelectNodes('CD/TITLE');</p><p>Pentru a găsi CD-uri 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 lansate după 1985, rulăm următoarea interogare:</p><p>Noduri:= Root.SelectNodes('CD/TITLE');</p><p>O discuție mai detaliată despre sintaxa XSL necesită o postare separată. Pentru a intriga cititorii și pentru a încuraja cercetările ulterioare, voi da doar un mic exemplu de posibile utilizări ale XSL. Să presupunem că trebuie să ne transformăm catalogul într-un tabel HTML obișnuit. Folosind metode tradiționale, trebuie să trecem prin toate ramurile arborelui și să formăm etichetele corespunzătoare pentru fiecare element primit. <TD>…</TD>.</p> <p>Folosind XSL, pur și simplu creăm un șablon (sau o foaie de stil) în care indicăm ce trebuie convertit și cum. Apoi suprapunem acest șablon pe directorul nostru - și am terminat: avem textul unui șablon XSL care convertește directorul într-un tabel (Listing 2).</p> <p>Codul pentru suprapunerea șablonului XSL în directorul nostru arată astfel:</p><p>Procedura 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>Încheind discuția noastră despre XSL, trebuie spus că în prezent acest limbaj este utilizat activ pentru transformarea între diverse 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ă revizuiți toate obiectele Microsoft XML DOM și să furnizați exemple de utilizare a acestora într-un articol. Aici am atins doar problemele de bază ale utilizării XML DOM în aplicații. În tabel Figura 3 prezintă toate obiectele implementate în Microsoft XML DOM.</p> <p>ComputerPress 12"2000</p> <p>Bună ziua tuturor! Am scris pe Matlab câțiva ani, apoi am simțit nevoia de a scrie un program în Delphi.</p><p>Trebuie să învăț cum să lucrez cu documente xml. Lucrez în RAD Stiduo XE3. Există o componentă TXMLDocument, probabil cunoscută de mulți programatori Delphi. Se pare că poate face multe. Dar problema este că nu există o documentație clară și o descriere pentru aceasta. Ajutorul în RAD Studio este un gunoi, deoarece acolo nu există informații normale; doar informații limitate despre unele metode și proceduri împrăștiate pe pagini (fără exemple sau descrieri adecvate). Am căutat pe tot internetul. Am găsit doar subiecte pe forumuri cu soluții la probleme specifice, unde trebuie să mai ghiciți încă o oră ce face cutare sau cutare linie când accesați un fișier xml. <br>Am nevoie de îndrumare cu privire la principalele funcții, proceduri și metode utilizate atunci când lucrez cu xml. Manual, manual, descriere. Sau cel puțin „xml în Delphi pentru manechini”. De exemplu:</p><p><i>Pentru a deschide un fișier xml, utilizați metoda XMLDocument1.LoadFromFile("filemane.xml"), unde nume fișier este numele fișierului. <br>Variabila nodelist de tip IXMLNode este utilizată pentru a stoca o listă <a href="https://obanracer.ru/ro/dochernie-i-roditelskie-elementy-v-html-tehniki-raboty-s-dom-roditelskie.html">elemente copil</a>. Pentru a defini această listă, utilizați metoda Xmldocument1.DocumentElement (unde XMLDocument1 este fișierul xml care este examinat). <br>Pentru a interoga conținutul elementului copil "element1" se folosește metoda XMLDocument1.DocumentElement.ChildNodes["element1"].Text.... <br></i><br>și în acest spirit în continuare toate metodele, procedurile și tipurile de date utilizate. <br>Unde pot găsi manuale/descrieri similare? Cine poate ajuta?</p><p>Dacă aveți nevoie de o sarcină specifică, o voi descrie. <br>Există un document xml ca:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>sus.jpg</assets><br> <images><br> <pano> <tiles>pano_u.jpg</tiles><br> <tiles>pano_f.jpg</tiles><br> </pano><br> <tour><br> <tourimages>start.jpg</tourimages><br> <tourimages>tmb.jpg</tourimages><br> </tour><br> </images><br></templateFiles><br><dimensions><br> <tiles type="pc">1910</tiles><br> <tiles type="ipad">768</tiles><br> <tiles side="iphone">512</tiles><br> <tourimages name="start.jpg" edge="long">1024</tourimages><br> <tourimages name="start.jpg" edge="short">768</tourimages><br></dimensions></p><p><hotspot name="hs015_2" style="mappoint" scena="scene017" ath="68.17644363437007" /><br><hotspot name="hs015_1" style="mappoint" scena="scene014" rz="4436007" /> <br><data name="onstart" mode="noVoice">Un text</data><br><data name="onerror" mode="noVoice">Un text de eroare</data><br><data name="onerror" mode="alarm">Alt text de eroare</data></p><p>În codul programului avem:</p><p>var <br>...<br>părinte, copil1: IXMLNode;</p><p>ÎNCEPE <br>XMLDocument1.LoadFromFile("f:\filename.x ml"); <br>XMLDocument1.Active:=true; <br>.<br>.<br>Sfârşit</p><p>Ce trebuie să înveți să faci: <br>(Îmi cer scuze anticipat dacă numesc incorect componentele documentului xml) <br>1. Obțineți numele elementului rădăcină (în cazul nostru ltm), precum și o listă cu atributele acestuia (versiunea, tipul) și valorile acestora ("1.0", "settings"). <br>2. Obțineți numărul de elemente care sunt copii ai rădăcinii. În acest caz, există 7 dintre ele: templateFiles, dimensiuni, hotspot, hotspot, date, data, data. Obțineți numele elementelor (etichete) (templateFiles, dimensiuni etc.). După ce am primit numărul de elemente și am învățat să le extrag numele, voi rula o buclă de la 0 la count-1 și voi face ceea ce am nevoie. <br>3. Obțineți cantitatea și lista de atribute ale elementului necesar. De exemplu, pentru elementul hotspot. Răspunsul corect va fi 4 atribute. Pentru primul element hotspot, acestea vor fi numele, stilul, scena, ath. Pentru al doilea - același, doar în loc de atributul ath - atributul rz. <br>Vă rugăm să rețineți că există 2 elemente hotspot în fișier, cu atribute diferite. Iată cum să lucrezi cu ele (dacă există mai mult de 1 elemente cu același nume)? <br>Vreau asta: primesc o listă de elemente copil de la rel. la cel rădăcină (vezi punctul 2), rulez o buclă for prin ele și găsesc elemente hotspot al căror parametru de nume este egal cu cel necesar (să spuneți „hs015_2” - cu siguranță va exista un astfel de element). Există vreo modalitate de a rezolva această problemă fără o buclă? Adică, obțineți valoarea atributului scenei pentru elementul hotspot al cărui nume = "hs015_2"? <br>4. Faceți cele de mai sus în raport cu nodurile și elementele care sunt copii ai copiilor. În exemplul meu, un nod (copilul și părintele lui și. <br>Dacă am înțeles corect, trebuie să transferați cumva conținutul nodului în <a href="https://obanracer.ru/ro/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">variabilă de tip</a> IXMLNode și procedați la fel ca în pașii 1-3. Asa de?</p><p>5. Trebuie să învățați cum să modificați parametrii de mai sus (setați singuri).</p><p>Asta pare să fie tot deocamdată. În această etapă, structurile sintactice sunt cele mai importante pentru mine. <br>Cine cunoaște acest subiect, vă rugăm să scrieți și alte construcții sintactice pentru a rezolva întrebările descrise mai sus (cum să obțineți atribute, numărul acestora, numărul de elemente, denumirea lor etc.). Principalul lucru acum este să stăpânesc sintaxa și îmi voi implementa algoritmul mai târziu. Vă mulțumesc mult anticipat tuturor!</p><p>P.S. Chiar nu aș vrea să-mi scriu propriul parser XML de la zero doar pentru că cele existente nu au o descriere normală.</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/top-prilozhenii-dlya-vedeniya-hozyaistva-sravnitelnye-obzory.html">Recenzii comparative ale aplicațiilor Android Aplicații plătite fără achiziții în aplicație</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>Articolul următor</span><a href="https://obanracer.ru/ro/kak-na-aipade-podklyuchit-telefonnye-zvonki-kak-zvonit-s.html">Cum să efectuați apeluri de pe iPad către dispozitive mobile - un ghid complet</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">Julia</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/pochemu-na-aipade-ne-perevorachivaetsya-ekran-i-kak-vklyuchit-avtopovorot.html" rel="bookmark" title="Ecranul iPhone-ului a încetat să se rotească"><img width="218" height="150" class="entry-thumb" src="/uploads/56725de97d3b979c3a4b580e6bb0ef81.jpg" alt="Ecranul iPhone-ului a încetat să se rotească" title="Ecranul iPhone-ului a încetat să se rotească"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/the-winchesters/" class="td-post-category">Winchesters</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/pochemu-na-aipade-ne-perevorachivaetsya-ekran-i-kak-vklyuchit-avtopovorot.html" rel="bookmark" title="Ecranul iPhone-ului a încetat să se rotească">Ecranul iPhone-ului a încetat să se rotească</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/kak-zakryt-vkladki-na-aifone-5s-kak-zakryt-vse-otkrytye.html" rel="bookmark" title="Cum să închideți toate filele deschise pe iPhone"><img width="218" height="150" class="entry-thumb" src="/uploads/01a33abbee300ad01d31028e9f01aa9c.jpg" alt="Cum să închideți toate filele deschise pe iPhone" title="Cum să închideți toate filele deschise pe iPhone"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/windows-8/" class="td-post-category">Windows 8</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-zakryt-vkladki-na-aifone-5s-kak-zakryt-vse-otkrytye.html" rel="bookmark" title="Cum să închideți toate filele deschise pe iPhone">Cum să închideți toate filele deschise 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/delat-muzykalnye-otkrytki-s-rolikom-kak-delat-krasivye-muzykalnye.html" rel="bookmark" title="Cum să faci carduri muzicale frumoase fără probleme?"><img width="218" height="150" class="entry-thumb" src="/uploads/26f2799d7a3eeb0de88b6123e5496ae6.jpg" alt="Cum să faci carduri muzicale frumoase fără probleme?" title="Cum să faci carduri muzicale frumoase fără probleme?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/power-supply/" class="td-post-category">Surse de alimentare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/delat-muzykalnye-otkrytki-s-rolikom-kak-delat-krasivye-muzykalnye.html" rel="bookmark" title="Cum să faci carduri muzicale frumoase fără probleme?">Cum să faci carduri muzicale frumoase fără probleme?</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/chto-v-mainkrafte-mozhno-sdelat-iz-lazurita-chto-mozhno-sdelat.html" rel="bookmark" title="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита"><img width="218" height="150" class="entry-thumb" src="/uploads/54fbea81e5a0aa2ff6eeea3c0621a254.jpg" alt="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита" title="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/monitors/" class="td-post-category">Monitoare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/chto-v-mainkrafte-mozhno-sdelat-iz-lazurita-chto-mozhno-sdelat.html" rel="bookmark" title="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита">Ce se poate face din lapis lazuli în Minecraft: rețete Minecraft ce să faci din lapis lazuli</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/reklamy-kak-ot-nih-izbavitsya-na-telefone-postoyanno-vyskakivaet.html" rel="bookmark" title="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?"><img width="218" height="150" class="entry-thumb" src="/uploads/1f2cb4dc906fd57520d4db88c58360c2.jpg" alt="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?" title="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?"/ 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/reklamy-kak-ot-nih-izbavitsya-na-telefone-postoyanno-vyskakivaet.html" rel="bookmark" title="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?">Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?</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/post-kody-ami-rasshifrovka-kodov-post-karty-kody-procedury-perezapisi-flash-rom.html" rel="bookmark" title="Decodificarea codurilor cardului POST"><img width="218" height="150" class="entry-thumb" src="/uploads/7444cd9b512fd648079a67a559ca8a15.jpg" alt="Decodificarea codurilor cardului POST" title="Decodificarea codurilor cardului POST"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/power-supply/" class="td-post-category">Surse de alimentare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/post-kody-ami-rasshifrovka-kodov-post-karty-kody-procedury-perezapisi-flash-rom.html" rel="bookmark" title="Decodificarea codurilor cardului POST">Decodificarea codurilor cardului POST</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/nyuansy-pravilnoi-nastroiki-velokompyutera-nastroika-i-ustanovka.html" rel="bookmark" title="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă"><img width="218" height="150" class="entry-thumb" src="/uploads/1ad2d705d627a0d55ef32e01dc0fab19.jpg" alt="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă" title="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/monitors/" class="td-post-category">Monitoare</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/nyuansy-pravilnoi-nastroiki-velokompyutera-nastroika-i-ustanovka.html" rel="bookmark" title="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă">Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă</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/kakoi-kabel-usb-luchshe-usb-kabel-dlya-telefona-kak-vybrat-i-chto.html" rel="bookmark" title="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?"><img width="218" height="150" class="entry-thumb" src="/uploads/cac18522c05ecc764aa241f780270316.jpg" alt="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?" title="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/security/" class="td-post-category">Siguranță</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kakoi-kabel-usb-luchshe-usb-kabel-dlya-telefona-kak-vybrat-i-chto.html" rel="bookmark" title="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?">Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?</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/kompyuternaya-mysh-lenovo-y-gaming-precision-mouse-igrovaya-mysh-lenovo-y-laser-gx30j07894.html" rel="bookmark" title="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie"><img width="218" height="150" class="entry-thumb" src="/uploads/46b02d16bbb0b2400f1b7717d8577c72.jpg" alt="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie" title="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie"/ 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/kompyuternaya-mysh-lenovo-y-gaming-precision-mouse-igrovaya-mysh-lenovo-y-laser-gx30j07894.html" rel="bookmark" title="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie">Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie</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">Iti recomandam</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-razognat-processor-na-noutbuke-detalnaya-instrukciya-po.html" rel="bookmark" title="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll"><img width="324" height="235" class="entry-thumb" src="/uploads/c1b718ee61eb3a5efd60bc05aba67217.jpg" alt="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll" title="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ro/category/power-supply/" class="td-post-category">Surse de alimentare</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-razognat-processor-na-noutbuke-detalnaya-instrukciya-po.html" rel="bookmark" title="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll">Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Placa de bază este o platformă multifuncțională care asigură funcționalitatea fiecărei componente a unui computer personal: RAM,...</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/netu-programmy-realtek-obzor-besplatnoi-versii-realtek-hd-audio-dopolnitelnye.html" rel="bookmark" title="Revizuirea versiunii gratuite a Realtek HD Audio"><img width="100" height="70" class="entry-thumb" src="/uploads/6ba42f2ea88306a80a616de831f4c5b7.jpg" alt="Revizuirea versiunii gratuite a Realtek HD Audio" title="Revizuirea versiunii gratuite a Realtek HD Audio"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/netu-programmy-realtek-obzor-besplatnoi-versii-realtek-hd-audio-dopolnitelnye.html" rel="bookmark" title="Revizuirea versiunii gratuite a Realtek HD Audio">Revizuirea versiunii gratuite a Realtek HD Audio</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/monitors/" class="td-post-category">Monitoare</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/peregruzhennaya-operativnaya-pamyat-fizicheskaya-pamyat-kompyutera.html" rel="bookmark" title="Memoria fizică a computerului este încărcată, ce ar trebui să fac?"><img width="100" height="70" class="entry-thumb" src="/uploads/53b1e8f8ad4930cfe13457055d944d7c.jpg" alt="Memoria fizică a computerului este încărcată, ce ar trebui să fac?" title="Memoria fizică a computerului este încărcată, ce ar trebui să fac?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/peregruzhennaya-operativnaya-pamyat-fizicheskaya-pamyat-kompyutera.html" rel="bookmark" title="Memoria fizică a computerului este încărcată, ce ar trebui să fac?">Memoria fizică a computerului este încărcată, ce ar trebui să fac?</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/kak-uznat-model-materinskoi-platy-kak-uznat-nomer-materinskoi-platy-cherez.html" rel="bookmark" title="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază"><img width="100" height="70" class="entry-thumb" src="/uploads/0c7862b51b43f7707f789a64ac2c50e4.jpg" alt="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază" title="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kak-uznat-model-materinskoi-platy-kak-uznat-nomer-materinskoi-platy-cherez.html" rel="bookmark" title="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază">Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/motherboard/" class="td-post-category">plăci de bază</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/kto-izobrel-kompas-teg-div-chto-takoe-kompas-gde-i-kogda-poyavilsya-pervyi.html" rel="bookmark" title="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când"><img width="100" height="70" class="entry-thumb" src="/uploads/c2493398111d3824ac1b365a5741bffb.jpg" alt="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când" title="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/kto-izobrel-kompas-teg-div-chto-takoe-kompas-gde-i-kogda-poyavilsya-pervyi.html" rel="bookmark" title="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când">Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/ram/" class="td-post-category">RAM</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/gde-nahoditsya-muhosransk-muhosransk-est-li-muhosransk.html" rel="bookmark" title="Mukhosransk Există un Mukhosransk"><img width="100" height="70" class="entry-thumb" src="/uploads/6fd46d2eda79c15ca15cf76094580536.jpg" alt="Mukhosransk Există un Mukhosransk" title="Mukhosransk Există un Mukhosransk"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/gde-nahoditsya-muhosransk-muhosransk-est-li-muhosransk.html" rel="bookmark" title="Mukhosransk Există un Mukhosransk">Mukhosransk Există un Mukhosransk</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/windows-8/" class="td-post-category">Windows 8</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/rasstoyanie-ot-tochki-do-tochki-formuly-primery-resheniya-kak-vychislit.html" rel="bookmark" title="Cum se calculează distanța dintre coordonatele GPS Formula pentru calcularea distanței dintre două puncte"><img width="100" height="70" class="entry-thumb" src="/uploads/53ede28972c38ab60d88fc0861f9fbda.jpg" alt="Cum se calculează distanța dintre coordonatele GPS Formula pentru calcularea distanței dintre două puncte" title="Cum se calculează distanța dintre coordonatele GPS Formula pentru calcularea distanței dintre două puncte"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ro/rasstoyanie-ot-tochki-do-tochki-formuly-primery-resheniya-kak-vychislit.html" rel="bookmark" title="Cum se calculează distanța dintre coordonatele GPS Formula pentru calcularea distanței dintre două puncte">Cum se calculează distanța dintre coordonatele GPS Formula pentru calcularea distanței dintre două puncte</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ro/category/graphics-card/" class="td-post-category">Plăci video</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/nahozhdenie-rasstoyaniya-mezhdu-dvumya-tochkami-rasstoyanie-ot-tochki-do.html" rel="bookmark" title="Distanța de la punct la punct: formule, exemple, soluții Distanța online între două puncte"><img width="218" height="150" class="entry-thumb" src="/uploads/fcf7833b61d0728ff4a4aa77b0a60489.jpg" alt="Distanța de la punct la punct: formule, exemple, soluții Distanța online între două puncte" title="Distanța de la punct la punct: formule, exemple, soluții Distanța online între două puncte"/ 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/nahozhdenie-rasstoyaniya-mezhdu-dvumya-tochkami-rasstoyanie-ot-tochki-do.html" rel="bookmark" title="Distanța de la punct la punct: formule, exemple, soluții Distanța online între două puncte">Distanța de la punct la punct: formule, exemple, soluții Distanța online între două puncte</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/skachat-mod-pak-vot-spik-modpak-ot-wotspeak-dlya-world-of-tanks-kakie-zapreshchennye-mody.html" rel="bookmark" title="Modpack de la Wotspeak pentru World of Tanks"><img width="218" height="150" class="entry-thumb" src="/uploads/9d0bf19deb1f02336efda466eeb6035f.jpg" alt="Modpack de la Wotspeak pentru World of Tanks" title="Modpack de la Wotspeak pentru World of Tanks"/ 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/skachat-mod-pak-vot-spik-modpak-ot-wotspeak-dlya-world-of-tanks-kakie-zapreshchennye-mody.html" rel="bookmark" title="Modpack de la Wotspeak pentru World of Tanks">Modpack de la Wotspeak pentru World of Tanks</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/top-prilozhenii-dlya-vedeniya-hozyaistva-sravnitelnye-obzory.html" rel="bookmark" title="Recenzii comparative ale aplicațiilor Android Aplicații plătite fără achiziții în aplicație"><img width="218" height="150" class="entry-thumb" src="/uploads/d3871f19b677c1773cac9f86dcfd8440.jpg" alt="Recenzii comparative ale aplicațiilor Android Aplicații plătite fără achiziții în aplicație" title="Recenzii comparative ale aplicațiilor Android Aplicații plătite fără achiziții în aplicație"/ 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/top-prilozhenii-dlya-vedeniya-hozyaistva-sravnitelnye-obzory.html" rel="bookmark" title="Recenzii comparative ale aplicațiilor Android Aplicații plătite fără achiziții în aplicație">Recenzii comparative ale aplicațiilor Android Aplicații plătite fără achiziții în aplicație</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-na-aipade-podklyuchit-telefonnye-zvonki-kak-zvonit-s.html" rel="bookmark" title="Cum să efectuați apeluri de pe iPad către dispozitive mobile - un ghid complet"><img width="218" height="150" class="entry-thumb" src="/uploads/9392027b169f284c870f4d096c076b0b.jpg" alt="Cum să efectuați apeluri de pe iPad către dispozitive mobile - un ghid complet" title="Cum să efectuați apeluri de pe iPad către dispozitive mobile - un ghid complet"/ 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-na-aipade-podklyuchit-telefonnye-zvonki-kak-zvonit-s.html" rel="bookmark" title="Cum să efectuați apeluri de pe iPad către dispozitive mobile - un ghid complet">Cum să efectuați apeluri de pe iPad către dispozitive mobile - un ghid complet</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/pochemu-na-aipade-ne-perevorachivaetsya-ekran-i-kak-vklyuchit-avtopovorot.html" rel="bookmark" title="Ecranul iPhone-ului a încetat să se rotească"><img width="218" height="150" class="entry-thumb" src="/uploads/56725de97d3b979c3a4b580e6bb0ef81.jpg" alt="Ecranul iPhone-ului a încetat să se rotească" title="Ecranul iPhone-ului a încetat să se rotească"/ 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/pochemu-na-aipade-ne-perevorachivaetsya-ekran-i-kak-vklyuchit-avtopovorot.html" rel="bookmark" title="Ecranul iPhone-ului a încetat să se rotească">Ecranul iPhone-ului a încetat să se rotească</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-zakryt-vkladki-na-aifone-5s-kak-zakryt-vse-otkrytye.html" rel="bookmark" title="Cum să închideți toate filele deschise pe iPhone"><img width="218" height="150" class="entry-thumb" src="/uploads/01a33abbee300ad01d31028e9f01aa9c.jpg" alt="Cum să închideți toate filele deschise pe iPhone" title="Cum să închideți toate filele deschise pe iPhone"/ 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-zakryt-vkladki-na-aifone-5s-kak-zakryt-vse-otkrytye.html" rel="bookmark" title="Cum să închideți toate filele deschise pe iPhone">Cum să închideți toate filele deschise pe iPhone</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/delat-muzykalnye-otkrytki-s-rolikom-kak-delat-krasivye-muzykalnye.html" rel="bookmark" title="Cum să faci carduri muzicale frumoase fără probleme?"><img width="218" height="150" class="entry-thumb" src="/uploads/26f2799d7a3eeb0de88b6123e5496ae6.jpg" alt="Cum să faci carduri muzicale frumoase fără probleme?" title="Cum să faci carduri muzicale frumoase fără probleme?"/ 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/delat-muzykalnye-otkrytki-s-rolikom-kak-delat-krasivye-muzykalnye.html" rel="bookmark" title="Cum să faci carduri muzicale frumoase fără probleme?">Cum să faci carduri muzicale frumoase fără probleme?</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/chto-v-mainkrafte-mozhno-sdelat-iz-lazurita-chto-mozhno-sdelat.html" rel="bookmark" title="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита"><img width="218" height="150" class="entry-thumb" src="/uploads/54fbea81e5a0aa2ff6eeea3c0621a254.jpg" alt="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита" title="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита"/ 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-v-mainkrafte-mozhno-sdelat-iz-lazurita-chto-mozhno-sdelat.html" rel="bookmark" title="Ce se poate face din lapis lazuli în"Майнкрафт": рецепты Майнкрафт что сделать из лазурита">Ce se poate face din lapis lazuli în Minecraft: rețete Minecraft ce să faci din lapis lazuli</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/reklamy-kak-ot-nih-izbavitsya-na-telefone-postoyanno-vyskakivaet.html" rel="bookmark" title="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?"><img width="218" height="150" class="entry-thumb" src="/uploads/1f2cb4dc906fd57520d4db88c58360c2.jpg" alt="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?" title="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?"/ 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/reklamy-kak-ot-nih-izbavitsya-na-telefone-postoyanno-vyskakivaet.html" rel="bookmark" title="Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?">Publicitatea continuă să apară pe telefonul dvs. - cum să o eliminați?</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/post-kody-ami-rasshifrovka-kodov-post-karty-kody-procedury-perezapisi-flash-rom.html" rel="bookmark" title="Decodificarea codurilor cardului POST"><img width="218" height="150" class="entry-thumb" src="/uploads/7444cd9b512fd648079a67a559ca8a15.jpg" alt="Decodificarea codurilor cardului POST" title="Decodificarea codurilor cardului POST"/ 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/post-kody-ami-rasshifrovka-kodov-post-karty-kody-procedury-perezapisi-flash-rom.html" rel="bookmark" title="Decodificarea codurilor cardului POST">Decodificarea codurilor cardului POST</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/nyuansy-pravilnoi-nastroiki-velokompyutera-nastroika-i-ustanovka.html" rel="bookmark" title="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă"><img width="218" height="150" class="entry-thumb" src="/uploads/1ad2d705d627a0d55ef32e01dc0fab19.jpg" alt="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă" title="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă"/ 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/nyuansy-pravilnoi-nastroiki-velokompyutera-nastroika-i-ustanovka.html" rel="bookmark" title="Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă">Configurarea și instalarea unui computer pe o bicicletă Cum să configurați un computer pentru bicicletă</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/kakoi-kabel-usb-luchshe-usb-kabel-dlya-telefona-kak-vybrat-i-chto.html" rel="bookmark" title="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?"><img width="218" height="150" class="entry-thumb" src="/uploads/cac18522c05ecc764aa241f780270316.jpg" alt="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?" title="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?"/ 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/kakoi-kabel-usb-luchshe-usb-kabel-dlya-telefona-kak-vybrat-i-chto.html" rel="bookmark" title="Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?">Cablu USB pentru telefon: cum să alegi și ce trebuie să știi?</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/kompyuternaya-mysh-lenovo-y-gaming-precision-mouse-igrovaya-mysh-lenovo-y-laser-gx30j07894.html" rel="bookmark" title="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie"><img width="218" height="150" class="entry-thumb" src="/uploads/46b02d16bbb0b2400f1b7717d8577c72.jpg" alt="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie" title="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie"/ 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/kompyuternaya-mysh-lenovo-y-gaming-precision-mouse-igrovaya-mysh-lenovo-y-laser-gx30j07894.html" rel="bookmark" title="Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie">Lenovo Y Laser Gaming Mouse (GX30J07894) Specificații cheie</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-razognat-processor-na-noutbuke-detalnaya-instrukciya-po.html" rel="bookmark" title="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll"><img width="218" height="150" class="entry-thumb" src="/uploads/29b8b3fdb9fa47210d87edf052efafe0.jpg" alt="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll" title="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll"/ 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-razognat-processor-na-noutbuke-detalnaya-instrukciya-po.html" rel="bookmark" title="Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll">Instrucțiuni detaliate pentru overclockarea unui procesor Cum să aflați versiunea pll</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/netu-programmy-realtek-obzor-besplatnoi-versii-realtek-hd-audio-dopolnitelnye.html" rel="bookmark" title="Revizuirea versiunii gratuite a Realtek HD Audio"><img width="218" height="150" class="entry-thumb" src="/uploads/308cd12d56f608007ad169746bf52d33.jpg" alt="Revizuirea versiunii gratuite a Realtek HD Audio" title="Revizuirea versiunii gratuite a Realtek HD Audio"/ 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/netu-programmy-realtek-obzor-besplatnoi-versii-realtek-hd-audio-dopolnitelnye.html" rel="bookmark" title="Revizuirea versiunii gratuite a Realtek HD Audio">Revizuirea versiunii gratuite a Realtek HD Audio</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/peregruzhennaya-operativnaya-pamyat-fizicheskaya-pamyat-kompyutera.html" rel="bookmark" title="Memoria fizică a computerului este încărcată, ce ar trebui să fac?"><img width="218" height="150" class="entry-thumb" src="/uploads/35a4abf166847d426a51743cda876011.jpg" alt="Memoria fizică a computerului este încărcată, ce ar trebui să fac?" title="Memoria fizică a computerului este încărcată, ce ar trebui să fac?"/ 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/peregruzhennaya-operativnaya-pamyat-fizicheskaya-pamyat-kompyutera.html" rel="bookmark" title="Memoria fizică a computerului este încărcată, ce ar trebui să fac?">Memoria fizică a computerului este încărcată, ce ar trebui să fac?</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-uznat-model-materinskoi-platy-kak-uznat-nomer-materinskoi-platy-cherez.html" rel="bookmark" title="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază"><img width="218" height="150" class="entry-thumb" src="/uploads/b2ee814a879ec6dc9f669c02a5f740de.jpg" alt="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază" title="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază"/ 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-uznat-model-materinskoi-platy-kak-uznat-nomer-materinskoi-platy-cherez.html" rel="bookmark" title="Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază">Cum să aflați numărul plăcii de bază prin Windows fără a deschide carcasa Identificarea vizuală a modelului și producătorului plăcii de bază</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/kto-izobrel-kompas-teg-div-chto-takoe-kompas-gde-i-kogda-poyavilsya-pervyi.html" rel="bookmark" title="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când"><img width="218" height="150" class="entry-thumb" src="/uploads/e96c4637ad1d7ace5c1bd04dff6be838.jpg" alt="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când" title="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când"/ 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/kto-izobrel-kompas-teg-div-chto-takoe-kompas-gde-i-kogda-poyavilsya-pervyi.html" rel="bookmark" title="Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când">Cine a inventat busola? etichetă DIV. Ce este o busolă? Unde și când a apărut prima busolă? Cine a inventat busola și când</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 2023 - Reparații computere și laptopuri. Plăci video, hard disk, 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>