Kuidas töötada Delphis XML-dokumentidega? Täpsemalt, kasutades TXMLDocument? XML-i dokumendiobjekti mudeli kasutamine.

Paljude Delphi programmeerijate jaoks on sätete salvestamine seotud kasutamisega INI failid oma programmides. Selle meetodi kasutamist rohkem või vähem tõsiste projektide puhul tuleks vältida, kuna see piirab paindlikkust, mis takistab programmi edasist laiendamist. Väärib märkimist, et see lähenemisviis on kasutusmugavuse ja sisseehitatud tööriistade olemasolu tõttu arenduskeskkonnas üsna populaarne.

Ideaalne võimalus programmi sätete salvestamiseks on aga struktureeritud XML failid. Nende eeliseks on see, et parameetrite arv ei pruugi olla fikseeritud. Selle paremaks mõistmiseks vaatame konkreetset näidet.

USearchi programmis kuvatakse kirjel klõpsamisel kontekstimenüü, milles kuvatakse üksuste loend. Need üksused on käsud, mis omakorda laaditakse seadete failist. Kui sätted olid salvestatud INI faili, võib programm salvestada ja laadida teatud arvu juhiseid, näiteks 10 või 50. Niipea kui on vaja suuremat väärtust, tuleb kood vastavalt ümber kirjutada ja uuesti kompileerida.


Kasutades lähenemist kasutades XML failid, saame kõik jaotise parameetrid dünaamiliselt laadida. Selle kõige jaoks muutub konfiguratsioonifail elegantsemaks, ilma parameetrite liigse nummerdamiseta. Kuid, standardsed vahendid koos töötada XML Delphis on palju puudusi, seega soovitan kasutada standardne raamatukogu MSXML. Tavaliselt on see vaikimisi kaasatud operatsioonisüsteemid Windowsi perekond.


Ühendama MSXML, peame genereerima liidesefaili kõigi funktsioonide loendiga, importides selle COM-serverist. Liidese importimise kohta on kirjutatud üsna palju üksikasjalikke artikleid, kuid ma soovitan teil faili alla laadida MSXML2_TLB.PAS juba kasutusvalmis. Pärast faili allalaadimist asetage see oma projekti kõrvale või pukseerige see Delphi keskkonna lib kausta. Seega saavad moodulit kasutada kõik loodud programmid MSXML, peate lihtsalt lisama rea ​​MSXML2_TLB kasutusaladele.

Selguse huvides vaadake selle teegi kasutamise kohta järgmist näidet:

LoadProcedureData; var XMLDoc: DOMDocument; Juur: IXMLDOMElement; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("suurus/laius").Tekst); Juur:= null; XMLDoc:= null; lõpp;

Esmalt luuakse klassi DOMDocument eksemplar ja seejärel laaditakse faili settings.xml sisu mällu. Kuna standardi järgi mis tahes XML fail peab sisaldama juurmärget (in sel juhul konfig), siis peame selle funktsiooni abil hankima Dokumendielement. Seejärel kuvatakse siltide vahel olev sisu , mis on omakorda siltide vahel . Seega kuvab meie meetod faili settings.xml teksti sõnumikastis "100 pikslit".

500 pikslit 100 pikslit

Siin kasutatakse SelectSingleNode meetodit, mis võtab parameetrina stringi

Hoolimata asjaolust, et Delphis XML-iga töötamise teemat on Internetis palju arutatud, tekib selleteemalisi küsimusi igasugustes foorumites.

Olen ka selle juba postitanud, kuid tahaksin naasta reaalse XML-faili kiire sõelumise ja andmete ekstraktimise juhtumi juurde, mida ma täna tööl tegin. Mul ei kulunud vajalike andmete hankimiseks rohkem kui 5 minutit.

Taust. Täna oli vaja töödelda andmeid installitud programmid kasutajate arvutites (jah, jah, me tuvastame piraadid :)). Tehniline osakond andis mulle sellise pahaaimamatutelt kasutajatelt WMI-d kasutava võrgu kaudu rippitud teabe. Nende kasutatud programm genereerib aruandeid XML-vormingus. Sellest tulenevalt tõid nad mulle mäe üsna keeruka struktuuriga XML-faile, millest mul oli vaja välja võtta ainult installitud tarkvaratoodete nimed.

Ravi . Pärast paari faili käsitsi ülevaatamist mõistsin, et vananemine ei võta kaua aega, ja otsustasin kirjutada väikese konverteri. Delphi käivitamisel valisin hoidlast XML DataBinding objekti ja andsin sellele ühe faili. Jätsin kõik seaded ja parameetrid vaikimisi ning selle tulemusena moodustasin mooduli suur kogus klassid ja liidesed, et pääseda juurde selle XML-faili elementidele. Ma ei hakanud klassistruktuuriga pikka aega tegelema, asusin kohe konverterit kirjutama.

Uues konsoolirakenduses kirjutasin üsna lihtsa koodi:


programm XML2TXT;

kasutab
vormid,
Klassid, SysUtils,
SoftwareXML failis "SoftwareXML.pas";

protseduur CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i: täisarv;
sr: TSearchRec;
CurDir:string;
Ekspordifail: TStringList;
alustada
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
kui FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, siis
korda
ExportFile:= TStringList.Create;
softbase:= Laadi STDtarkvara(Pchar(CurDir+sr.Name));
i:= 0 puhul softbase.InstalledSoftware.source.software.Count – 1 do
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.serverinimi+.txt");
ExportFile.Free;
kuni FindNext(sr) 0;
lõpp;

alustada
Rakendus.Initsialiseeri;
CovertXML2Tekst;
lõpp.

Selle tulemusena sain iga ruudustiku arvuti kohta ühe õpiku, mis sisaldab installitud tarkvara loendit.

Arvan, et see kood vajab selgitusi. Näiteks miks ma kasutasin konsoolirakenduses moodulit Forms ja kutsusin välja protseduuri Application.Initialize;

Tegelikult on kõik lihtne – see on väike häkkimine, mis võimaldab kasutada XML Data Bindingut konsoolirakenduses. Sest see keeldus kangekaelselt klassi initsialiseerimast XML-iga töötamiseks. Ma ei ole veel aru saanud tegelikest põhjustest – täna oli aeg oluline ja seetõttu kulutasin 4 minutist viiest selle veaga võitlemisele. :) Mõtlen hiljem selle probleemiga tegeleda ja kirjutada, mis on tegelik põhjus.

Kummaline softbase klass loodi XML-faili põhjal – see oli juurelemendi nimi, ja softbase.InstalledSoftware.source.software[i].DisplayName – lihtsalt navigeerides läbi pesastatud elementide soovitud failini ja hankides selle väärtuse.

Nii näeb välja üks enim. kiired viisid XML-iga töötamine Delphis.

XML-i kasutatakse üha enam teabe salvestamiseks ja selle vahetamiseks rakenduste ja veebisaitide vahel. Paljudes rakendustes kasutatakse seda keelt andmete salvestamise baaskeelena, teistes - XML-andmete eksportimiseks ja importimiseks. Sellest järeldub, et arendajatel on aeg mõelda, kuidas saaks XML-andmeid enda rakendustes kasutada.

Selles artiklis vaatleme XML-dokumenti Objektimudel(DOM) ja selle juurutamine Microsofti poolt – Microsoft XML DOM.

XML DOM on objektimudel, mis pakub arendajale objekte XML-failide laadimiseks ja manipuleerimiseks. Objektimudel koosneb järgmistest põhiobjektidest: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ja XMLDOMParseError. Kõik need objektid (välja arvatud XMLDOMParseError) sisaldavad atribuute ja meetodeid, mis võimaldavad teil saada teavet objekti kohta, manipuleerida objekti väärtuste ja struktuuriga ning navigeerida XML-dokumendi struktuuris.

Vaatame peamisi XML DOM-objekte ja toome mõned näited nende kasutamisest Borland Delphis.

XML DOM-i kasutamine Borland Delphis

Microsoft XML DOM-i kasutamiseks Delphi rakendustes peate oma projekti kaasama vastava tüübiteegi. Selleks täidame käsu Project | Impordi tüübiteek ja dialoogiboksis Import Type Library valige Microsoft XML-i versiooni 2.0 (versioon 2.0) teek, mis asub tavaliselt failis Windows\System\MSXML.DLL

Pärast nupu Loo ühik klõpsamist luuakse MSXML_TLB liidese moodul, mis võimaldab kasutada XML DOM-objekte: DOMDocument, XMLDocument, XMLHTTPRequest ja mitmeid teisi MSXML.DLL teegis realiseeritud. Kasutamiste loendis tuleb määrata viide moodulile MSXML_TLB.

XML DOM seade

Dokumendiobjektimudel kujutab XML-dokumenti okstest koosneva puustruktuurina. XML DOM API-d võimaldavad rakendustel dokumendipuud läbida ja selle harusid manipuleerida. Igal harul võib olla kindel tüüp (DOMNodeType), mille järgi määratakse vanem- ja alamharud. Enamikus XML-dokumentides leiate elemendi-, atribuudi- ja tekstiharud. Atribuudid on haru eriliik ega ole alamharud. Atribuute hallatakse. erimeetodid, mida pakuvad XML DOM-objektid.

Lisaks World Wide Web Consortium (W3C) soovitatud liideste rakendamisele sisaldab Microsoft XML DOM meetodeid, mis toetavad XSL-i, XSL-mustreid, nimeruume ja andmetüüpe. Näiteks võimaldab SelectNodes-meetod kasutada XSL-i mustri süntaksit, et leida harusid konkreetses kontekstis, ja meetod TransformNode toetab XSL-i kasutamist teisenduste tegemiseks.

Testige XML-dokumenti

Võtame XML-dokumendi näitena muusika CD-ROMi kataloogi, millel on järgmine struktuur:

Impeeriumi burlesk Bob Dylan USA Columbia 10.90 1985 peida oma südant Bonnie Tylor Ühendkuningriik CBS Records 9.90 1988 ... Vabastage mu süda Joe Cocker USA EMI 8.20 1987

Nüüd oleme valmis alustama XML-i DOM-i objektimudeli vaatamist, mida alustame objektiga XMLDOMDocument.

XML-dokument – ​​XMLDOMDokumendi objekt

XML-dokumendiga töötamine algab selle laadimisega. Selleks kasutame meetodit Laadi, millel on ainult üks parameeter, mis määrab laaditava dokumendi URL-i. Failide laadimisel kohalikult kettalt määratakse ainult täielik failinimi (protokolli file:/// võib sel juhul ära jätta). Kui XML-dokument on salvestatud stringina, peaksite dokumendi laadimiseks kasutama LoadXML-i meetodit.

Dokumendi laadimise (sünkroonne või asünkroonne) juhtimiseks kasutage atribuuti Async. Vaikimisi on selle atribuudi väärtuseks määratud Tõene, mis näitab, et dokument laaditakse asünkroonselt ja juhtimine naaseb rakendusse enne dokumendi täielikku laadimist. Vastasel juhul laaditakse dokument sünkroonselt ja seejärel peate kontrollima atribuudi ReadyState väärtust, et näha, kas dokument on laaditud või mitte. Samuti saate sündmuse OnReadyStateChange jaoks luua sündmuste töötleja, mis saab kontrolli, kui atribuudi ReadyState väärtus muutub.

Järgmine näitab, kuidas laadida XML-dokumenti laadimismeetodi abil.

Kasutab ... MSXML_TLB ... protseduuri TForm1.Button1Click(Saatja: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // // Siin on kood, mis manipuleerib // XML-dokumenti ja selle harusid // XMLDoc:= Nil; lõpp;

Pärast dokumendi laadimist pääseme juurde selle atribuutidele. Näiteks atribuut NodeName sisaldab väärtust #document, atribuut NodeTypeString sisaldab väärtusdokumenti ja URL-i atribuut väärtust file:///C:/DATA/DATA.xml.

Vigade käsitlemine

Eriti huvitavad on atribuudid, mis on seotud dokumendi töötlemisega selle laadimisel. Näiteks atribuut ParseError tagastab objekti XMLDOMParseError, mis sisaldab teavet dokumendi töötlemisel ilmnenud tõrke kohta.

Veakäsitleja kirjutamiseks saate lisada järgmise koodi:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\ANDMED\DATA.xml'); XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel // // Siin käsitleme viga // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Null;

Et teada saada, millist teavet vea korral tagastatakse, muutke järgmist kataloogi kirjet:

Impeeriumi burlesk Bob Dylan USA Columbia 10.90 1985

eemaldage sulgemiselement teisel real:</p><p> <CD> <TITLE>Impeeriumi burlesk <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Nüüd kirjutame koodi, mis tagastab objekti XMLDOMParseError atribuudi väärtused:</p><p>XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel algab XMLErrori abil Memo1.Lines Add('Fail:' + URL); Add('Kood:' + IntToStr(ErrorCode)); Add('Viga:' + Põhjus); Add('Tekst:' + SrcText); Add('Line: ' + IntToStr(Line)); Add('Positsioon:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); lõpp;</p><p>ja käivitage meie rakendus. Selle tulemusena saame järgmise veateabe.</p> <p>Nagu ülaltoodud näitest näha, piisab tõrke eraldamiseks ja selle esinemise põhjuse mõistmiseks objekti XMLDOMParseError tagastatud teabest.</p> <p>Nüüd taastame sulgemise elemendi <TITLE>meie dokumendis ja jätkake arutelu XML DOM-i üle.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Juurdepääs dokumendipuule</h2> <p>Dokumendipuule juurdepääsemiseks võite hankida juurelemendi ja seejärel itereerida selle alamharude kaudu või leida mõne konkreetse haru. Esimesel juhul saame juurelemendi läbi atribuudi DocumentElement, mis tagastab XMLDOMNode tüüpi objekti. Järgmine näitab, kuidas kasutada atribuuti DocumentElement iga alamelemendi sisu hankimiseks.</p><p>VarNode: IXMLDOMNode; Juur: IXMLDOMElement; I: täisarv; ... Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;</p><p>Meie XML-dokumendi jaoks saame järgmise teksti.</p> <p>Kui meid huvitab konkreetne haru või esimesest alamharust allpool olev haru, saame kasutada kas meetodit NodeFromID või objekti XMLDOMDocument meetodit GetElementByTagName.</p> <p>Meetod NodeFromID nõuab unikaalset identifikaatorit, mis on määratletud XML-skeemis või dokumenditüübi definitsioonis (DTD) ja tagastab selle identifikaatoriga haru.</p> <p>Meetod GetElementByTagName nõuab kindla elemendiga (sildiga) stringi ja tagastab kõik selle elemendiga harud. Järgnevalt on näidatud, kuidas seda meetodit kasutada meie CD-ROMi kataloogist kõigi artistide leidmiseks:</p><p>Sõlmed: IXMLDOMNodeList; Sõlm: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); Kui I:= 0 kuni Nodes.Length-1, tehke Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;</p><p>Meie XML-dokumendi jaoks saame järgmise teksti</p> <p>Pange tähele, et XMLDOMNode objekti SelectNodes meetod pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Aga sellest lähemalt allpool.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Dokumendi haru – XMLDOMNode objekt</h2> <p>XMLDOMNode objekt esindab dokumendi haru. Oleme selle objektiga juba kokku puutunud, kui saime dokumendi juurelemendi:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Teabe saamiseks XML-dokumendi haru kohta saate kasutada XMLDOMNode objekti atribuute (tabel 1).</p> <p>Harus salvestatud andmetele juurdepääsuks kasutatakse tavaliselt kas atribuuti NodeValue (saadaval atribuutide, tekstiharude, kommentaaride, töötlemisjuhiste ja CDATA jaotiste jaoks), atribuuti Text, mis tagastab haru tekstisisu, või atribuuti NodeTypedValue. . Viimast saab aga kasutada ainult trükitud elementidega harude jaoks.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Dokumendipuus navigeerimine</h3> <p>Objekt XMLDOMNode pakub palju võimalusi dokumendipuus navigeerimiseks. Näiteks pääseb emaharule juurde atribuudi ParentNode (tüüp XMLDOMNode) kaudu, alamharudele pääseb juurde atribuutide ChildNodes (tüüp XMLDOMNodeList), FirstChild ja LastChild (tüüp XMLDOMNode) kaudu jne. Atribuut OwnerDocument tagastab XMLDOMDocument tüüpi objekti, mis tuvastab XML-dokumendi enda. Ülaltoodud atribuudid muudavad dokumendipuus navigeerimise lihtsaks.</p> <p>Nüüd korrakem läbi kõik XML-dokumendi harud:</p><p>Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes then GetChilds(Node,0); lõpp;</p><p>Nagu eespool märgitud, pakub XMLDOMNode objekti SelectNodes paindlikum viis juurdepääsuks dokumendi harudele. Lisaks on SelectSingleNode meetod, mis tagastab ainult dokumendi esimese haru. Mõlemad meetodid võimaldavad määrata harude leidmiseks XSL-malle.</p> <p>Kaaluge meetodi SelectNodes kasutamist kõigi CD haru ja PRICE alamharu omavate harude toomiseks:</p><p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');</p><p>Kõik CD-haru PRICE alamharud paigutatakse Nodesi kogusse. Naaseme XSL-mallide arutelu juurde veidi hiljem.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipuleerimine alamharudega</h3> <p>Alamharudega manipuleerimiseks saame kasutada XMLDOMNode objekti meetodeid (tabel 2).</p> <p>Esimese ketta kirje täielikuks eemaldamiseks peate käivitama järgmise koodi:</p><p>Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; Sõlm:= Juur; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);</p><p>Pange tähele, et selles näites kustutame esimese alamharu. Esimese alamharu esimese elemendi eemaldamine on näidatud allpool:</p><p>Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; // ja esimene alamharu Node:= Root.FirstChild; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);</p><p>Ülaltoodud näites ei ole me esimest haru kustutanud <CD>…</CD>, ja haru esimene element on <TITLE>….

Nüüd lisame uue haru. Allpool on kood, mis näitab, kuidas lisada uus muusika-CD-ROM-i kirje:

Var NewNode: IXMLDOMNode; Laps: IXMLDOMNode; ... // Loo uus haru - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // Lisa element Child:= XMLDoc.CreateNode(1,'pealkiri',''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'Pink Floyd'; // Lisa element <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'Division Bell'; // Lisa element <COUNTRY>Child:= XMLDoc.CreateNode(1, 'RIIK', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'UK'; // Lisa element <COMPANY>Child:= XMLDoc.CreateNode(1, 'ETTEVÕTE', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'EMI Records Ltd.'; // Lisa element <PRICE>Child:= XMLDoc.CreateNode(1, 'HIND', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= '11.99"; // Lisage element <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= '1994'; // Ja lisage haru Root.AppendChild(NewNode); ...</p><p>Ülaltoodud kood näitab uue haru lisamiseks järgmist toimingute jada:</p> <ul><li>Uue haru loomine CreateNode meetodil: <ul><li>elemendi loomine CreateNode meetodil;</li> <li>elemendi lisamine harule, kasutades meetodit AppendChild;</li> <li>elemendi väärtuse määramine atribuudi Text kaudu;</li> <li>... korrake kõigi elementide puhul.</li> </ul></li> <li>Dokumendile uue haru lisamine meetodil AppendChild.</li> </ul><p>Tuletame meelde, et AppendChild meetod lisab puu lõppu haru. Selleks, et lisada puu kindlasse kohta oksa, tuleb kasutada meetodit InsertBefore.</p> <h2>Harukomplekt – objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList sisaldab harude loendit, mille saab luua meetoditega SelectNodes või GetElementsByTagName või hankida atribuudist ChildNodes.</p> <p>Oleme juba näinud selle objekti kasutamist jaotises "Dokumendipuus navigeerimine" toodud näites. Siin esitame mõned teoreetilised märkused.</p> <p>Nimekirjas olevate harude arvu saab Pikkus omaduse väärtusena. Harudel on indeksid vahemikus 0 kuni Length-1 ja igale üksikule harule pääseb juurde vastava indeksiga elemendi massiivi elemendi kaudu.</p> <p>Harude loendis liikumiseks saab kasutada ka meetodit NextNode, mis tagastab loendis järgmise haru või nulli, kui praegune haru on viimane. Loendi algusesse naasmiseks helistage lähtestamismeetodile.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Looge ja salvestage dokumente</h2> <p>Niisiis, oleme näinud, kuidas saate olemasolevatele XML-dokumentidele harusid ja elemente lisada. Nüüd loome käigult XML-dokumendi. Kõigepealt pidage meeles, et dokumenti saab laadida mitte ainult URL-ist, vaid ka tavalisest stringist. Järgnevalt näidatakse, kuidas luua juurelementi, mida saab seejärel kasutada ülejäänud elementide dünaamiliseks konstrueerimiseks (mida me juba käsitlesime jaotises Manipulating Child Branches):</p><p>Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; S: WideString; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Node:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Sõlm); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Null;</p><p>Pärast XML-dokumendi koostamist salvestame selle meetodi Salvesta abil faili. Näiteks:</p> <p>XMLDoc.Save('C:\ANDMED\NEWCD.XML');</p> <p>Lisaks faili salvestamisele võimaldab salvestamismeetod salvestada XML-dokumendi uude XMLDOMDocument-objekti. Sel juhul töödeldakse dokument täielikult ja selle tulemusena kontrollitakse selle struktuuri ja süntaksit. Järgmine näitab, kuidas dokumenti mõnes teises objektis salvestada.</p><p>Protseduur TForm1.Button2Click(Saatja: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= null; lõpp;</p><p>Lõpuks võimaldab salvestamismeetod salvestada XML-dokumendi ka teistele COM-objektidele, mis toetavad liideseid IStream, IPersistStream või IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL-mallide kasutamine</h2> <p>XMLDOMNode objekti SelectNodes meetodi käsitlemisel mainisime, et see pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Paindlikkus seisneb selles, et saate harude valimise kriteeriumina määrata XSL-malli. Sellised mallid pakuvad võimsat mehhanismi teabe leidmiseks XML-dokumentidest. Näiteks kõigi meie kataloogis olevate muusika-CD-ROM-ide pealkirjade loendi saamiseks võime käivitada järgmise päringu:</p><p>Et teada saada, milliste artistide CD-d USA-s välja anti, moodustatakse päring järgmiselt:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>Järgmine näitab, kuidas leida kataloogist esimene draiv:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>Ja viimaseks:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>Bob Dylani plaatide leidmiseks võite käivitada järgmise päringu:</p><p>Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');</p><p>ja pärast 1985. aastat välja antud plaatide loendi saamiseks käivitame järgmise päringu:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>XSL-i süntaksi üksikasjalikum arutelu nõuab eraldi postitust. Lugejate intrigeerimiseks ja edasise uurimistöö julgustamiseks toon vaid ühe väikese näite XSL-i võimalikust kasutamisest. Oletame, et peame oma kataloogi teisendama tavaliseks HTML-tabeliks. Traditsioonilisi meetodeid kasutades peame läbima kõik puu oksad ja moodustama iga saadud elemendi jaoks vastavad sildid. <TD>…</TD>.</p> <p>XSL-i kasutades loome lihtsalt malli (või stiililehe), milles täpsustame, mida ja kuidas teisendada. Seejärel rakendame selle malli oma kataloogile – ja oletegi: meil on XSL-malli tekst, mis teisendab kataloogi tabeliks (loetelu 2).</p> <p>Kood XSL-malli katmiseks meie kataloogis näeb välja järgmine:</p><p>Protseduur TForm1.Button2Click(Saatja: TObject); var XSLDoc: IXMLDOMDokument; begin XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\ANDMED\DATA.xsl'); Memo2.Tekst:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= null; lõpp;</p><p>XSL-i arutelu lõpetuseks olgu öeldud, et praegu kasutatakse seda keelt aktiivselt nii erinevate XML-dokumentide vahel teisendamiseks kui ka dokumentide vormindamiseks.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Järeldus</h2> <p>Arusaadavatel põhjustel on võimatu ühes artiklis katta kõiki Microsoft XML DOM-i objekte ja tuua näiteid nende kasutamise kohta. Siin oleme puudutanud ainult XML-DOM-i rakendustes kasutamise põhiprobleeme. Tabelis. Joonis 3 näitab kõiki Microsoft XML DOM-is rakendatud objekte.</p> <p>ComputerPress 12"2000</p> <p>XML-i kasutatakse üha enam teabe salvestamiseks ja selle vahetamiseks rakenduste ja veebisaitide vahel. Paljudes rakendustes kasutatakse seda keelt andmete salvestamise baaskeelena, teistes - XML-andmete eksportimiseks ja importimiseks. Sellest järeldub, et arendajatel on aeg mõelda, kuidas saaks XML-andmeid enda rakendustes kasutada.</p> <p>Selles artiklis vaatleme XML-dokumendiobjekti mudelit (DOM) ja Microsofti selle rakendamist, Microsoft XML DOM-i.</p> <p>XML DOM on objektimudel, mis pakub arendajale objekte XML-failide laadimiseks ja manipuleerimiseks. Objektimudel koosneb järgmistest põhiobjektidest: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ja XMLDOMParseError. Kõik need objektid (välja arvatud XMLDOMParseError) sisaldavad atribuute ja meetodeid, mis võimaldavad teil saada teavet objekti kohta, manipuleerida objekti väärtuste ja struktuuriga ning navigeerida XML-dokumendi struktuuris.</p> <p>Vaatame peamisi XML DOM-objekte ja toome mõned näited nende kasutamisest Borland Delphis.</p> <h2>XML DOM-i kasutamine Borland Delphis</h2> <p>Microsoft XML DOM-i kasutamiseks Delphi rakendustes peate oma projekti kaasama vastava tüübiteegi. Selleks täidame käsu Project | Impordi tüübiteek ja dialoogiboksis Import Type Library valige Microsoft XML-i versiooni 2.0 (versioon 2.0) teek, mis asub tavaliselt failis Windows\System\MSXML.DLL</p> <p>Pärast nupu Loo ühik klõpsamist luuakse MSXML_TLB liidese moodul, mis võimaldab kasutada XML DOM-objekte: DOMDocument, XMLDocument, XMLHTTPRequest ja mitmeid teisi MSXML.DLL teegis realiseeritud. Kasutamiste loendis tuleb määrata viide moodulile MSXML_TLB.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML DOM seade</h2> <p>Dokumendiobjektimudel kujutab XML-dokumenti okstest koosneva puustruktuurina. XML DOM API-d võimaldavad rakendustel dokumendipuud läbida ja selle harusid manipuleerida. Igal harul võib olla kindel tüüp (DOMNodeType), mille järgi määratakse vanem- ja alamharud. Enamikus XML-dokumentides leiate elemendi-, atribuudi- ja tekstiharud. Atribuudid on haru eriliik ega ole alamharud. Atribuutidega manipuleeritakse XML-i DOM-objektide pakutavate erimeetodite abil.</p> <p>Lisaks World Wide Web Consortium (W3C) soovitatud liideste rakendamisele sisaldab Microsoft XML DOM meetodeid, mis toetavad XSL-i, XSL-mustreid, nimeruume ja andmetüüpe. Näiteks võimaldab SelectNodes-meetod kasutada XSL-i mustri süntaksit, et leida harusid konkreetses kontekstis, ja meetod TransformNode toetab XSL-i kasutamist teisenduste tegemiseks.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Testige XML-dokumenti</h2> <p>Võtame XML-dokumendi näitena muusika CD-ROMi kataloogi, millel on järgmine struktuur:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Impeeriumi burlesk Bob Dylan USA Columbia 10.90 1985 peida oma südant Bonnie Tylor Ühendkuningriik CBS Records 9.90 1988 ... Vabastage mu süda Joe Cocker USA EMI 8.20 1987

Nüüd oleme valmis alustama XML-i DOM-i objektimudeli vaatamist, mida alustame objektiga XMLDOMDocument.

XML-dokument – ​​XMLDOMDokumendi objekt

XML-dokumendiga töötamine algab selle laadimisega. Selleks kasutame meetodit Laadi, millel on ainult üks parameeter, mis määrab laaditava dokumendi URL-i. Failide laadimisel kohalikult kettalt määratakse ainult täielik failinimi (protokolli file:/// võib sel juhul ära jätta). Kui XML-dokument on salvestatud stringina, peaksite dokumendi laadimiseks kasutama LoadXML-i meetodit.

Dokumendi laadimise (sünkroonne või asünkroonne) juhtimiseks kasutage atribuuti Async. Vaikimisi on selle atribuudi väärtuseks määratud Tõene, mis näitab, et dokument laaditakse asünkroonselt ja juhtimine naaseb rakendusse enne dokumendi täielikku laadimist. Vastasel juhul laaditakse dokument sünkroonselt ja seejärel peate kontrollima atribuudi ReadyState väärtust, et näha, kas dokument on laaditud või mitte. Samuti saate sündmuse OnReadyStateChange jaoks luua sündmuste töötleja, mis saab kontrolli, kui atribuudi ReadyState väärtus muutub.

Järgmine näitab, kuidas laadida XML-dokumenti laadimismeetodi abil.

Kasutab ... MSXML_TLB ... protseduuri TForm1.Button1Click(Saatja: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // // Siin on kood, mis manipuleerib // XML-dokumenti ja selle harusid // XMLDoc:= Nil; lõpp;

Pärast dokumendi laadimist pääseme juurde selle atribuutidele. Näiteks atribuut NodeName sisaldab väärtust #document, atribuut NodeTypeString sisaldab väärtusdokumenti ja URL-i atribuut väärtust file:///C:/DATA/DATA.xml.

Vigade käsitlemine

Eriti huvitavad on atribuudid, mis on seotud dokumendi töötlemisega selle laadimisel. Näiteks atribuut ParseError tagastab objekti XMLDOMParseError, mis sisaldab teavet dokumendi töötlemisel ilmnenud tõrke kohta.

Veakäsitleja kirjutamiseks saate lisada järgmise koodi:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\ANDMED\DATA.xml'); XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel // // Siin käsitleme viga // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Null;

Et teada saada, millist teavet vea korral tagastatakse, muutke järgmist kataloogi kirjet:

Impeeriumi burlesk Bob Dylan USA Columbia 10.90 1985

eemaldage sulgemiselement teisel real:</p><p> <CD> <TITLE>Impeeriumi burlesk <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Nüüd kirjutame koodi, mis tagastab objekti XMLDOMParseError atribuudi väärtused:</p><p>XMLError:= XMLDoc.ParseError; Kui XMLError.ErrorCode<>0 Seejärel algab XMLErrori abil Memo1.Lines Add('Fail:' + URL); Add('Kood:' + IntToStr(ErrorCode)); Add('Viga:' + Põhjus); Add('Tekst:' + SrcText); Add('Line: ' + IntToStr(Line)); Add('Positsioon:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); lõpp;</p><p>ja käivitage meie rakendus. Selle tulemusena saame järgmise veateabe.</p> <p>Nagu ülaltoodud näitest näha, piisab tõrke eraldamiseks ja selle esinemise põhjuse mõistmiseks objekti XMLDOMParseError tagastatud teabest.</p> <p>Nüüd taastame sulgemise elemendi <TITLE>meie dokumendis ja jätkake arutelu XML DOM-i üle.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Juurdepääs dokumendipuule</h2> <p>Dokumendipuule juurdepääsemiseks võite hankida juurelemendi ja seejärel itereerida selle alamharude kaudu või leida mõne konkreetse haru. Esimesel juhul saame juurelemendi läbi atribuudi DocumentElement, mis tagastab XMLDOMNode tüüpi objekti. Järgmine näitab, kuidas kasutada atribuuti DocumentElement iga alamelemendi sisu hankimiseks.</p><p>VarNode: IXMLDOMNode; Juur: IXMLDOMElement; I: täisarv; ... Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;</p><p>Meie XML-dokumendi jaoks saame järgmise teksti.</p> <p>Kui meid huvitab konkreetne haru või esimesest alamharust allpool olev haru, saame kasutada kas meetodit NodeFromID või objekti XMLDOMDocument meetodit GetElementByTagName.</p> <p>Meetod NodeFromID nõuab unikaalset identifikaatorit, mis on määratletud XML-skeemis või dokumenditüübi definitsioonis (DTD) ja tagastab selle identifikaatoriga haru.</p> <p>Meetod GetElementByTagName nõuab kindla elemendiga (sildiga) stringi ja tagastab kõik selle elemendiga harud. Järgnevalt on näidatud, kuidas seda meetodit kasutada meie CD-ROMi kataloogist kõigi artistide leidmiseks:</p><p>Sõlmed: IXMLDOMNodeList; Sõlm: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); Kui I:= 0 kuni Nodes.Length-1, tehke Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Sõlm.Tekst); lõpp;</p><p>Meie XML-dokumendi jaoks saame järgmise teksti</p> <p>Pange tähele, et XMLDOMNode objekti SelectNodes meetod pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Aga sellest lähemalt allpool.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Dokumendi haru – XMLDOMNode objekt</h2> <p>XMLDOMNode objekt esindab dokumendi haru. Oleme selle objektiga juba kokku puutunud, kui saime dokumendi juurelemendi:</p><p>Root:= XMLDoc.DocumentElement;</p><p>Teabe saamiseks XML-dokumendi haru kohta saate kasutada XMLDOMNode objekti atribuute (tabel 1).</p> <p>Harus salvestatud andmetele juurdepääsuks kasutatakse tavaliselt kas atribuuti NodeValue (saadaval atribuutide, tekstiharude, kommentaaride, töötlemisjuhiste ja CDATA jaotiste jaoks), atribuuti Text, mis tagastab haru tekstisisu, või atribuuti NodeTypedValue. . Viimast saab aga kasutada ainult trükitud elementidega harude jaoks.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Dokumendipuus navigeerimine</h3> <p>Objekt XMLDOMNode pakub palju võimalusi dokumendipuus navigeerimiseks. Näiteks pääseb emaharule juurde atribuudi ParentNode (tüüp XMLDOMNode) kaudu, alamharudele pääseb juurde atribuutide ChildNodes (tüüp XMLDOMNodeList), FirstChild ja LastChild (tüüp XMLDOMNode) kaudu jne. Atribuut OwnerDocument tagastab XMLDOMDocument tüüpi objekti, mis tuvastab XML-dokumendi enda. Ülaltoodud atribuudid muudavad dokumendipuus navigeerimise lihtsaks.</p> <p>Nüüd korrakem läbi kõik XML-dokumendi harud:</p><p>Root:= XMLDoc.DocumentElement; Kui I:= 0 kuni Root.ChildNodes.Length-1, tehke Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes then GetChilds(Node,0); lõpp;</p><p>Nagu eespool märgitud, pakub XMLDOMNode objekti SelectNodes paindlikum viis juurdepääsuks dokumendi harudele. Lisaks on SelectSingleNode meetod, mis tagastab ainult dokumendi esimese haru. Mõlemad meetodid võimaldavad määrata harude leidmiseks XSL-malle.</p> <p>Kaaluge meetodi SelectNodes kasutamist kõigi CD haru ja PRICE alamharu omavate harude toomiseks:</p><p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');</p><p>Kõik CD-haru PRICE alamharud paigutatakse Nodesi kogusse. Naaseme XSL-mallide arutelu juurde veidi hiljem.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipuleerimine alamharudega</h3> <p>Alamharudega manipuleerimiseks saame kasutada XMLDOMNode objekti meetodeid (tabel 2).</p> <p>Esimese ketta kirje täielikuks eemaldamiseks peate käivitama järgmise koodi:</p><p>Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; Sõlm:= Juur; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);</p><p>Pange tähele, et selles näites kustutame esimese alamharu. Esimese alamharu esimese elemendi eemaldamine on näidatud allpool:</p><p>Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.Load('C:\ANDMED\DATA.xml'); // Hangi juurelement Root:= XMLDoc.DocumentElement; // ja esimene alamharu Node:= Root.FirstChild; // Eemalda esimene alamharu Node.RemoveChild(Node.FirstChild);</p><p>Ülaltoodud näites ei ole me esimest haru kustutanud <CD>…</CD>, ja haru esimene element on <TITLE>….

Nüüd lisame uue haru. Allpool on kood, mis näitab, kuidas lisada uus muusika-CD-ROM-i kirje:

Var NewNode: IXMLDOMNode; Laps: IXMLDOMNode; ... // Loo uus haru - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // Lisa element Child:= XMLDoc.CreateNode(1,'pealkiri',''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'Pink Floyd'; // Lisa element <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'Division Bell'; // Lisa element <COUNTRY>Child:= XMLDoc.CreateNode(1, 'RIIK', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'UK'; // Lisa element <COMPANY>Child:= XMLDoc.CreateNode(1, 'ETTEVÕTE', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= 'EMI Records Ltd.'; // Lisa element <PRICE>Child:= XMLDoc.CreateNode(1, 'HIND', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= '11.99"; // Lisage element <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // Lisage element NewNode.AppendChild(Child); // Ja määrake selle väärtus Child.Text:= '1994'; // Ja lisage haru Root.AppendChild(NewNode); ...</p><p>Ülaltoodud kood näitab uue haru lisamiseks järgmist toimingute jada:</p> <ul><li>Uue haru loomine CreateNode meetodil: <ul><li>elemendi loomine CreateNode meetodil;</li> <li>elemendi lisamine harule, kasutades meetodit AppendChild;</li> <li>elemendi väärtuse määramine atribuudi Text kaudu;</li> <li>... korrake kõigi elementide puhul.</li> </ul></li> <li>Dokumendile uue haru lisamine meetodil AppendChild.</li> </ul><p>Tuletame meelde, et AppendChild meetod lisab puu lõppu haru. Selleks, et lisada puu kindlasse kohta oksa, tuleb kasutada meetodit InsertBefore.</p> <h2>Harukomplekt – objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList sisaldab harude loendit, mille saab luua meetoditega SelectNodes või GetElementsByTagName või hankida atribuudist ChildNodes.</p> <p>Oleme juba näinud selle objekti kasutamist jaotises "Dokumendipuus navigeerimine" toodud näites. Siin esitame mõned teoreetilised märkused.</p> <p>Nimekirjas olevate harude arvu saab Pikkus omaduse väärtusena. Harudel on indeksid vahemikus 0 kuni Length-1 ja igale üksikule harule pääseb juurde vastava indeksiga elemendi massiivi elemendi kaudu.</p> <p>Harude loendis liikumiseks saab kasutada ka meetodit NextNode, mis tagastab loendis järgmise haru või nulli, kui praegune haru on viimane. Loendi algusesse naasmiseks helistage lähtestamismeetodile.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Looge ja salvestage dokumente</h2> <p>Niisiis, oleme näinud, kuidas saate olemasolevatele XML-dokumentidele harusid ja elemente lisada. Nüüd loome käigult XML-dokumendi. Kõigepealt pidage meeles, et dokumenti saab laadida mitte ainult URL-ist, vaid ka tavalisest stringist. Järgnevalt näidatakse, kuidas luua juurelementi, mida saab seejärel kasutada ülejäänud elementide dünaamiliseks konstrueerimiseks (mida me juba käsitlesime jaotises Manipulating Child Branches):</p><p>Var XMLDoc: IXMLDOMDocument; Juur: IXMLDOMNode; Sõlm: IXMLDOMNode; S: WideString; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Vale; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Node:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Sõlm); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Null;</p><p>Pärast XML-dokumendi koostamist salvestame selle meetodi Salvesta abil faili. Näiteks:</p> <p>XMLDoc.Save('C:\ANDMED\NEWCD.XML');</p> <p>Lisaks faili salvestamisele võimaldab salvestamismeetod salvestada XML-dokumendi uude XMLDOMDocument-objekti. Sel juhul töödeldakse dokument täielikult ja selle tulemusena kontrollitakse selle struktuuri ja süntaksit. Järgmine näitab, kuidas dokumenti mõnes teises objektis salvestada.</p><p>Protseduur TForm1.Button2Click(Saatja: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= null; lõpp;</p><p>Lõpuks võimaldab salvestamismeetod salvestada XML-dokumendi ka teistele COM-objektidele, mis toetavad liideseid IStream, IPersistStream või IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL-mallide kasutamine</h2> <p>XMLDOMNode objekti SelectNodes meetodi käsitlemisel mainisime, et see pakub paindlikumat viisi dokumendiharudele juurdepääsuks. Paindlikkus seisneb selles, et saate harude valimise kriteeriumina määrata XSL-malli. Sellised mallid pakuvad võimsat mehhanismi teabe leidmiseks XML-dokumentidest. Näiteks kõigi meie kataloogis olevate muusika-CD-ROM-ide pealkirjade loendi saamiseks võime käivitada järgmise päringu:</p><p>Et teada saada, milliste artistide CD-d USA-s välja anti, moodustatakse päring järgmiselt:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>Järgmine näitab, kuidas leida kataloogist esimene draiv:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>Ja viimaseks:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>Bob Dylani plaatide leidmiseks võite käivitada järgmise päringu:</p><p>Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');</p><p>ja pärast 1985. aastat välja antud plaatide loendi saamiseks käivitame järgmise päringu:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>XSL-i süntaksi üksikasjalikum arutelu nõuab eraldi postitust. Lugejate intrigeerimiseks ja edasise uurimistöö julgustamiseks toon vaid ühe väikese näite XSL-i võimalikust kasutamisest. Oletame, et peame oma kataloogi teisendama tavaliseks HTML-tabeliks. Traditsioonilisi meetodeid kasutades peame läbima kõik puu oksad ja moodustama iga saadud elemendi jaoks vastavad sildid. <TD>…</TD>.</p> <p>XSL-i kasutades loome lihtsalt malli (või stiililehe), milles täpsustame, mida ja kuidas teisendada. Seejärel rakendame selle malli oma kataloogile – ja oletegi: meil on XSL-malli tekst, mis teisendab kataloogi tabeliks (loetelu 2).</p> <p>Kood XSL-malli katmiseks meie kataloogis näeb välja järgmine:</p><p>Protseduur TForm1.Button2Click(Saatja: TObject); var XSLDoc: IXMLDOMDokument; begin XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\ANDMED\DATA.xsl'); Memo2.Tekst:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= null; lõpp;</p><p>XSL-i arutelu lõpetuseks olgu öeldud, et praegu kasutatakse seda keelt aktiivselt nii erinevate XML-dokumentide vahel teisendamiseks kui ka dokumentide vormindamiseks.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Järeldus</h2> <p>Arusaadavatel põhjustel on võimatu ühes artiklis katta kõiki Microsoft XML DOM-i objekte ja tuua näiteid nende kasutamise kohta. Siin oleme puudutanud ainult XML-DOM-i rakendustes kasutamise põhiprobleeme. Tabelis. Joonis 3 näitab kõiki Microsoft XML DOM-is rakendatud objekte.</p> <p>ComputerPress 12"2000</p> <p>Tervitan kõiki! Mitu aastat kirjutasin Matlabis ja siis oli kannatamatu Delfis programmi kirjutada.</p><p>Ma pean õppima, kuidas töötada xml-dokumentidega. Töötan RAD Stiduo XE3-s. Seal on komponent TXMLDocument, mis on ilmselt paljudele Delphi programmeerijatele teada. Tundub, et ta suudab palju. Kuid probleem on selles, et selle jaoks puudub selge dokumentatsioon ja kirjeldus. Abi RAD Studios on prügi, sest seal pole normaalset infot; vaid napp abi mõne meetodite ja protseduuride kohta lehtedel laiali (ilma näidete ja tavalise kirjelduseta). Tuhmusin kogu Interneti läbi. Foorumitest leidsin ainult konkreetsete ülesannetega teemasid, kus tuleb veel tund aega mõistatada, mida see või teine ​​rida teeb, mis on seotud xml faili ligipääsuga. <br>Vajan ka juhendit peamiste funktsioonide, protseduuride ja meetodite kohta, mida xml-ga töötamisel kasutatakse. Õpik, käsiraamat, kirjeldus. Või vähemalt "xml delphis mannekeenide jaoks". Näiteks:</p><p><i>XML-faili avamiseks kasutage meetodit XMLDocument1.LoadFromFile("filemane.xml"), kus failinimi on faili nimi. <br>Loendi salvestamiseks kasutatakse IXMLNode tüüpi sõlmeloendi muutujat <a href="https://obanracer.ru/et/dochernie-i-roditelskie-elementy-v-html-tehniki-raboty-s-dom-roditelskie.html">lapselemendid</a>. Selle loendi määramiseks kasutage meetodit Xmldocument1.DocumentElement (kus XMLDocument1 on uuritav xml-fail). <br>Alamelemendi "element1" sisu päringu tegemiseks kasutage meetodit XMLDocument1.DocumentElement.ChildNodes[ "element1"].Text.... <br></i><br>ja selles vaimus edasi kõiki rakendatud meetodeid, protseduure ja andmetüüpe. <br>Kust selliseid käsiraamatuid/kirjeldusi leida? Kes saab aidata?</p><p>Kui vajate konkreetset ülesannet, siis kirjeldan seda. <br>Mul on selline xml dokument:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>üles.jpg</assets><br> <images><br> <pano> <tiles>pano_u.jpg</tiles><br> <tiles>pano_f.jpg</tiles><br> </pano><br> <tour><br> <tourimages>algus.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">mingi tekst</data><br><data name="onerror" mode="noVoice">mingi veatekst</data><br><data name="onerror" mode="alarm">Muu veatekst</data></p><p>Programmi koodis on meil:</p><p>var <br>...<br>vanem, laps1: IXMLNode;</p><p>alustada <br>XMLDocument1.LoadFromFile("f:\failinimi.xml"); <br>XMLDocument1.Active:=true; <br>.<br>.<br>lõpp</p><p>Mida peate tegema õppima: <br>(Vabandan juba ette, kui nimetan xml-dokumendi komponente valesti) <br>1. Hankige juurelemendi nimi (meie puhul ltm), samuti selle atribuutide (versioon, tüüp) ja nende väärtuste loend ("1.0", "seaded"). <br>2. Hankige juure alamelementide arv. Sel juhul on neid 7: mallFailid, dimensioonid, leviala, leviala, andmed, andmed, andmed. Hankige elementide (siltide) nimed (templateFiles, mõõtmed jne). Pärast elementide arvu hankimist ja nende nimede ekstraheerimise õppimist liigun 0-lt count-1-le ja teen seda, mida vajan. <br>3. Hankige vajaliku elemendi atribuutide arv ja loend. Näiteks leviala elemendi jaoks. Õige vastus oleks 4 atribuuti. Esimese leviala elemendi puhul on need nimi, stiil, stseen, ath. Teise jaoks - sama, ainult atribuudi ath asemel - atribuut rz. <br>Pange tähele, et failis on 2 leviala elementi, millel on erinevad atribuudid. Siit saate teada, kuidas nendega töötada (kui sama nimega elemente on rohkem kui 1)? <br>Ma tahan nii: saan alamelementide loendi rel. juurteksti (vt punkt 2), jooksen need läbi for-ga ja leian hotspoti elemendid, mille nimeparameeter on võrdne nõutavaga (ütle "hs015_2" - kindlasti tuleb üks selline element). Kas seda probleemi saab kuidagi ilma ahelata lahendada? See tähendab, et hankida atribuudi scena väärtus hotspoti elemendi jaoks, millel on name="hs015_2"? <br>4. Tehke ülaltoodut sõlmede ja elementide puhul, mis on laste lapsed. Minu näites on sõlm (ja laps ja vanem. <br>Kui ma õigesti aru saan, peate sõlme sisu kuidagi üle kandma <a href="https://obanracer.ru/et/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">tüüpi muutuja</a> IXMLNode ja tehke sama, mis lõigetes 1–3. Nii et?</p><p>5. Peate õppima, kuidas ülaltoodud parameetreid muuta (seadke ise).</p><p>Tundub, et praeguseks on see kõik. Selles etapis on minu jaoks kõige olulisemad süntaktilised konstruktsioonid. <br>Kellele see teema kuulub, palun kirjutage ülaltoodud küsimuste lahendamiseks teisi süntaktilisi konstruktsioone (kuidas saada atribuute, nende arv, elementide arv, nende nimed jne). Peaasi on nüüd süntaksi valdamine ja ma rakendan oma algoritmi hiljem. Suur tänu juba ette kõigile!</p><p>P.S. Ma tõesti ei tahaks oma XML-i parserit nullist kirjutada lihtsalt sellepärast, et olemasolevatele pole normaalset kirjeldust.</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>Eelmine artikkel</span><a href="https://obanracer.ru/et/cryptopro-csp-versii-3-6-i-vyshe-naznachenie-kriptopro-csp-integraciya-s.html">Cryptopro csp versioon 3.6 ja uuem. CryptoPro CSP eesmärk. Integratsioon CryptoPro platvormiga</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>Järgmine artikkel</span><a href="https://obanracer.ru/et/tipovye-problemy-pri-rabote-v-byudzhetnom-planirovanii-oshibka-vhoda.html">Tüüpilised probleemid eelarve planeerimisel töötamisel</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/et/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="#">SEOTUD ARTIKLID</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/et/kriptopro-ne-vidit-klyuch-jacarta-reshaem-za-minutu-ustanovka.html" rel="bookmark" title="Sertifikaatide paigaldamine krüptoprosse mälupulgalt Kontur ei näe mälupulgal olevat sertifikaati"><img width="218" height="150" class="entry-thumb" src="/uploads/4c872566c8d458675526e7ed8c826878.jpg" alt="Sertifikaatide paigaldamine krüptoprosse mälupulgalt Kontur ei näe mälupulgal olevat sertifikaati" title="Sertifikaatide paigaldamine krüptoprosse mälupulgalt Kontur ei näe mälupulgal olevat sertifikaati"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/monitors/" class="td-post-category">Monitorid</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/kriptopro-ne-vidit-klyuch-jacarta-reshaem-za-minutu-ustanovka.html" rel="bookmark" title="Sertifikaatide paigaldamine krüptoprosse mälupulgalt Kontur ei näe mälupulgal olevat sertifikaati">Sertifikaatide paigaldamine krüptoprosse mälupulgalt Kontur ei näe mälupulgal olevat sertifikaati</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/et/chto-delat-esli-kompyuter-ne-vidit-ecp-ustanovka-i-nastroika.html" rel="bookmark" title="Elektroonilise allkirja installimine ja konfigureerimine Arvuti ei näe digitaalallkirja, mida teha"><img width="218" height="150" class="entry-thumb" src="/uploads/626d1b9960138cce50ea1cfb67091a95.jpg" alt="Elektroonilise allkirja installimine ja konfigureerimine Arvuti ei näe digitaalallkirja, mida teha" title="Elektroonilise allkirja installimine ja konfigureerimine Arvuti ei näe digitaalallkirja, mida teha"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/security/" class="td-post-category">Ohutus</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/chto-delat-esli-kompyuter-ne-vidit-ecp-ustanovka-i-nastroika.html" rel="bookmark" title="Elektroonilise allkirja installimine ja konfigureerimine Arvuti ei näe digitaalallkirja, mida teha">Elektroonilise allkirja installimine ja konfigureerimine Arvuti ei näe digitaalallkirja, mida teha</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/et/oshibka-inicializacii-obekta-plagina-ustanovka-plagina-kriptopro-csp-v.html" rel="bookmark" title="CryptoPro CSP pistikprogrammi installimine Mozilla Firefoxi brauserisse"><img width="218" height="150" class="entry-thumb" src="/uploads/29a6dc6350854ae0f5abeda01b0bb4c5.jpg" alt="CryptoPro CSP pistikprogrammi installimine Mozilla Firefoxi brauserisse" title="CryptoPro CSP pistikprogrammi installimine Mozilla Firefoxi brauserisse"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/windows-7/" class="td-post-category">Windows 7</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/oshibka-inicializacii-obekta-plagina-ustanovka-plagina-kriptopro-csp-v.html" rel="bookmark" title="CryptoPro CSP pistikprogrammi installimine Mozilla Firefoxi brauserisse">CryptoPro CSP pistikprogrammi installimine Mozilla Firefoxi brauserisse</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/et/ustanovka-sertifikatov-v-kriptopro-s-fleshek-ne-otobrazhaetsya-nuzhnyi-konteiner.html" rel="bookmark" title="Nõutavat konteinerit ei kuvata – Kontuur"><img width="218" height="150" class="entry-thumb" src="/uploads/35ebe34757e0d96481eaee90bb81379f.jpg" alt="Nõutavat konteinerit ei kuvata – Kontuur" title="Nõutavat konteinerit ei kuvata – Kontuur"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/more/" class="td-post-category">muud</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/ustanovka-sertifikatov-v-kriptopro-s-fleshek-ne-otobrazhaetsya-nuzhnyi-konteiner.html" rel="bookmark" title="Nõutavat konteinerit ei kuvata – Kontuur">Nõutavat konteinerit ei kuvata – Kontuur</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/et/ustranenie-oshibki-plagin-zagruzhen-no-ne-sozdayutsya-obekty.html" rel="bookmark" title="Veaotsing tõrkeotsingul "Plugin on laaditud, kuid objekte ei looda Allkirjastamise pistikprogrammi lähtestamise tõrke pistikprogramm pole installitud""><img width="218" height="150" class="entry-thumb" src="/uploads/63b3e659fa25d03ff42c4ceb103cdc62.jpg" alt="Veaotsing tõrkeotsingul "Plugin on laaditud, kuid objekte ei looda Allkirjastamise pistikprogrammi lähtestamise tõrke pistikprogramm pole installitud"" title="Veaotsing tõrkeotsingul "Plugin on laaditud, kuid objekte ei looda Allkirjastamise pistikprogrammi lähtestamise tõrke pistikprogramm pole installitud""/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/case/" class="td-post-category">Korp</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/ustranenie-oshibki-plagin-zagruzhen-no-ne-sozdayutsya-obekty.html" rel="bookmark" title="Veaotsing tõrkeotsingul "Plugin on laaditud, kuid objekte ei looda Allkirjastamise pistikprogrammi lähtestamise tõrke pistikprogramm pole installitud"">Veaotsing tõrkeotsingul "Plugin on laaditud, kuid objekte ei looda Allkirjastamise pistikprogrammi lähtestamise tõrke pistikprogramm pole installitud"</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/et/sredstva-kriptograficheskoi-zashchity-informacii-skzi-skzi---eto-chto.html" rel="bookmark" title="Krüptograafilise teabe kaitse vahendid (SKZI)"><img width="218" height="150" class="entry-thumb" src="/uploads/9e82c39cf922aac2c13bcea4a6e8e802.jpg" alt="Krüptograafilise teabe kaitse vahendid (SKZI)" title="Krüptograafilise teabe kaitse vahendid (SKZI)"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/case/" class="td-post-category">Korp</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/sredstva-kriptograficheskoi-zashchity-informacii-skzi-skzi---eto-chto.html" rel="bookmark" title="Krüptograafilise teabe kaitse vahendid (SKZI)">Krüptograafilise teabe kaitse vahendid (SKZI)</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/et/polnostyu-ochistit-otformatirovat-token-pin-kod-dlya-tokenov-parol-s.html" rel="bookmark" title="Tokenite PIN-kood: erireeglitega parool"><img width="218" height="150" class="entry-thumb" src="/uploads/af827ac3804d4f4abcc4045f771380f5.jpg" alt="Tokenite PIN-kood: erireeglitega parool" title="Tokenite PIN-kood: erireeglitega parool"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/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/et/polnostyu-ochistit-otformatirovat-token-pin-kod-dlya-tokenov-parol-s.html" rel="bookmark" title="Tokenite PIN-kood: erireeglitega parool">Tokenite PIN-kood: erireeglitega parool</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/et/kak-skopirovat-elektronnyi-kak-skopirovat-elektronnuyu-podpis.html" rel="bookmark" title="Kuidas kopeerida elektroonilist allkirja registrist kandjale?"><img width="218" height="150" class="entry-thumb" src="/uploads/c8e7526a199f7cecc6e891e4d293f4e2.jpg" alt="Kuidas kopeerida elektroonilist allkirja registrist kandjale?" title="Kuidas kopeerida elektroonilist allkirja registrist kandjale?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/more/" class="td-post-category">muud</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/kak-skopirovat-elektronnyi-kak-skopirovat-elektronnuyu-podpis.html" rel="bookmark" title="Kuidas kopeerida elektroonilist allkirja registrist kandjale?">Kuidas kopeerida elektroonilist allkirja registrist kandjale?</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/et/tekstury-fony-skachat-s-portala-uphotoshop-kak-bystro-sdelat.html" rel="bookmark" title="Kuidas Photoshopis kiiresti fotole ilusat tausta teha Ilus taust Photoshopi jaoks lastele"><img width="218" height="150" class="entry-thumb" src="/uploads/b25c27f83565106a6f8b4c1c6be209ea.jpg" alt="Kuidas Photoshopis kiiresti fotole ilusat tausta teha Ilus taust Photoshopi jaoks lastele" title="Kuidas Photoshopis kiiresti fotole ilusat tausta teha Ilus taust Photoshopi jaoks lastele"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/internet/" class="td-post-category">Internet</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/tekstury-fony-skachat-s-portala-uphotoshop-kak-bystro-sdelat.html" rel="bookmark" title="Kuidas Photoshopis kiiresti fotole ilusat tausta teha Ilus taust Photoshopi jaoks lastele">Kuidas Photoshopis kiiresti fotole ilusat tausta teha Ilus taust Photoshopi jaoks lastele</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">Soovitatav</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/et/izmenit-cvet-v-fotoshope-cs3-kak-izmenit-cvet-obekta-na-foto-v.html" rel="bookmark" title="Kuidas Photoshopis fotol oleva objekti värvi muuta"><img width="324" height="235" class="entry-thumb" src="/uploads/d02bc5bcbfb7ad967567655cdf692552.jpg" alt="Kuidas Photoshopis fotol oleva objekti värvi muuta" title="Kuidas Photoshopis fotol oleva objekti värvi muuta"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/et/category/windows-8/" class="td-post-category">Windows 8</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/izmenit-cvet-v-fotoshope-cs3-kak-izmenit-cvet-obekta-na-foto-v.html" rel="bookmark" title="Kuidas Photoshopis fotol oleva objekti värvi muuta">Kuidas Photoshopis fotol oleva objekti värvi muuta</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">11.02.2015 27.01.2018 Selles õpetuses räägin teile üksikasjalikult, kuidas Photoshopis värvi muuta. Panen kõik sammud üksikasjalikult kirja, lisan pildid, et ...</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/et/kak-konvertirovat-izobrazhenie-iz-psd-v-jpg-dopolnitelnaya.html" rel="bookmark" title="Lisateavet PSD-vormingu kohta"><img width="100" height="70" class="entry-thumb" src="/uploads/bf16d1ea500e4d20b15738e016f5319e.jpg" alt="Lisateavet PSD-vormingu kohta" title="Lisateavet PSD-vormingu kohta"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/kak-konvertirovat-izobrazhenie-iz-psd-v-jpg-dopolnitelnaya.html" rel="bookmark" title="Lisateavet PSD-vormingu kohta">Lisateavet PSD-vormingu kohta</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/et/category/multimedia/" class="td-post-category">Multimeedia</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/et/kak-v-fotoshope-uznat-cvet-fona-kak-opredelit-cvet-v.html" rel="bookmark" title="Kuidas Photoshopis värvi määrata?"><img width="100" height="70" class="entry-thumb" src="/uploads/e18e40504395abcffc415ba905b55cab.jpg" alt="Kuidas Photoshopis värvi määrata?" title="Kuidas Photoshopis värvi määrata?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/kak-v-fotoshope-uznat-cvet-fona-kak-opredelit-cvet-v.html" rel="bookmark" title="Kuidas Photoshopis värvi määrata?">Kuidas Photoshopis värvi määrata?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/et/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/et/rastushevka-v-fotoshope-kak-sdelat-rastushevku-kraev-kak-razmyt-kraya-v-fotoshope.html" rel="bookmark" title="Kuidas teha servasulgesid"><img width="100" height="70" class="entry-thumb" src="/uploads/10c49704ba8158187184f5c30e458acd.jpg" alt="Kuidas teha servasulgesid" title="Kuidas teha servasulgesid"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/rastushevka-v-fotoshope-kak-sdelat-rastushevku-kraev-kak-razmyt-kraya-v-fotoshope.html" rel="bookmark" title="Kuidas teha servasulgesid">Kuidas teha servasulgesid</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/et/category/multimedia/" class="td-post-category">Multimeedia</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/et/komanda-sohranit-kak-ne-rabotaet-chto-delat-chto-delat-esli-save-as.html" rel="bookmark" title="Mida teha, kui nuppu Salvesta nimega ei klõpsata?"><img width="100" height="70" class="entry-thumb" src="/uploads/056077fe1e30f55b38079365b16c38a0.jpg" alt="Mida teha, kui nuppu Salvesta nimega ei klõpsata?" title="Mida teha, kui nuppu Salvesta nimega ei klõpsata?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/komanda-sohranit-kak-ne-rabotaet-chto-delat-chto-delat-esli-save-as.html" rel="bookmark" title="Mida teha, kui nuppu Salvesta nimega ei klõpsata?">Mida teha, kui nuppu Salvesta nimega ei klõpsata?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/et/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/et/gde-skachat-kisti-dlya-photoshop-podborka-luchshih-besplatnyh.html" rel="bookmark" title="Photoshopi pintsel - akvarellide maskeerimispintslite ruudud Photoshopi jaoks"><img width="100" height="70" class="entry-thumb" src="/uploads/33229dcfb69f7dc3b1ec9c6e7b9c2817.jpg" alt="Photoshopi pintsel - akvarellide maskeerimispintslite ruudud Photoshopi jaoks" title="Photoshopi pintsel - akvarellide maskeerimispintslite ruudud Photoshopi jaoks"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/gde-skachat-kisti-dlya-photoshop-podborka-luchshih-besplatnyh.html" rel="bookmark" title="Photoshopi pintsel - akvarellide maskeerimispintslite ruudud Photoshopi jaoks">Photoshopi pintsel - akvarellide maskeerimispintslite ruudud Photoshopi jaoks</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/et/category/windows-7/" class="td-post-category">Windows 7</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/et/operacionnaya-windows-7-prekrashchenie-prodazh-oem-licenzii.html" rel="bookmark" title="Lõpetage OEM-litsentside müük"><img width="100" height="70" class="entry-thumb" src="/uploads/279dd32dcac684395643d98bb52835ae.jpg" alt="Lõpetage OEM-litsentside müük" title="Lõpetage OEM-litsentside müük"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/et/operacionnaya-windows-7-prekrashchenie-prodazh-oem-licenzii.html" rel="bookmark" title="Lõpetage OEM-litsentside müük">Lõpetage OEM-litsentside müük</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/et/category/multimedia/" class="td-post-category">Multimeedia</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/et/osnovnye-svedeniya-pro-nternet-struktura-seti-internet-osnovnye.html" rel="bookmark" title="Interneti ülesehitus: töö põhiprintsiibid"><img width="218" height="150" class="entry-thumb" src="/uploads/b6d8f15c70e30b136ae8e0fd3233381f.jpg" alt="Interneti ülesehitus: töö põhiprintsiibid" title="Interneti ülesehitus: töö põhiprintsiibid"/ 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/et/osnovnye-svedeniya-pro-nternet-struktura-seti-internet-osnovnye.html" rel="bookmark" title="Interneti ülesehitus: töö põhiprintsiibid">Interneti ülesehitus: töö põhiprintsiibid</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/et/osnovnoi-stek-protokolov-internet-stek-setevye-kommutatory.html" rel="bookmark" title="Virna (võrgulülitid)"><img width="218" height="150" class="entry-thumb" src="/uploads/ea694ef7b70419e303bf2676a22ec407.jpg" alt="Virna (võrgulülitid)" title="Virna (võrgulülitid)"/ 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/et/osnovnoi-stek-protokolov-internet-stek-setevye-kommutatory.html" rel="bookmark" title="Virna (võrgulülitid)">Virna (võrgulülitid)</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/et/p2p-videochat-na-baze-webrtc-webrtc-videokonferencii-v-brauzere-webrtc-so.html" rel="bookmark" title="WebRTC-l põhinev P2P-videovestlus"><img width="218" height="150" class="entry-thumb" src="/uploads/48d6b4d0385a56ab2b3273eb4454c1f6.jpg" alt="WebRTC-l põhinev P2P-videovestlus" title="WebRTC-l põhinev P2P-videovestlus"/ 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/et/p2p-videochat-na-baze-webrtc-webrtc-videokonferencii-v-brauzere-webrtc-so.html" rel="bookmark" title="WebRTC-l põhinev P2P-videovestlus">WebRTC-l põhinev P2P-videovestlus</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/et/tehnologiya-webrtc-audio--i-videochat-v-brauzere-p2p-videochat-na-baze-webrtc.html" rel="bookmark" title="P2P-videovestlus, mis põhineb veebiarendaja WebRTC-l WebRTC"><img width="218" height="150" class="entry-thumb" src="/uploads/a390c33c06c9dfdc21530084de087f82.jpg" alt="P2P-videovestlus, mis põhineb veebiarendaja WebRTC-l WebRTC" title="P2P-videovestlus, mis põhineb veebiarendaja WebRTC-l WebRTC"/ 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/et/tehnologiya-webrtc-audio--i-videochat-v-brauzere-p2p-videochat-na-baze-webrtc.html" rel="bookmark" title="P2P-videovestlus, mis põhineb veebiarendaja WebRTC-l WebRTC">P2P-videovestlus, mis põhineb veebiarendaja WebRTC-l WebRTC</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/et/chto-takoe-globalnaya-set-kratko-globalnaya-set-internet.html" rel="bookmark" title="Mis on lühidalt ülemaailmne võrk"><img width="218" height="150" class="entry-thumb" src="/uploads/5cfb31f854c7afa62fc1257a4c9ca34e.jpg" alt="Mis on lühidalt ülemaailmne võrk" title="Mis on lühidalt ülemaailmne võrk"/ 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/et/chto-takoe-globalnaya-set-kratko-globalnaya-set-internet.html" rel="bookmark" title="Mis on lühidalt ülemaailmne võrk">Mis on lühidalt ülemaailmne võrk</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/et/metody-peredachi-na-fizicheskom-urovne-peredacha-diskretnyh.html" rel="bookmark" title="Diskreetsete andmete edastamine füüsilisele kihile"><img width="218" height="150" class="entry-thumb" src="/uploads/e23b10724d2695bc8f126775759a6fce.jpg" alt="Diskreetsete andmete edastamine füüsilisele kihile" title="Diskreetsete andmete edastamine füüsilisele kihile"/ 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/et/metody-peredachi-na-fizicheskom-urovne-peredacha-diskretnyh.html" rel="bookmark" title="Diskreetsete andmete edastamine füüsilisele kihile">Diskreetsete andmete edastamine füüsilisele kihile</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/et/20-metody-peredachi-dannyh-na-fizicheskom-urovne-peredacha.html" rel="bookmark" title="Diskreetsete andmete edastamine füüsilisele kihile"><img width="218" height="150" class="entry-thumb" src="/uploads/7505ae02bc9e5cbddbadab6eaee9342d.jpg" alt="Diskreetsete andmete edastamine füüsilisele kihile" title="Diskreetsete andmete edastamine füüsilisele kihile"/ 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/et/20-metody-peredachi-dannyh-na-fizicheskom-urovne-peredacha.html" rel="bookmark" title="Diskreetsete andmete edastamine füüsilisele kihile">Diskreetsete andmete edastamine füüsilisele kihile</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/et/cikl-for-vba-excel-opisanie-vba-operatory-cikla-vlozhennye-cikly-vyhod.html" rel="bookmark" title="vba Exceli tsükli kirjelduse jaoks"><img width="218" height="150" class="entry-thumb" src="/uploads/61256084071c95c5497dd31b8838233f.jpg" alt="vba Exceli tsükli kirjelduse jaoks" title="vba Exceli tsükli kirjelduse jaoks"/ 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/et/cikl-for-vba-excel-opisanie-vba-operatory-cikla-vlozhennye-cikly-vyhod.html" rel="bookmark" title="vba Exceli tsükli kirjelduse jaoks">vba Exceli tsükli kirjelduse jaoks</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/et/kak-rabotaet-rebenok-pod-prismotrom-usluga-mts-rebenok-pod-prismotrom-kak.html" rel="bookmark" title="MTS-teenus "Laps järelevalve all": kuidas ühendada"><img width="218" height="150" class="entry-thumb" src="/uploads/9bfde0ee6afacd61a552b05cd57851b4.jpg" alt="MTS-teenus "Laps järelevalve all": kuidas ühendada" title="MTS-teenus "Laps järelevalve all": kuidas ühendada"/ 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/et/kak-rabotaet-rebenok-pod-prismotrom-usluga-mts-rebenok-pod-prismotrom-kak.html" rel="bookmark" title="MTS-teenus "Laps järelevalve all": kuidas ühendada">MTS-teenus "Laps järelevalve all": kuidas ühendada</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/et/kak-podklyuchit-mobilnyi-pomoshchnik-mobilnyi-pomoshchnik-dlya-chego-on.html" rel="bookmark" title="Mobiilne assistent – ​​miks see loodi ja millist abi see pakub"><img width="218" height="150" class="entry-thumb" src="/uploads/9d18dfd2b62f56f6bdee0000d45016e3.jpg" alt="Mobiilne assistent – ​​miks see loodi ja millist abi see pakub" title="Mobiilne assistent – ​​miks see loodi ja millist abi see pakub"/ 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/et/kak-podklyuchit-mobilnyi-pomoshchnik-mobilnyi-pomoshchnik-dlya-chego-on.html" rel="bookmark" title="Mobiilne assistent – ​​miks see loodi ja millist abi see pakub">Mobiilne assistent – ​​miks see loodi ja millist abi see pakub</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/et/zona-pokrytiya-mts-komi-karta-karta-zony-pokrytiya-mts.html" rel="bookmark" title="MTS leviala Komi kaart"><img width="218" height="150" class="entry-thumb" src="/uploads/eb950ddb2b6553a1b597a025d5da1510.jpg" alt="MTS leviala Komi kaart" title="MTS leviala Komi kaart"/ 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/et/zona-pokrytiya-mts-komi-karta-karta-zony-pokrytiya-mts.html" rel="bookmark" title="MTS leviala Komi kaart">MTS leviala Komi kaart</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/et/schet-za-internet-mts-prochie-sposoby-dlya-monitoringa-balansa-mts-s.html" rel="bookmark" title="Muud võimalused MTS-i tasakaalu jälgimiseks"><img width="218" height="150" class="entry-thumb" src="/uploads/04836aa39092307f2291fcb8b89a30b4.jpg" alt="Muud võimalused MTS-i tasakaalu jälgimiseks" title="Muud võimalused MTS-i tasakaalu jälgimiseks"/ 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/et/schet-za-internet-mts-prochie-sposoby-dlya-monitoringa-balansa-mts-s.html" rel="bookmark" title="Muud võimalused MTS-i tasakaalu jälgimiseks">Muud võimalused MTS-i tasakaalu jälgimiseks</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/et/chto-takoe-lsb-v-detskih-chasah-lbs-chto-eto-za-oboznachenie-i-kak.html" rel="bookmark" title="Lbs – mis see tähistus on ja kuidas naela kilogrammideks teisendada"><img width="218" height="150" class="entry-thumb" src="/uploads/3112fc70b8bdc2a168fe31ce32bdf82f.jpg" alt="Lbs – mis see tähistus on ja kuidas naela kilogrammideks teisendada" title="Lbs – mis see tähistus on ja kuidas naela kilogrammideks teisendada"/ 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/et/chto-takoe-lsb-v-detskih-chasah-lbs-chto-eto-za-oboznachenie-i-kak.html" rel="bookmark" title="Lbs – mis see tähistus on ja kuidas naela kilogrammideks teisendada">Lbs – mis see tähistus on ja kuidas naela kilogrammideks teisendada</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/et/4g-zona-pokrytiya-karta-pokrytiya-mts.html" rel="bookmark" title="4g leviala. MTS levi kaart"><img width="218" height="150" class="entry-thumb" src="/uploads/70070cf3e61272397d6c7dea78a59b41.jpg" alt="4g leviala. MTS levi kaart" title="4g leviala. MTS levi kaart"/ 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/et/4g-zona-pokrytiya-karta-pokrytiya-mts.html" rel="bookmark" title="4g leviala. MTS levi kaart">4g leviala. MTS levi kaart</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/et/kak-otklyuchit-dopolnitelnoe-ustroistvo-na-mts-edinyi.html" rel="bookmark" title=""Ühtne Internet" MTS: jälle jambid"><img width="218" height="150" class="entry-thumb" src="/uploads/5d98ed5193f037a04df6bb2016bde4b0.jpg" alt=""Ühtne Internet" MTS: jälle jambid" title=""Ühtne Internet" MTS: jälle jambid"/ 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/et/kak-otklyuchit-dopolnitelnoe-ustroistvo-na-mts-edinyi.html" rel="bookmark" title=""Ühtne Internet" MTS: jälle jambid">"Ühtne Internet" MTS: jälle jambid</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/et/sposoby-prodvizheniya-salonov-krasoty-i-spa-v-instagram-prodvizhenie.html" rel="bookmark" title="Ilusalongi reklaam Instagramis"><img width="218" height="150" class="entry-thumb" src="/uploads/4f9bc72c3c037df28788550feaeb0dc0.jpg" alt="Ilusalongi reklaam Instagramis" title="Ilusalongi reklaam Instagramis"/ 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/et/sposoby-prodvizheniya-salonov-krasoty-i-spa-v-instagram-prodvizhenie.html" rel="bookmark" title="Ilusalongi reklaam Instagramis">Ilusalongi reklaam Instagramis</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/et/sposoby-prodvizheniya-salonov-krasoty-i-spa-v-instagram-kak.html" rel="bookmark" title="Kuidas täita ilusalongi Instagrami profiili"><img width="218" height="150" class="entry-thumb" src="/uploads/ba7fb85a6fffd3432dcfc532f831817a.jpg" alt="Kuidas täita ilusalongi Instagrami profiili" title="Kuidas täita ilusalongi Instagrami profiili"/ 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/et/sposoby-prodvizheniya-salonov-krasoty-i-spa-v-instagram-kak.html" rel="bookmark" title="Kuidas täita ilusalongi Instagrami profiili">Kuidas täita ilusalongi Instagrami profiili</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/et/servisy-kotorye-platyat-za-ispolzovanie-moshchnostei-kompyutera-kak.html" rel="bookmark" title="Kuidas arvuti arvutusvõimsusega raha teenida"><img width="218" height="150" class="entry-thumb" src="/uploads/2cd8955f42458c1e922c38eb7dbec008.jpg" alt="Kuidas arvuti arvutusvõimsusega raha teenida" title="Kuidas arvuti arvutusvõimsusega raha teenida"/ 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/et/servisy-kotorye-platyat-za-ispolzovanie-moshchnostei-kompyutera-kak.html" rel="bookmark" title="Kuidas arvuti arvutusvõimsusega raha teenida">Kuidas arvuti arvutusvõimsusega raha teenida</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">Autoriõigus 2022 – arvutite ja sülearvutite remont. Videokaardid, kõvakettad, internet, monitorid.</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>