Ako pracovať s XML dokumentmi v Delphi? Konkrétne s TXMLDocument? Použitie objektového modelu dokumentu XML.

U mnohých programátorov Delphi je ukladanie nastavení spojené s používaním INI súbory vo svojich programoch. Je potrebné sa vyhnúť používaniu tejto metódy vo viac či menej závažných projektoch, pretože obmedzuje flexibilitu, čo bráni ďalšiemu rozširovaniu programu. Malo by sa povedať, že tento prístup je pomerne populárny vďaka jednoduchému použitiu a prítomnosti vstavaných nástrojov vo vývojovom prostredí.

Avšak štruktúrovaný XML súbory. Ich výhodou je, že počet parametrov nemusí byť pevne daný. Aby ste to lepšie pochopili, zvážte konkrétny príklad.

V programe USearch sa po kliknutí na záznam zobrazí kontextové menu, v ktorom sa zobrazí zoznam položiek. Tieto položky sú príkazy, ktoré sa načítavajú zo súboru nastavení. V prípade, že boli nastavenia uložené v INI súbor, potom by program mohol uložiť a načítať určitý počet príkazov, napríklad 10 alebo 50. Akonáhle bude potrebná väčšia hodnota, budete musieť prepísať kód a podľa toho ho znova skompilovať.


Aplikácia prístupu pomocou XML súbory, budeme môcť dynamicky načítať všetky parametre sekcie. Okrem toho sa konfiguračný súbor stane elegantnejším, bez nadbytočného číslovania parametrov. Ale, štandardné prostriedky pracovať s XML Delphi má veľa nevýhod, preto odporúčam používať štandardná knižnica MSXML... Zvyčajne je štandardne zahrnutý v operačné systémy Rodina Windows.


Spojiť MSXML, potrebujeme vytvoriť súbor rozhrania so zoznamom všetkých funkcií importovaním zo servera COM. O tom, ako importovať rozhranie, bolo napísaných veľa podrobných článkov, ale odporúčam vám stiahnuť si súbor MSXML2_TLB.PAS pripravený k použitiu. Po stiahnutí súboru ho umiestnite vedľa svojho projektu alebo ho presuňte do priečinka lib prostredia Delphi. Modul teda budú môcť využívať všetky vytvorené programy MSXML, stačí k použitiam pridať riadok MSXML2_TLB.

Kvôli prehľadnosti zvážte nasledujúci príklad použitia tejto knižnice:

Procedúra LoadData; var XMLDoc: DOMDocument; Koreň: IXMLDOMElement; begin XMLDoc: = CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Koreň: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("veľkosť / šírka"). Text); Koreň: = nula; XMLDoc: = nula; koniec;

Najprv sa vytvorí inštancia triedy DOMDocument a následne sa do pamäte nahrá obsah súboru settings.xml. Keďže podľa normy akékoľvek XML súbor musí obsahovať koreňovú značku (in tento prípad config), potom ho musíme získať pomocou funkcie DocumentElement... Potom sa obsah zobrazí medzi značkami. , ktoré sú zase medzi značkami ... Naša metóda teda zo súboru settings.xml zobrazí text v MessageBoxe "100px".

500 pixelov 100 pixelov

Tu sa aplikuje metóda SelectSingleNode, ktorá berie ako parameter reťazec

Napriek tomu, že téma práce s XML v Delphi je na internete veľmi diskutovaná, na všemožných fórach často vznikajú otázky na túto tému.

Už som písal, ale rád by som sa vrátil k skutočnému prípadu rýchlej analýzy súboru XML a extrahovania údajov, ktorý som dnes urobil v práci. Získanie potrebných údajov mi netrvalo dlhšie ako 5 minút.

Pozadie. Dnes som potreboval spracovať údaje o nainštalované programy na počítačoch používateľov (áno, áno, identifikujeme pirátov :)). Technické oddelenie mi poskytlo tieto informácie získané od nič netušiacich používateľov cez sieť pomocou WMI. Program, ktorý použili, generuje správy XML formát... V súlade s tým mi priniesli kopec XML súborov s pomerne zložitou štruktúrou, z ktorej som musel vytiahnuť iba názov nainštalovaných softvérových produktov.

Liečba . Po ručnom prezretí niekoľkých súborov som si uvedomil, že starnutie nebude trvať dlho, a rozhodol som sa napísať malý konvertor. Po spustení Delphi som z úložiska vybral objekt XML DataBinding a vložil som doň jeden zo súborov. Všetky nastavenia a parametre som nechal štandardne a v dôsledku toho modul s veľké množstvo triedy a rozhrania na prístup k prvkom tohto súboru XML. Dlho som sa neobťažoval zaoberať sa štruktúrou tried, hneď som prešiel k písaniu prevodníka.

V novej konzolovej aplikácii som napísal celkom jednoduchý kód:


program XML2TXT;

používa
formuláre,
Triedy, SysUtils,
SoftwareXML v "SoftwareXML.pas";

postup CovertXML2Text;
var
softvérová základňa: IXMLSTDSoftwareType;
i: celé číslo;
sr: TSearchRec;
CurDir: reťazec;
ExportFile: TStringList;
začať
CurDir: = IncludeTrailingPathDelimiter (ExtractFilePath (Application.ExeName));
ak FindFirst (CurDir + "*. xml", faAnyFile, sr) = 0, potom
opakovať
ExportFile: = TStringList.Create;
softbase: = LoadSTDSoftware (Pchar (CurDir + sr.Name));
for i: = 0 to softbase.InstalledSoftware.source.software.Count - 1 do
ExportFile.Add (softbase.InstalledSoftware.source.software [i] .DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile (CurDir + softbase.InstalledSoftware.Source.servername + ". Txt");
ExportFile.Free;
kým FindNext (sr) 0;
koniec;

začať
Aplikácia.Inicializácia;
CovertXML2Text;
koniec.

Výsledkom bolo, že som pre každý počítač v mriežke dostal jeden textový editor, ktorý obsahuje zoznam nainštalovaného softvéru.

Mám pocit, že tento kód bude vyžadovať nejaké vysvetlenie. Prečo som napríklad použil modul Formuláre v konzolovej aplikácii a zavolal procedúru Application.Initialize;?

Je to vlastne jednoduché – ide o malý hack, ktorý vám umožňuje používať XML Data Binding v konzolovej aplikácii. Pretože tvrdošijne odmietala inicializovať triedu na prácu s XML. Zatiaľ som neprišiel na skutočné dôvody – dnes bol dôležitý čas, bojom s touto chybou som už strávil 4 z 5 minút. :) Myslím, že neskôr sa týmto problémom zaoberať a napísať, čo je skutočný dôvod.

Podivná trieda softbase bola vytvorená zo súboru XML - to je názov koreňového prvku a softbase.InstalledSoftware.source.software [i] .DisplayName je len navigácia cez vnorené prvky k požadovanému prvku a získanie jeho hodnoty.

Takto jeden z najviac rýchle spôsoby prácu s XML v Delphi.

XML sa čoraz viac používa na ukladanie informácií a ich výmenu medzi aplikáciami a webovými stránkami. Mnoho aplikácií používa tento jazyk ako základný jazyk na ukladanie údajov, zatiaľ čo iné ho používajú na export a import údajov XML. Je teda čas, aby sa vývojári zamysleli nad tým, ako môžu byť údaje XML použité v ich vlastných aplikáciách.

V tomto článku sa pozrieme na XML Document Object Model (DOM) a implementáciu XML DOM od spoločnosti Microsoft.

XML DOM je objektový model, ktorý poskytuje vývojárom objekty na načítanie a spracovanie súborov XML. Objektový model pozostáva z nasledujúcich základných objektov: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap a XMLDOMParseError. Každý z týchto objektov (okrem XMLDOMParseError) obsahuje vlastnosti a metódy, ktoré vám umožňujú získať informácie o objekte, manipulovať s hodnotami a štruktúrou objektu a navigovať v štruktúre dokumentu XML.

Pozrime sa na hlavné objekty XML DOM a ukážeme si niekoľko príkladov ich použitia v Borland Delphi.

Použitie XML DOM v Borland Delphi

Aby ste mohli používať Microsoft XML DOM v aplikáciách Delphi, musíte k projektu pripojiť príslušnú knižnicu typov. Za týmto účelom spustíme príkaz Projekt | Importovať knižnicu typov a v dialógovom okne Importovať knižnicu typov vyberte knižnicu Microsoft XML verzie 2.0 (verzia 2.0), ktorá sa zvyčajne nachádza v súbore Windows \ System \ MSXML.DLL.

Po kliknutí na tlačidlo Create Unit sa vytvorí modul rozhrania MSXML_TLB, ktorý nám umožní využívať XML DOM objekty: DOMDocument, XMLDocument, XMLHTTPRequest a množstvo ďalších, implementovaných v knižnici MSXML.DLL. Odkaz na modul MSXML_TLB musí byť v zozname Použitie.

XML DOM zariadenie

Objektový model dokumentu predstavuje XML dokument v stromovej štruktúre vetiev. XML DOM API umožňujú aplikáciám prechádzať stromom dokumentov a manipulovať s jeho vetvami. Každá vetva môže mať špecifický typ (DOMNodeType), podľa ktorého sa určuje nadradená a dcérska vetva. Väčšina dokumentov XML obsahuje vetvy typu element, atribút a text. Atribúty sú špeciálnym druhom vetvy a nie sú podriadenými vetvami. Ak chcete spravovať atribúty, použite špeciálne metódy poskytované objektmi XML DOM.

Okrem implementácie rozhraní odporúčaných konzorciom World Wide Web Consortium (W3C), Microsoft XML DOM obsahuje metódy, ktoré podporujú XSL, XSL vzory, priestory názvov a dátové typy. Napríklad metóda SelectNodes vám umožňuje použiť syntax vzoru XSL na nájdenie vetiev v špecifickom kontexte a metóda TransformNode podporuje použitie XSL na vykonávanie transformácií.

Test XML dokumentu

Ako príklad dokumentu XML si vezmime adresár hudobného disku CD-ROM, ktorý má nasledujúcu štruktúru:

Empírová burleska Bob Dylan USA Columbia 10.90 1985 Skry svoje srdce Bonnie tylor UK CBS Records 9.90 1988 ... Odpútaj moje srdce Joe koker USA EMI 8.20 1987

Teraz sme pripravení začať skúmať objektový model XML DOM, počnúc objektom XMLDOMDocument.

Dokument XML - Objekt XMLDOMDocument

Práca s dokumentom XML začína jeho načítaním. Používame na to metódu Load, ktorá má len jeden parameter, ktorý určuje URL načítaného dokumentu. Pri načítavaní súborov z lokálneho disku sa zadáva iba úplný názov súboru (súbor: /// protokol možno v tomto prípade vynechať). Ak je dokument XML uložený ako reťazec, na načítanie dokumentu použite metódu LoadXML.

Vlastnosť Async sa používa na ovládanie spôsobu načítania dokumentu (synchrónne alebo asynchrónne). V predvolenom nastavení je táto vlastnosť nastavená na hodnotu True, čo znamená, že dokument sa načíta asynchrónne a riadenie sa vráti do aplikácie pred úplným načítaním dokumentu. V opačnom prípade sa dokument načíta synchrónne a potom musíte skontrolovať hodnotu vlastnosti ReadyState, aby ste zistili, či sa dokument načítal alebo nie. Môžete tiež vytvoriť obsluhu udalosti pre udalosť OnReadyStateChange, ktorá prevezme kontrolu, keď sa zmení hodnota vlastnosti ReadyState.

Nasledujúci text ukazuje, ako načítať dokument XML pomocou metódy Load:

Používa ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // // Tu je kód, ktorý manipuluje // s XML dokumentom a jeho vetvami // XMLDoc: = Nil; koniec;

Po načítaní dokumentu máme prístup k jeho vlastnostiam. Takže vlastnosť NodeName bude obsahovať hodnotu #document, vlastnosť NodeTypeString bude obsahovať hodnotu dokumentu a vlastnosť URL bude obsahovať súbor: /// C: /DATA/DATA.xml value.

Spracovanie chýb

Obzvlášť zaujímavé sú vlastnosti súvisiace so spracovaním dokumentov pri načítaní. Napríklad vlastnosť ParseError vracia objekt XMLDOMParseError obsahujúci informácie o chybe, ktorá sa vyskytla počas spracovania dokumentu.

Ak chcete napísať obslužný program chýb, môžete pridať nasledujúci kód:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); XMLError: = XMLDoc.ParseError; Ak XMLError.ErrorCode<>0 Potom // // Tu riešime chybu // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = nula;

Ak chcete zistiť, aké informácie sa vrátia v prípade chyby, zmeňte nasledujúcu položku v adresári:

Empírová burleska Bob Dylan USA Columbia 10.90 1985

odstránenie uzatváracieho prvku na druhom riadku:</p><p> <CD> <TITLE>Empírová burleska <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Teraz napíšme nejaký kód, ktorý vráti hodnoty vlastností objektu XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Ak XMLError.ErrorCode<>0 Potom s chybou XMLError, Memo1.Lines začne Add (‚Súbor:‘ + URL); Pridať (‚Kód:‘ + IntToStr (Kód chyby)); Pridať („Chyba:“ + Dôvod); Pridať (‚Text:‘ + SrcText); Pridať („Riadok:“ + IntToStr (Riadok)); Pridať (‚Pozícia:‘ + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Koniec;</p><p>a spustite našu aplikáciu. V dôsledku toho získame nasledujúce informácie o chybe.</p> <p>Ako môžete vidieť z vyššie uvedeného príkladu, informácie vrátené objektom XMLDOMParseError sú dostatočné na lokalizáciu chyby a pochopenie príčiny jej výskytu.</p> <p>Teraz obnovíme uzatvárací prvok <TITLE>v našom dokumente a pokračujte v diskusii o XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Prístup k stromu dokumentov</h2> <p>Ak chcete získať prístup k stromu dokumentov, môžete buď získať koreňový prvok a potom iterovať jeho dcérske vetvy, alebo nájsť konkrétnu vetvu. V prvom prípade dostaneme koreňový element cez vlastnosť DocumentElement, ktorá vráti objekt typu XMLDOMNode. Tu je návod, ako použiť vlastnosť DocumentElement na získanie obsahu každého podradeného prvku:</p><p>Var Node: IXMLDOMNode; Koreň: IXMLDOMElement; I: celé číslo; ... Koreň: = XMLDoc.DocumentElement; Pre I: = 0 do Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Koniec;</p><p>Pre náš XML dokument dostaneme nasledujúci text.</p> <p>Ak nás zaujíma konkrétna vetva alebo vetva pod prvou dcérskou vetvou, môžeme použiť buď metódu NodeFromID alebo metódu GetElementByTagName objektu XMLDOMDocument.</p> <p>Metóda NodeFromID vyžaduje jedinečný identifikátor definovaný v schéme XML alebo definícii typu dokumentu (DTD) a vracia vetvu s týmto identifikátorom.</p> <p>Metóda GetElementByTagName vyžaduje reťazec so špecifickým prvkom (značkou) a vracia všetky vetvy s týmto prvkom. Tu je návod, ako použiť túto metódu na nájdenie všetkých umelcov v našom adresári CD-ROM:</p><p>Uzly: IXMLDOMNodeList; Uzol: IXMLDOMNode; ... Uzly: = XMLDoc.GetElementsByTagName („ARTIST“); Pre I: = 0 až Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Koniec;</p><p>Pre náš XML dokument dostaneme nasledujúci text</p> <p>Všimnite si, že metóda SelectNodes objektu XMLDOMNode poskytuje flexibilnejší spôsob prístupu k vetvám dokumentu. Ale o tom viac nižšie.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Vetva dokumentu - Objekt XMLDOMNode</h2> <p>Objekt XMLDOMNode predstavuje vetvu dokumentu. S týmto objektom sme sa už stretli, keď sme dostali koreňový prvok dokumentu:</p><p>Koreň: = XMLDoc.DocumentElement;</p><p>Ak chcete získať informácie o vetve dokumentu XML, môžete použiť vlastnosti objektu XMLDOMNode (tabuľka 1).</p> <p>Na prístup k údajom uloženým vo vetve je bežné použiť buď vlastnosť NodeValue (dostupná pre atribúty, textové vetvy, komentáre, pokyny na spracovanie a sekcie CDATA), alebo vlastnosť Text, ktorá vráti textový obsah vetvy, resp. vlastnosť NodeTypedValue. Ten však možno použiť len pre pobočky s napísanými položkami.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigácia v strome dokumentov</h3> <p>Objekt XMLDOMNode poskytuje mnoho spôsobov navigácie v strome dokumentov. Napríklad na prístup k nadradenej vetve použite vlastnosť ParentNode (typ XMLDOMNode), pristupujte k podriadeným vetvám prostredníctvom vlastností ChildNodes (typ XMLDOMNodeList), FirstChild a LastChild (typ XMLDOMNode) atď. Vlastnosť OwnerDocument vracia objekt XMLDOMDocument, ktorý identifikuje samotný dokument XML. Vlastnosti uvedené vyššie uľahčujú navigáciu v strome dokumentov.</p> <p>Teraz si prejdeme všetky vetvy dokumentu XML:</p><p>Koreň: = XMLDoc.DocumentElement; Pre I: = 0 do Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); Koniec;</p><p>Ako je uvedené vyššie, SelectNodes objektu XMLDOMNode poskytuje flexibilnejší spôsob prístupu k vetvám dokumentu. Okrem toho existuje metóda SelectSingleNode, ktorá vracia iba prvú vetvu dokumentu. Obe tieto metódy vám umožňujú definovať šablóny XSL pre vyhľadávanie pobočiek.</p> <p>Pozrime sa na proces použitia metódy SelectNodes na načítanie všetkých vetiev, ktoré majú vetvu CD a podvetvu PRICE:</p><p>Koreň: = XMLDoc.DocumentElement; Uzly: = Root.SelectNodes (‚CD / CENA‘);</p><p>Všetky PRICE podvetvy vetvy CD budú umiestnené v kolekcii Nodes. K diskusii o šablónach XSL sa vrátime o niečo neskôr.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulácia s detskými ratolesťami</h3> <p>Na manipuláciu s podriadenými vetvami môžeme použiť metódy objektu XMLDOMNode (tabuľka 2).</p> <p>Ak chcete úplne odstrániť záznam o prvom disku, musíte spustiť nasledujúci kód:</p><p>Var XMLDoc: IXMLDOMDocument; Koreň: IXMLDOMNode; Uzol: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získanie koreňového prvku Root: = XMLDoc.DocumentElement; Uzol: = Koreň; // Odstránenie prvej dcérskej vetvy Node.RemoveChild (Node.FirstChild);</p><p>Všimnite si, že v tomto príklade odstraňujeme prvú dcérsku vetvu. Ako odstrániť prvý prvok prvej dcérskej vetvy je znázornené nižšie:</p><p>Var XMLDoc: IXMLDOMDocument; Koreň: IXMLDOMNode; Uzol: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získanie koreňového prvku Root: = XMLDoc.DocumentElement; // a prvá dcérska vetva Node: = Root.FirstChild; // Odstránenie prvej dcérskej vetvy Node.RemoveChild (Node.FirstChild);</p><p>Vo vyššie uvedenom príklade sme neodstránili prvú vetvu <CD>…</CD> a prvým prvkom vetvy je <TITLE>….

Teraz pridajte novú vetvu. Nižšie je uvedený kód, ktorý ukazuje, ako pridať nový hudobný disk CD-ROM:

Var NewNode: IXMLDOMNode; Dieťa: IXMLDOMNode; ... // Vytvorenie novej pobočky - NewNode: = XMLDoc.CreateNode (1, ‘CD’, ‘’); // Pridanie prvku Child: = XMLDoc.CreateNode (1, 'TITLE', ''); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘Pink Floyd’; // Pridanie prvku <ARTIST>Child: = XMLDoc.CreateNode (1, ‘ARTIST’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘Division Bell’; // Pridanie prvku <COUNTRY>Child: = XMLDoc.CreateNode (1, ‘KRAJINA’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘UK’; // Pridanie prvku <COMPANY>Dieťa: = XMLDoc.CreateNode (1, ‚SPOLOČNOSŤ‘, ‚‘); // Pridanie prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘EMI Records Ltd.’; // Pridanie prvku <PRICE>Child: = XMLDoc.CreateNode (1, ‘PRICE’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = '11 .99 "; // Pridajte prvok <YEAR>Child: = XMLDoc.CreateNode (1, ‘YEAR’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘1994’; // A pridáme vetvu Root.AppendChild (NewNode); ...</p><p>Vyššie uvedený kód zobrazuje nasledujúce kroky na pridanie novej pobočky:</p> <ul><li>Vytvorenie novej vetvy pomocou metódy CreateNode: <ul><li>vytvorenie prvku pomocou metódy CreateNode;</li> <li>pridanie prvku do vetvy pomocou metódy AppendChild;</li> <li>nastavenie hodnoty prvku prostredníctvom vlastnosti Text;</li> <li>… Opakujte pre všetky prvky.</li> </ul></li> <li>Pridanie novej vetvy do dokumentu pomocou metódy AppendChild.</li> </ul><p>Pripomeňme, že metóda AppendChild pridáva vetvu na koniec stromu. Ak chcete pridať vetvu na konkrétne miesto v strome, musíte použiť metódu InsertBefore.</p> <h2>Množina vetiev - objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList obsahuje zoznam vetiev, ktoré možno zostaviť pomocou metód SelectNodes alebo GetElementsByTagName a tiež získať z vlastnosti ChildNodes.</p> <p>O použití tohto objektu sme už hovorili v príklade uvedenom v časti „Navigácia v strome dokumentov“. Tu je niekoľko teoretických komentárov.</p> <p>Počet vetiev v zozname je možné získať ako hodnotu vlastnosti Dĺžka. Vetvy sú indexované od 0 do Dĺžka-1 a každá jednotlivá vetva je prístupná prostredníctvom zodpovedajúcej indexovanej položky v poli Item.</p> <p>Navigáciu v zozname pobočiek je možné vykonať aj pomocou metódy NextNode, ktorá vráti ďalšiu vetvu v zozname alebo Nil, ak je aktuálna vetva posledná. Ak sa chcete vrátiť na začiatok zoznamu, zavolajte metódu Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Vytvárajte a ukladajte dokumenty</h2> <p>Popísali sme teda, ako môžete pridať vetvy a prvky do existujúcich dokumentov XML. Teraz vytvoríme dokument XML za behu. V prvom rade nezabudnite, že dokument je možné načítať nielen z adresy URL, ale aj z bežného reťazca. Tu je návod, ako vytvoriť koreňový prvok, ktorý potom možno použiť na dynamické zostavenie zvyšku prvkov (ktorým sme sa už venovali v časti Manipulácia s podriadenými vetvami):</p><p>Var XMLDoc: IXMLDOMDocument; Koreň: IXMLDOMNode; Uzol: IXMLDOMNode; S: WideString; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Koreň: = XMLDoc.DocumentElement; Uzol: = XMLDoc.CreateNode (1, ‚CD‘, ‚‘); Root.AppendChild (Node); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = nula;</p><p>Po vytvorení dokumentu XML ho uložte do súboru pomocou metódy Uložiť. Napríklad:</p> <p>XMLDoc.Save (‚C: \ DATA \ NEWCD.XML‘);</p> <p>Okrem uloženia do súboru vám metóda Save umožňuje uložiť XML dokument do nového objektu XMLDOMDocument. V tomto prípade je dokument úplne spracovaný a v dôsledku toho sa kontroluje jeho štruktúra a syntax. Tu je postup, ako uložiť dokument do iného objektu:</p><p>Procedure TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = nula; koniec;</p><p>Na záver, metóda Save vám tiež umožňuje uložiť dokument XML do iných objektov COM, ktoré podporujú rozhrania IStream, IPersistStream alebo IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Používanie šablón XSL</h2> <p>Pri diskusii o metóde SelectNodes objektu XMLDOMNode sme spomenuli, že poskytuje flexibilnejší spôsob prístupu k vetvám dokumentu. Flexibilita spočíva v tom, že ako kritérium na výber vetiev môžete zadať šablónu XSL. Takéto šablóny poskytujú výkonný mechanizmus na vyhľadávanie informácií v dokumentoch XML. Ak chcete napríklad získať zoznam všetkých titulov hudobných CD-ROM v našom adresári, môžete spustiť nasledujúci dotaz:</p><p>Ak chcete zistiť, ktoré disky umelcov sú vydané v Spojených štátoch, žiadosť je vytvorená takto:</p><p>Uzly: = Root.SelectNodes (‚CD / ARTIST‘);</p><p>Tu je návod, ako nájsť prvú jednotku v adresári:</p><p>Uzly: = Root.SelectNodes (‚CD / TITLE‘);</p><p>A naposledy:</p><p>Uzly: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Ak chcete nájsť disky Boba Dylana, môžete spustiť nasledujúci dotaz:</p><p>Uzly: = Root.SelectNodes (‘CD [$ ľubovoľný $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>a na získanie zoznamu diskov vyrobených po roku 1985 spustíme nasledujúci dotaz:</p><p>Uzly: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Podrobnejšia diskusia o syntaxi XSL si vyžaduje samostatnú publikáciu. Aby som čitateľov zaujal a podporil ďalší výskum, uvediem len jeden malý príklad možného použitia XSL. Povedzme, že potrebujeme previesť náš adresár na bežnú HTML tabuľku. Pomocou tradičných metód musíme iterovať cez všetky vetvy stromu a pre každý prijatý prvok vytvoriť zodpovedajúce značky <TD>…</TD>.</p> <p>Pomocou XSL jednoducho vytvoríme šablónu (alebo šablónu so štýlmi), ktorá špecifikuje, čo a ako transformovať. Potom túto šablónu prekryjeme v našom katalógu – a máme hotovo: toto je text šablóny XSL, ktorý premení katalóg na tabuľku (Výpis 2).</p> <p>Kód na prekrytie šablóny XSL v našom adresári vyzerá takto:</p><p>Procedure TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; begin XSLDoc: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = nula; koniec;</p><p>Na záver našej diskusie o XSL treba povedať, že v súčasnosti sa tento jazyk aktívne používa na transformáciu medzi rôznymi dokumentmi XML, ako aj na formátovanie dokumentov.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Záver</h2> <p>Z pochopiteľných dôvodov nie je možné pokryť všetky objekty Microsoft XML DOM a uviesť príklady ich použitia v jednom článku. Tu sme sa práve dotkli základných problémov používania XML DOM v aplikáciách. Tabuľka 3 zobrazuje všetky objekty implementované v Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>XML sa čoraz viac používa na ukladanie informácií a ich výmenu medzi aplikáciami a webovými stránkami. Mnoho aplikácií používa tento jazyk ako základný jazyk na ukladanie údajov, zatiaľ čo iné ho používajú na export a import údajov XML. Je teda čas, aby sa vývojári zamysleli nad tým, ako môžu byť údaje XML použité v ich vlastných aplikáciách.</p> <p>V tomto článku sa pozrieme na XML Document Object Model (DOM) a implementáciu XML DOM od spoločnosti Microsoft.</p> <p>XML DOM je objektový model, ktorý poskytuje vývojárom objekty na načítanie a spracovanie súborov XML. Objektový model pozostáva z nasledujúcich základných objektov: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap a XMLDOMParseError. Každý z týchto objektov (okrem XMLDOMParseError) obsahuje vlastnosti a metódy, ktoré vám umožňujú získať informácie o objekte, manipulovať s hodnotami a štruktúrou objektu a navigovať v štruktúre dokumentu XML.</p> <p>Pozrime sa na hlavné objekty XML DOM a ukážeme si niekoľko príkladov ich použitia v Borland Delphi.</p> <h2>Použitie XML DOM v Borland Delphi</h2> <p>Aby ste mohli používať Microsoft XML DOM v aplikáciách Delphi, musíte k projektu pripojiť príslušnú knižnicu typov. Za týmto účelom spustíme príkaz Projekt | Importovať knižnicu typov a v dialógovom okne Importovať knižnicu typov vyberte knižnicu Microsoft XML verzie 2.0 (verzia 2.0), ktorá sa zvyčajne nachádza v súbore Windows \ System \ MSXML.DLL.</p> <p>Po kliknutí na tlačidlo Create Unit sa vytvorí modul rozhrania MSXML_TLB, ktorý nám umožní využívať XML DOM objekty: DOMDocument, XMLDocument, XMLHTTPRequest a množstvo ďalších, implementovaných v knižnici MSXML.DLL. Odkaz na modul MSXML_TLB musí byť v zozname Použitie.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML DOM zariadenie</h2> <p>Objektový model dokumentu predstavuje XML dokument v stromovej štruktúre vetiev. XML DOM API umožňujú aplikáciám prechádzať stromom dokumentov a manipulovať s jeho vetvami. Každá vetva môže mať špecifický typ (DOMNodeType), podľa ktorého sa určuje nadradená a dcérska vetva. Väčšina dokumentov XML obsahuje vetvy typu element, atribút a text. Atribúty sú špeciálnym druhom vetvy a nie sú podriadenými vetvami. Na manipuláciu s atribútmi sa používajú špeciálne metódy poskytované objektmi XML DOM.</p> <p>Okrem implementácie rozhraní odporúčaných konzorciom World Wide Web Consortium (W3C), Microsoft XML DOM obsahuje metódy, ktoré podporujú XSL, XSL vzory, priestory názvov a dátové typy. Napríklad metóda SelectNodes vám umožňuje použiť syntax vzoru XSL na nájdenie vetiev v špecifickom kontexte a metóda TransformNode podporuje použitie XSL na vykonávanie transformácií.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Test XML dokumentu</h2> <p>Ako príklad dokumentu XML si vezmime adresár hudobného disku CD-ROM, ktorý má nasledujúcu štruktúru:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Empírová burleska Bob Dylan USA Columbia 10.90 1985 Skry svoje srdce Bonnie tylor UK CBS Records 9.90 1988 ... Odpútaj moje srdce Joe koker USA EMI 8.20 1987

Teraz sme pripravení začať skúmať objektový model XML DOM, počnúc objektom XMLDOMDocument.

Dokument XML - Objekt XMLDOMDocument

Práca s dokumentom XML začína jeho načítaním. Používame na to metódu Load, ktorá má len jeden parameter, ktorý určuje URL načítaného dokumentu. Pri načítavaní súborov z lokálneho disku sa zadáva iba úplný názov súboru (súbor: /// protokol možno v tomto prípade vynechať). Ak je dokument XML uložený ako reťazec, na načítanie dokumentu použite metódu LoadXML.

Vlastnosť Async sa používa na ovládanie spôsobu načítania dokumentu (synchrónne alebo asynchrónne). V predvolenom nastavení je táto vlastnosť nastavená na hodnotu True, čo znamená, že dokument sa načíta asynchrónne a riadenie sa vráti do aplikácie pred úplným načítaním dokumentu. V opačnom prípade sa dokument načíta synchrónne a potom musíte skontrolovať hodnotu vlastnosti ReadyState, aby ste zistili, či sa dokument načítal alebo nie. Môžete tiež vytvoriť obsluhu udalosti pre udalosť OnReadyStateChange, ktorá prevezme kontrolu, keď sa zmení hodnota vlastnosti ReadyState.

Nasledujúci text ukazuje, ako načítať dokument XML pomocou metódy Load:

Používa ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // // Tu je kód, ktorý manipuluje // s XML dokumentom a jeho vetvami // XMLDoc: = Nil; koniec;

Po načítaní dokumentu máme prístup k jeho vlastnostiam. Takže vlastnosť NodeName bude obsahovať hodnotu #document, vlastnosť NodeTypeString bude obsahovať hodnotu dokumentu a vlastnosť URL bude obsahovať súbor: /// C: /DATA/DATA.xml value.

Spracovanie chýb

Obzvlášť zaujímavé sú vlastnosti súvisiace so spracovaním dokumentov pri načítaní. Napríklad vlastnosť ParseError vracia objekt XMLDOMParseError obsahujúci informácie o chybe, ktorá sa vyskytla počas spracovania dokumentu.

Ak chcete napísať obslužný program chýb, môžete pridať nasledujúci kód:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); XMLError: = XMLDoc.ParseError; Ak XMLError.ErrorCode<>0 Potom // // Tu riešime chybu // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = nula;

Ak chcete zistiť, aké informácie sa vrátia v prípade chyby, zmeňte nasledujúcu položku v adresári:

Empírová burleska Bob Dylan USA Columbia 10.90 1985

odstránenie uzatváracieho prvku na druhom riadku:</p><p> <CD> <TITLE>Empírová burleska <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Teraz napíšme nejaký kód, ktorý vráti hodnoty vlastností objektu XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Ak XMLError.ErrorCode<>0 Potom s chybou XMLError, Memo1.Lines začne Add (‚Súbor:‘ + URL); Pridať (‚Kód:‘ + IntToStr (Kód chyby)); Pridať („Chyba:“ + Dôvod); Pridať (‚Text:‘ + SrcText); Pridať („Riadok:“ + IntToStr (Riadok)); Pridať (‚Pozícia:‘ + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Koniec;</p><p>a spustite našu aplikáciu. V dôsledku toho získame nasledujúce informácie o chybe.</p> <p>Ako môžete vidieť z vyššie uvedeného príkladu, informácie vrátené objektom XMLDOMParseError sú dostatočné na lokalizáciu chyby a pochopenie príčiny jej výskytu.</p> <p>Teraz obnovíme uzatvárací prvok <TITLE>v našom dokumente a pokračujte v diskusii o XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Prístup k stromu dokumentov</h2> <p>Ak chcete získať prístup k stromu dokumentov, môžete buď získať koreňový prvok a potom iterovať jeho dcérske vetvy, alebo nájsť konkrétnu vetvu. V prvom prípade dostaneme koreňový element cez vlastnosť DocumentElement, ktorá vráti objekt typu XMLDOMNode. Tu je návod, ako použiť vlastnosť DocumentElement na získanie obsahu každého podradeného prvku:</p><p>Var Node: IXMLDOMNode; Koreň: IXMLDOMElement; I: celé číslo; ... Koreň: = XMLDoc.DocumentElement; Pre I: = 0 do Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Koniec;</p><p>Pre náš XML dokument dostaneme nasledujúci text.</p> <p>Ak nás zaujíma konkrétna vetva alebo vetva pod prvou dcérskou vetvou, môžeme použiť buď metódu NodeFromID alebo metódu GetElementByTagName objektu XMLDOMDocument.</p> <p>Metóda NodeFromID vyžaduje jedinečný identifikátor definovaný v schéme XML alebo definícii typu dokumentu (DTD) a vracia vetvu s týmto identifikátorom.</p> <p>Metóda GetElementByTagName vyžaduje reťazec so špecifickým prvkom (značkou) a vracia všetky vetvy s týmto prvkom. Tu je návod, ako použiť túto metódu na nájdenie všetkých umelcov v našom adresári CD-ROM:</p><p>Uzly: IXMLDOMNodeList; Uzol: IXMLDOMNode; ... Uzly: = XMLDoc.GetElementsByTagName („ARTIST“); Pre I: = 0 až Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Koniec;</p><p>Pre náš XML dokument dostaneme nasledujúci text</p> <p>Všimnite si, že metóda SelectNodes objektu XMLDOMNode poskytuje flexibilnejší spôsob prístupu k vetvám dokumentu. Ale o tom viac nižšie.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Vetva dokumentu - Objekt XMLDOMNode</h2> <p>Objekt XMLDOMNode predstavuje vetvu dokumentu. S týmto objektom sme sa už stretli, keď sme dostali koreňový prvok dokumentu:</p><p>Koreň: = XMLDoc.DocumentElement;</p><p>Ak chcete získať informácie o vetve dokumentu XML, môžete použiť vlastnosti objektu XMLDOMNode (tabuľka 1).</p> <p>Na prístup k údajom uloženým vo vetve je bežné použiť buď vlastnosť NodeValue (dostupná pre atribúty, textové vetvy, komentáre, pokyny na spracovanie a sekcie CDATA), alebo vlastnosť Text, ktorá vráti textový obsah vetvy, resp. vlastnosť NodeTypedValue. Ten však možno použiť len pre pobočky s napísanými položkami.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigácia v strome dokumentov</h3> <p>Objekt XMLDOMNode poskytuje mnoho spôsobov navigácie v strome dokumentov. Napríklad na prístup k nadradenej vetve použite vlastnosť ParentNode (typ XMLDOMNode), pristupujte k podriadeným vetvám prostredníctvom vlastností ChildNodes (typ XMLDOMNodeList), FirstChild a LastChild (typ XMLDOMNode) atď. Vlastnosť OwnerDocument vracia objekt XMLDOMDocument, ktorý identifikuje samotný dokument XML. Vlastnosti uvedené vyššie uľahčujú navigáciu v strome dokumentov.</p> <p>Teraz si prejdeme všetky vetvy dokumentu XML:</p><p>Koreň: = XMLDoc.DocumentElement; Pre I: = 0 do Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); Koniec;</p><p>Ako je uvedené vyššie, SelectNodes objektu XMLDOMNode poskytuje flexibilnejší spôsob prístupu k vetvám dokumentu. Okrem toho existuje metóda SelectSingleNode, ktorá vracia iba prvú vetvu dokumentu. Obe tieto metódy vám umožňujú definovať šablóny XSL pre vyhľadávanie pobočiek.</p> <p>Pozrime sa na proces použitia metódy SelectNodes na načítanie všetkých vetiev, ktoré majú vetvu CD a podvetvu PRICE:</p><p>Koreň: = XMLDoc.DocumentElement; Uzly: = Root.SelectNodes (‚CD / CENA‘);</p><p>Všetky PRICE podvetvy vetvy CD budú umiestnené v kolekcii Nodes. K diskusii o šablónach XSL sa vrátime o niečo neskôr.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulácia s detskými ratolesťami</h3> <p>Na manipuláciu s podriadenými vetvami môžeme použiť metódy objektu XMLDOMNode (tabuľka 2).</p> <p>Ak chcete úplne odstrániť záznam o prvom disku, musíte spustiť nasledujúci kód:</p><p>Var XMLDoc: IXMLDOMDocument; Koreň: IXMLDOMNode; Uzol: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získanie koreňového prvku Root: = XMLDoc.DocumentElement; Uzol: = Koreň; // Odstránenie prvej dcérskej vetvy Node.RemoveChild (Node.FirstChild);</p><p>Všimnite si, že v tomto príklade odstraňujeme prvú dcérsku vetvu. Ako odstrániť prvý prvok prvej dcérskej vetvy je znázornené nižšie:</p><p>Var XMLDoc: IXMLDOMDocument; Koreň: IXMLDOMNode; Uzol: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získanie koreňového prvku Root: = XMLDoc.DocumentElement; // a prvá dcérska vetva Node: = Root.FirstChild; // Odstránenie prvej dcérskej vetvy Node.RemoveChild (Node.FirstChild);</p><p>Vo vyššie uvedenom príklade sme neodstránili prvú vetvu <CD>…</CD> a prvým prvkom vetvy je <TITLE>….

Teraz pridajte novú vetvu. Nižšie je uvedený kód, ktorý ukazuje, ako pridať nový hudobný disk CD-ROM:

Var NewNode: IXMLDOMNode; Dieťa: IXMLDOMNode; ... // Vytvorenie novej pobočky - NewNode: = XMLDoc.CreateNode (1, ‘CD’, ‘’); // Pridanie prvku Child: = XMLDoc.CreateNode (1, 'TITLE', ''); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘Pink Floyd’; // Pridanie prvku <ARTIST>Child: = XMLDoc.CreateNode (1, ‘ARTIST’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘Division Bell’; // Pridanie prvku <COUNTRY>Child: = XMLDoc.CreateNode (1, ‘KRAJINA’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘UK’; // Pridanie prvku <COMPANY>Dieťa: = XMLDoc.CreateNode (1, ‚SPOLOČNOSŤ‘, ‚‘); // Pridanie prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘EMI Records Ltd.’; // Pridanie prvku <PRICE>Child: = XMLDoc.CreateNode (1, ‘PRICE’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = '11 .99 "; // Pridajte prvok <YEAR>Child: = XMLDoc.CreateNode (1, ‘YEAR’, ‘’); // Pridanie prvku NewNode.AppendChild (Child); // A nastavíme jeho hodnotu Child.Text: = ‘1994’; // A pridáme vetvu Root.AppendChild (NewNode); ...</p><p>Vyššie uvedený kód zobrazuje nasledujúce kroky na pridanie novej pobočky:</p> <ul><li>Vytvorenie novej vetvy pomocou metódy CreateNode: <ul><li>vytvorenie prvku pomocou metódy CreateNode;</li> <li>pridanie prvku do vetvy pomocou metódy AppendChild;</li> <li>nastavenie hodnoty prvku prostredníctvom vlastnosti Text;</li> <li>… Opakujte pre všetky prvky.</li> </ul></li> <li>Pridanie novej vetvy do dokumentu pomocou metódy AppendChild.</li> </ul><p>Pripomeňme, že metóda AppendChild pridáva vetvu na koniec stromu. Ak chcete pridať vetvu na konkrétne miesto v strome, musíte použiť metódu InsertBefore.</p> <h2>Množina vetiev - objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList obsahuje zoznam vetiev, ktoré možno zostaviť pomocou metód SelectNodes alebo GetElementsByTagName a tiež získať z vlastnosti ChildNodes.</p> <p>O použití tohto objektu sme už hovorili v príklade uvedenom v časti „Navigácia v strome dokumentov“. Tu je niekoľko teoretických komentárov.</p> <p>Počet vetiev v zozname je možné získať ako hodnotu vlastnosti Dĺžka. Vetvy sú indexované od 0 do Dĺžka-1 a každá jednotlivá vetva je prístupná prostredníctvom zodpovedajúcej indexovanej položky v poli Item.</p> <p>Navigáciu v zozname pobočiek je možné vykonať aj pomocou metódy NextNode, ktorá vráti ďalšiu vetvu v zozname alebo Nil, ak je aktuálna vetva posledná. Ak sa chcete vrátiť na začiatok zoznamu, zavolajte metódu Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Vytvárajte a ukladajte dokumenty</h2> <p>Popísali sme teda, ako môžete pridať vetvy a prvky do existujúcich dokumentov XML. Teraz vytvoríme dokument XML za behu. V prvom rade nezabudnite, že dokument je možné načítať nielen z adresy URL, ale aj z bežného reťazca. Tu je návod, ako vytvoriť koreňový prvok, ktorý potom možno použiť na dynamické zostavenie zvyšku prvkov (ktorým sme sa už venovali v časti Manipulácia s podriadenými vetvami):</p><p>Var XMLDoc: IXMLDOMDocument; Koreň: IXMLDOMNode; Uzol: IXMLDOMNode; S: WideString; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Koreň: = XMLDoc.DocumentElement; Uzol: = XMLDoc.CreateNode (1, ‚CD‘, ‚‘); Root.AppendChild (Node); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = nula;</p><p>Po vytvorení dokumentu XML ho uložte do súboru pomocou metódy Uložiť. Napríklad:</p> <p>XMLDoc.Save (‚C: \ DATA \ NEWCD.XML‘);</p> <p>Okrem uloženia do súboru vám metóda Save umožňuje uložiť XML dokument do nového objektu XMLDOMDocument. V tomto prípade je dokument úplne spracovaný a v dôsledku toho sa kontroluje jeho štruktúra a syntax. Tu je postup, ako uložiť dokument do iného objektu:</p><p>Procedure TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = nula; koniec;</p><p>Na záver, metóda Save vám tiež umožňuje uložiť dokument XML do iných objektov COM, ktoré podporujú rozhrania IStream, IPersistStream alebo IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Používanie šablón XSL</h2> <p>Pri diskusii o metóde SelectNodes objektu XMLDOMNode sme spomenuli, že poskytuje flexibilnejší spôsob prístupu k vetvám dokumentu. Flexibilita spočíva v tom, že ako kritérium na výber vetiev môžete zadať šablónu XSL. Takéto šablóny poskytujú výkonný mechanizmus na vyhľadávanie informácií v dokumentoch XML. Ak chcete napríklad získať zoznam všetkých titulov hudobných CD-ROM v našom adresári, môžete spustiť nasledujúci dotaz:</p><p>Ak chcete zistiť, ktoré disky umelcov sú vydané v Spojených štátoch, žiadosť je vytvorená takto:</p><p>Uzly: = Root.SelectNodes (‚CD / ARTIST‘);</p><p>Tu je návod, ako nájsť prvú jednotku v adresári:</p><p>Uzly: = Root.SelectNodes (‚CD / TITLE‘);</p><p>A naposledy:</p><p>Uzly: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Ak chcete nájsť disky Boba Dylana, môžete spustiť nasledujúci dotaz:</p><p>Uzly: = Root.SelectNodes (‘CD [$ ľubovoľný $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>a na získanie zoznamu diskov vyrobených po roku 1985 spustíme nasledujúci dotaz:</p><p>Uzly: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Podrobnejšia diskusia o syntaxi XSL si vyžaduje samostatnú publikáciu. Aby som čitateľov zaujal a podporil ďalší výskum, uvediem len jeden malý príklad možného použitia XSL. Povedzme, že potrebujeme previesť náš adresár na bežnú HTML tabuľku. Pomocou tradičných metód musíme iterovať cez všetky vetvy stromu a pre každý prijatý prvok vytvoriť zodpovedajúce značky <TD>…</TD>.</p> <p>Pomocou XSL jednoducho vytvoríme šablónu (alebo šablónu so štýlmi), ktorá špecifikuje, čo a ako transformovať. Potom túto šablónu prekryjeme v našom katalógu – a máme hotovo: toto je text šablóny XSL, ktorý premení katalóg na tabuľku (Výpis 2).</p> <p>Kód na prekrytie šablóny XSL v našom adresári vyzerá takto:</p><p>Procedure TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; begin XSLDoc: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = nula; koniec;</p><p>Na záver našej diskusie o XSL treba povedať, že v súčasnosti sa tento jazyk aktívne používa na transformáciu medzi rôznymi dokumentmi XML, ako aj na formátovanie dokumentov.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Záver</h2> <p>Z pochopiteľných dôvodov nie je možné pokryť všetky objekty Microsoft XML DOM a uviesť príklady ich použitia v jednom článku. Tu sme sa práve dotkli základných problémov používania XML DOM v aplikáciách. Tabuľka 3 zobrazuje všetky objekty implementované v Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>Vítam všetkých! Niekoľko rokov som písal v Matlabe a potom som bol netrpezlivý, aby som napísal program v Delphi.</p><p>Potrebujem sa naučiť pracovať s xml dokumentmi. Pracujem v RAD Stiduo XE3. Existuje komponent TXMLDocument, pravdepodobne známy mnohým programátorom Delphi. Zdá sa, že dokáže veľa. Problém je však v tom, že k nemu neexistuje jasná dokumentácia a popis. Pomoc v RAD Studio je svinstvo, pretože tam nie sú žiadne normálne informácie; len roztrúsené po stránkach chabej pomoci k niektorým metódam a postupom (žiadne príklady a normálny popis). Prehrabaný celým internetom. Našli len témy na fórach s riešením konkrétnych problémov, kde musíte ďalšiu hodinu hádať, čo robí ten či onen riadok pri prístupe k xml súboru. <br>Potrebujem aj manuál o hlavných funkciách, postupoch a metódach používaných pri práci s xml. Učebnica, manuál, popis. Alebo aspoň "xml v Delphi pre figuríny". Napríklad:</p><p><i>Ak chcete otvoriť súbor xml, použite metódu XMLDocument1.LoadFromFile ("filemane.xml"), kde názov súboru je názov súboru. <br>Premenná nodelist typu IXMLNode sa používa na uloženie zoznamu potomkov. Na definovanie tohto zoznamu sa používa metóda Xmldocument1.DocumentElement (kde XMLDocument1 je súbor xml, ktorý sa má preskúmať). <br>Ak chcete zistiť obsah podradeného prvku "element1", použite metódu XMLDocument1.DocumentElement.ChildNodes ["element1"]. Text .... <br></i><br>a v tomto duchu ďalej na všetky aplikované metódy, postupy, dátové typy. <br>Kde nájdem podobné návody/popisy? Kto môže pomôcť?</p><p>Ak potrebujete konkrétnu úlohu, popíšem ju. <br>Existuje xml dokument formulára:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>hore.jpg</assets><br> <images><br> <pano> <tiles>pano_u.jpg</tiles><br> <tiles>pano_f.jpg</tiles><br> </pano><br> <tour><br> <tourimages>start.jpg</tourimages><br> <tourimages>tmb.jpg</tourimages><br> </tour><br> </images><br></templateFiles><br><dimensions><br> <tiles type="pc">1910</tiles><br> <tiles type="ipad">768</tiles><br> <tiles side="iphone">512</tiles><br> <tourimages name="start.jpg" edge="long">1024</tourimages><br> <tourimages name="start.jpg" edge="short">768</tourimages><br></dimensions></p><p><hotspot name="hs015_2" style="mappoint" scena="scene017" ath="68.17644363437007" /><br><hotspot name="hs015_1" style="mappoint" scena="scene014" rz="4436007" /> <br><data name="onstart" mode="noVoice">Nejaký text</data><br><data name="onerror" mode="noVoice">Nejaký text chyby</data><br><data name="onerror" mode="alarm">Iný text chyby</data></p><p>V kóde programu máme:</p><p>var <br>...<br>rodič, dieťa1: IXMLNode;</p><p>začať <br>XMLDocument1.LoadFromFile ("f: \ názov_súboru.x ml"); <br>XMLDocument1.Active: = true; <br>.<br>.<br>koniec</p><p>Čo sa musíte naučiť robiť: <br>(vopred sa ospravedlňujem, ak nesprávne pomenujem súčasti xml dokumentu) <br>1. Získajte názov koreňového prvku (v našom prípade ltm), ako aj zoznam jeho atribútov (verzia, typ) a ich hodnôt ("1.0", "nastavenia"). <br>2. Získajte počet prvkov, ktoré sú potomkami koreňa. V tomto prípade je ich 7: templateFiles, dimensions, hotspot, hotspot, data, data, data. Získajte názvy prvkov (tagov) (templateFiles, rozmery atď.). Po získaní počtu prvkov a naučení sa, ako extrahovať ich mená, prejdem od 0 do počtu-1 a urobím, čo potrebujem. <br>3. Získajte číslo a zoznam atribútov požadovaného prvku. Napríklad pre prvok hotspot. Správna odpoveď by bola 4 atribúty. Pre prvý prvok hotspotu to budú názov, štýl, scéna, ath. Pre druhý - to isté, len namiesto atribútu ath - atribút rz. <br>Všimnite si, že v súbore sú 2 prvky aktívneho bodu s rôznymi atribútmi. Tu je návod, ako s nimi pracovať (ak existuje viac ako 1 prvok s rovnakým názvom)? <br>Chcem takto: dostanem zoznam detí podľa rel. ku koreňovému (pozri str. 2), spustite cez ne cyklus for a nájdite prvky hotspotu, v ktorých sa parameter name rovná požadovanému (povedzme "hs015_2" - jeden taký prvok určite bude). Je možné nejako vyriešiť tento problém bez slučky? To znamená, že chcete získať hodnotu atribútu scény pre prvok hotspot s názvom = "hs015_2"? <br>4. Vykonajte vyššie uvedené pre uzly a prvky, ktoré sú vo vzťahu k deťom deti. V mojom príklade je uzol (dieťa a rodič a. <br>Ak tomu dobre rozumiem, musíte nejako preniesť obsah uzla do <a href="https://obanracer.ru/sk/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">premenná typu</a> IXMLNode a urobte to isté ako v položkách 1-3. Takže?</p><p>5. Musíte sa naučiť, ako zmeniť vyššie uvedené parametre (nastaviť si vlastné).</p><p>Zdá sa to zatiaľ. V tejto fáze sú pre mňa najdôležitejšie syntaktické konštrukcie. <br>Kto vlastní túto tému, prosím napíšte iné syntaktické konštrukcie na vyriešenie vyššie uvedených problémov (ako získať atribúty, ich počet, počet prvkov, ich názvy atď.). Hlavná vec je teraz zvládnuť syntax a svoj algoritmus implementujem neskôr. Vopred veľmi pekne ďakujem!</p><p>P.S. Naozaj by som nechcel písať svoj vlastný XML parser od začiatku len preto, že neexistuje žiadny normálny popis pre existujúce.</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>Predchádzajúci článok</span><a href="https://obanracer.ru/sk/otkryt-faily-vcd-chem-otkryt-vcd-programmnye-obespecheniya.html">Otvorte súbory vcd. Ako otvoriť súbor vcd? Softvér na otváranie virtuálnych diskov CD</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>Ďalší článok</span><a href="https://obanracer.ru/sk/udalennoe-upravlenie-pk-cherez-internet-download-internet-podklyuchenie-k-udalennomu-rabochemu-stolu-fr.html">Stiahnite si Internetové pripojenie k vzdialenej ploche z oficiálneho centra sťahovania softvéru spoločnosti Microsoft</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/sk/author/iulia">Yuliya</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="#">PODOBNÉ ČLÁNKY</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/sk/otdalennyi-klient-kak-ustanovit-udalennyi-dostup-k-kompyuteru-tri-prostyh.html" rel="bookmark" title="Ako nastaviť vzdialený prístup k počítaču: tri jednoduché spôsoby"><img width="218" height="150" class="entry-thumb" src="/uploads/fb6c12a559d3a9ef4dcf97a9f291f8ab.jpg" alt="Ako nastaviť vzdialený prístup k počítaču: tri jednoduché spôsoby" title="Ako nastaviť vzdialený prístup k počítaču: tri jednoduché spôsoby"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/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/sk/otdalennyi-klient-kak-ustanovit-udalennyi-dostup-k-kompyuteru-tri-prostyh.html" rel="bookmark" title="Ako nastaviť vzdialený prístup k počítaču: tri jednoduché spôsoby">Ako nastaviť vzdialený prístup k počítaču: tri jednoduché spôsoby</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/sk/rasshirenie-dpr-chto-takoe-rasshirenie-faila-dpr-shag-za-shagom.html" rel="bookmark" title="Aká je prípona súboru DPR?"><img width="218" height="150" class="entry-thumb" src="/uploads/879ba5ebedfae9264ea50695d3e394de.jpg" alt="Aká je prípona súboru DPR?" title="Aká je prípona súboru DPR?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/category/graphics-card/" class="td-post-category">Video karty</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/rasshirenie-dpr-chto-takoe-rasshirenie-faila-dpr-shag-za-shagom.html" rel="bookmark" title="Aká je prípona súboru DPR?">Aká je prípona súboru DPR?</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/sk/fail-dpr-chem-otkryt-fail-dpr-shag-za-shagom.html" rel="bookmark" title="Dpr. Ako otvoriť súbor .DPR? Krok za krokom"><img width="218" height="150" class="entry-thumb" src="/uploads/879ba5ebedfae9264ea50695d3e394de.jpg" alt="Dpr. Ako otvoriť súbor .DPR? Krok za krokom" title="Dpr. Ako otvoriť súbor .DPR? Krok za krokom"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/category/security/" class="td-post-category">Bezpečnosť</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/fail-dpr-chem-otkryt-fail-dpr-shag-za-shagom.html" rel="bookmark" title="Dpr. Ako otvoriť súbor .DPR? Krok za krokom">Dpr. Ako otvoriť súbor .DPR? Krok za krokom</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/sk/polya-dannyh-v-faile-wpt-rasshirenie-faila-wpt-programmy-obsluzhivayushchie-fail.html" rel="bookmark" title="Dátové polia v súbore wpt. Prípona súboru WPT. Programy, ktoré podporujú súbor WPT"><img width="218" height="150" class="entry-thumb" src="/uploads/a58adcaff7e9ee0732c8270ef37631bf.jpg" alt="Dátové polia v súbore wpt. Prípona súboru WPT. Programy, ktoré podporujú súbor WPT" title="Dátové polia v súbore wpt. Prípona súboru WPT. Programy, ktoré podporujú súbor WPT"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/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/sk/polya-dannyh-v-faile-wpt-rasshirenie-faila-wpt-programmy-obsluzhivayushchie-fail.html" rel="bookmark" title="Dátové polia v súbore wpt. Prípona súboru WPT. Programy, ktoré podporujú súbor WPT">Dátové polia v súbore wpt. Prípona súboru WPT. Programy, ktoré podporujú súbor WPT</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/sk/chto-takoe-rasshirenie-faila-gui-chto-takoe-fail-gui-i-kak-otkryt.html" rel="bookmark" title="Čo je súbor gui a ako otvorím súbor gui?"><img width="218" height="150" class="entry-thumb" src="/uploads/f57d80f6d59147feb022f5198b8c5dfb.jpg" alt="Čo je súbor gui a ako otvorím súbor gui?" title="Čo je súbor gui a ako otvorím súbor gui?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/category/the-winchesters/" class="td-post-category">Winchesterovci</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/chto-takoe-rasshirenie-faila-gui-chto-takoe-fail-gui-i-kak-otkryt.html" rel="bookmark" title="Čo je súbor gui a ako otvorím súbor gui?">Čo je súbor gui a ako otvorím súbor gui?</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/sk/chto-takoe-rasshirenie-faila-ico-kak-sohranit-izobrazhenie-v-formate-ico-bystro-i.html" rel="bookmark" title="Ako rýchlo a jednoducho uložiť obrázok vo formáte ico?"><img width="218" height="150" class="entry-thumb" src="/uploads/9388f3a0967684f594c2a93c5c183161.jpg" alt="Ako rýchlo a jednoducho uložiť obrázok vo formáte ico?" title="Ako rýchlo a jednoducho uložiť obrázok vo formáte ico?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/category/ram/" class="td-post-category">RAM</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/chto-takoe-rasshirenie-faila-ico-kak-sohranit-izobrazhenie-v-formate-ico-bystro-i.html" rel="bookmark" title="Ako rýchlo a jednoducho uložiť obrázok vo formáte ico?">Ako rýchlo a jednoducho uložiť obrázok vo formáte ico?</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/sk/svezhie-kodeki-dlya-windows-7-x64-opisanie-k-lite-codec-pack.html" rel="bookmark" title="Popis balíka K-Lite Codec Pack"><img width="218" height="150" class="entry-thumb" src="/uploads/c89b3a161e376e4b900585592bc62f6b.jpg" alt="Popis balíka K-Lite Codec Pack" title="Popis balíka K-Lite Codec Pack"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/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/sk/svezhie-kodeki-dlya-windows-7-x64-opisanie-k-lite-codec-pack.html" rel="bookmark" title="Popis balíka K-Lite Codec Pack">Popis balíka K-Lite Codec Pack</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/sk/kak-zagruzit-kanaly-v-iptv-pleer-ustanovka-i-nastroika-iptv-player.html" rel="bookmark" title="Inštalácia a konfigurácia prehrávača IPTV – pohodlný spôsob sledovania televízie na počítači"><img width="218" height="150" class="entry-thumb" src="/uploads/6b7ca7093e3d0a076ffce9b9b69e69f1.jpg" alt="Inštalácia a konfigurácia prehrávača IPTV – pohodlný spôsob sledovania televízie na počítači" title="Inštalácia a konfigurácia prehrávača IPTV – pohodlný spôsob sledovania televízie na počítači"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/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/sk/kak-zagruzit-kanaly-v-iptv-pleer-ustanovka-i-nastroika-iptv-player.html" rel="bookmark" title="Inštalácia a konfigurácia prehrávača IPTV – pohodlný spôsob sledovania televízie na počítači">Inštalácia a konfigurácia prehrávača IPTV – pohodlný spôsob sledovania televízie na počítači</a></h3> </div> </div> </div> <div class="td-related-span4"> <div class="td_module_related_posts td-animation-stack td-meta-info-hide td_mod_related_posts"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/sk/chem-otkryt-jad-chto-takoe-rasshirenie-faila-jad-luchshie-brendy.html" rel="bookmark" title="Aká je prípona súboru JAD?"><img width="218" height="150" class="entry-thumb" src="/uploads/7f84809376947e86694b2e720c93c76f.jpg" alt="Aká je prípona súboru JAD?" title="Aká je prípona súboru JAD?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/category/motherboard/" class="td-post-category">základné dosky</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/chem-otkryt-jad-chto-takoe-rasshirenie-faila-jad-luchshie-brendy.html" rel="bookmark" title="Aká je prípona súboru JAD?">Aká je prípona súboru JAD?</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">Odporúčané</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/sk/chto-takoe-rasshirenie-faila-idc-chem-otkryt-fail-idc-kak-ispravit.html" rel="bookmark" title="Aká je prípona súboru IDC?"><img width="324" height="235" class="entry-thumb" src="/uploads/e488556b19dc5935e69fcf278c50c7f5.jpg" alt="Aká je prípona súboru IDC?" title="Aká je prípona súboru IDC?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/sk/category/internet/" class="td-post-category">internet</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/chto-takoe-rasshirenie-faila-idc-chem-otkryt-fail-idc-kak-ispravit.html" rel="bookmark" title="Aká je prípona súboru IDC?">Aká je prípona súboru IDC?</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Dúfame, že sme vám pomohli vyriešiť problém so súborom IDC. Ak neviete, kde si môžete stiahnuť aplikáciu z nášho zoznamu, kliknite na odkaz (toto je ...</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/sk/programma-dlya-postroeniya-semeinogo-dreva-my-family-tree-genealogicheskoe-drevo-programma-femili-drev.html" rel="bookmark" title="Rodokmeň Program rodokmeň rodiny"><img width="100" height="70" class="entry-thumb" src="/uploads/d5689c8e301f9a24769c32ad1099c598.jpg" alt="Rodokmeň Program rodokmeň rodiny" title="Rodokmeň Program rodokmeň rodiny"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/programma-dlya-postroeniya-semeinogo-dreva-my-family-tree-genealogicheskoe-drevo-programma-femili-drev.html" rel="bookmark" title="Rodokmeň Program rodokmeň rodiny">Rodokmeň Program rodokmeň rodiny</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/sk/category/monitors/" class="td-post-category">Monitory</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/sk/rasshirenie-faila-smf-formaty-smf-otkryt-fail-smf.html" rel="bookmark" title="Formáty SMF Otvorte súbor smf"><img width="100" height="70" class="entry-thumb" src="/uploads/9a82e0b82b942cdfdd315a3adf9a3d48.jpg" alt="Formáty SMF Otvorte súbor smf" title="Formáty SMF Otvorte súbor smf"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/rasshirenie-faila-smf-formaty-smf-otkryt-fail-smf.html" rel="bookmark" title="Formáty SMF Otvorte súbor smf">Formáty SMF Otvorte súbor smf</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/sk/category/motherboard/" class="td-post-category">základné dosky</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/sk/sfw-faily-kak-otkryt-fail-swf-ustranenie-nepoladok-pri-otkrytii-failov.html" rel="bookmark" title="Sfw súbory. Ako otvoriť súbor SWF. Riešenie problémov s otváraním súborov SFW"><img width="100" height="70" class="entry-thumb" src="/uploads/df3727733b819772a35ddcbd3065554f.jpg" alt="Sfw súbory. Ako otvoriť súbor SWF. Riešenie problémov s otváraním súborov SFW" title="Sfw súbory. Ako otvoriť súbor SWF. Riešenie problémov s otváraním súborov SFW"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/sfw-faily-kak-otkryt-fail-swf-ustranenie-nepoladok-pri-otkrytii-failov.html" rel="bookmark" title="Sfw súbory. Ako otvoriť súbor SWF. Riešenie problémov s otváraním súborov SFW">Sfw súbory. Ako otvoriť súbor SWF. Riešenie problémov s otváraním súborov SFW</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/sk/category/ram/" class="td-post-category">RAM</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/sk/rss-onlainovyi-agregator-obzor-luchshih-rss-riderov-dlya-chteniya-lent-novostei.html" rel="bookmark" title="Prehľad najlepších čítačiek RSS pre čitateľov informačných kanálov"><img width="100" height="70" class="entry-thumb" src="/uploads/9dc4e1a3a373985cb58dbd49c896b3fa.jpg" alt="Prehľad najlepších čítačiek RSS pre čitateľov informačných kanálov" title="Prehľad najlepších čítačiek RSS pre čitateľov informačných kanálov"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/rss-onlainovyi-agregator-obzor-luchshih-rss-riderov-dlya-chteniya-lent-novostei.html" rel="bookmark" title="Prehľad najlepších čítačiek RSS pre čitateľov informačných kanálov">Prehľad najlepších čítačiek RSS pre čitateľov informačných kanálov</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/sk/category/monitors/" class="td-post-category">Monitory</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/sk/pls-otkryt-chem-otkryt-pls-alternativnyi-sposob-togo-kak-preobrazovat-pls-fail-v.html" rel="bookmark" title="Pls otvorte. Pls prípona súboru Alternatívny spôsob, ako previesť súbor PLS na súbor PDF"><img width="100" height="70" class="entry-thumb" src="/uploads/edbd14c84b957729cfb1ec6a307f251e.jpg" alt="Pls otvorte. Pls prípona súboru Alternatívny spôsob, ako previesť súbor PLS na súbor PDF" title="Pls otvorte. Pls prípona súboru Alternatívny spôsob, ako previesť súbor PLS na súbor PDF"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/pls-otkryt-chem-otkryt-pls-alternativnyi-sposob-togo-kak-preobrazovat-pls-fail-v.html" rel="bookmark" title="Pls otvorte. Pls prípona súboru Alternatívny spôsob, ako previesť súbor PLS na súbor PDF">Pls otvorte. Pls prípona súboru Alternatívny spôsob, ako previesť súbor PLS na súbor PDF</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/sk/category/more/" class="td-post-category">Iné</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/sk/udalila-fail-s-rasshireniem-vhd-chto-delat-sozdanie-vhd-diska-i-zagruzka-s-vhd.html" rel="bookmark" title="Vytvorte VHD a spustite z VHD"><img width="100" height="70" class="entry-thumb" src="/uploads/31213b30c0e87657e270439e084a2fef.jpg" alt="Vytvorte VHD a spustite z VHD" title="Vytvorte VHD a spustite z VHD"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/sk/udalila-fail-s-rasshireniem-vhd-chto-delat-sozdanie-vhd-diska-i-zagruzka-s-vhd.html" rel="bookmark" title="Vytvorte VHD a spustite z VHD">Vytvorte VHD a spustite z VHD</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/sk/category/power-supply/" class="td-post-category">Napájacie zdroje</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/sk/programmy-dlya-ios-ipa-kak-ustanovit-ipa-faily-na-ipad-ispolzovanie.html" rel="bookmark" title="Ako nainštalovať súbory ipa na iPad"><img width="218" height="150" class="entry-thumb" src="/uploads/b6b522d2031b23e5d8603d4d932d2cf2.jpg" alt="Ako nainštalovať súbory ipa na iPad" title="Ako nainštalovať súbory ipa na iPad"/ 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/sk/programmy-dlya-ios-ipa-kak-ustanovit-ipa-faily-na-ipad-ispolzovanie.html" rel="bookmark" title="Ako nainštalovať súbory ipa na iPad">Ako nainštalovať súbory ipa na iPad</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/sk/mts-podklyuchenie-vezde-kak-doma-mts-vezde-kak-doma-otklyuchit-i.html" rel="bookmark" title=""МТС" – "Везде как дома""><img width="218" height="150" class="entry-thumb" src="/uploads/2446665fb29d8176180dad9ee2017239.jpg" alt=""МТС" – "Везде как дома"" title=""МТС" – "Везде как дома""/ 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/sk/mts-podklyuchenie-vezde-kak-doma-mts-vezde-kak-doma-otklyuchit-i.html" rel="bookmark" title=""МТС" – "Везде как дома"">"MTS" - "Všade doma"</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/sk/bq-kakaya-strana-proizvoditel-telefon-bq-otzyvy-pokupatelei-otlichitelnye.html" rel="bookmark" title="Telefón BQ: recenzie zákazníkov"><img width="218" height="150" class="entry-thumb" src="/uploads/3bc18bc11c48d9f5d1a9866f4cd06299.jpg" alt="Telefón BQ: recenzie zákazníkov" title="Telefón BQ: recenzie zákazníkov"/ 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/sk/bq-kakaya-strana-proizvoditel-telefon-bq-otzyvy-pokupatelei-otlichitelnye.html" rel="bookmark" title="Telefón BQ: recenzie zákazníkov">Telefón BQ: recenzie zákazníkov</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/sk/otklyuchenie-vezde-kak-doma-vezde-kak-doma-ot-mts-kak-otklyuchit-uslugu-mts.html" rel="bookmark" title="Odpojenie je ako doma všade"><img width="218" height="150" class="entry-thumb" src="/uploads/c3dc2bae4cef476bd5fe892518ebcfb3.jpg" alt="Odpojenie je ako doma všade" title="Odpojenie je ako doma všade"/ 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/sk/otklyuchenie-vezde-kak-doma-vezde-kak-doma-ot-mts-kak-otklyuchit-uslugu-mts.html" rel="bookmark" title="Odpojenie je ako doma všade">Odpojenie je ako doma všade</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/sk/chto-znachit-na-samsunge-vo-lte-smartfony-s-volte-harakteristiki-tehnologii-i.html" rel="bookmark" title="Smartfóny VoLTE: funkcie, technológie a aplikácie"><img width="218" height="150" class="entry-thumb" src="/uploads/b7324dbe4272b71c7434b1d1edff33a6.jpg" alt="Smartfóny VoLTE: funkcie, technológie a aplikácie" title="Smartfóny VoLTE: funkcie, technológie a aplikácie"/ 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/sk/chto-znachit-na-samsunge-vo-lte-smartfony-s-volte-harakteristiki-tehnologii-i.html" rel="bookmark" title="Smartfóny VoLTE: funkcie, technológie a aplikácie">Smartfóny VoLTE: funkcie, technológie a aplikácie</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/sk/instrukciyu-kitaiskii-telefon-jiayu-g3-dobrotnyi-chetyrehyadernyi.html" rel="bookmark" title="solídny štvorjadrový telefón, nezaslúži si nič iné ako pochvalu"><img width="218" height="150" class="entry-thumb" src="/uploads/9e7445a42a08f14732b964736de73446.jpg" alt="solídny štvorjadrový telefón, nezaslúži si nič iné ako pochvalu" title="solídny štvorjadrový telefón, nezaslúži si nič iné ako pochvalu"/ 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/sk/instrukciyu-kitaiskii-telefon-jiayu-g3-dobrotnyi-chetyrehyadernyi.html" rel="bookmark" title="solídny štvorjadrový telefón, nezaslúži si nič iné ako pochvalu">solídny štvorjadrový telefón, nezaslúži si nič iné ako pochvalu</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/sk/standarty-peredachi-dannyh.html" rel="bookmark" title="Štandardy prenosu dát"><img width="218" height="150" class="entry-thumb" src="/uploads/a0122e9d83314916d2ddbf1477fc3513.jpg" alt="Štandardy prenosu dát" title="Štandardy prenosu dát"/ 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/sk/standarty-peredachi-dannyh.html" rel="bookmark" title="Štandardy prenosu dát">Štandardy prenosu dát</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/sk/instrukciya-po-ekspluatacii-just5-model-cp10-obzor-telefona-just5-bodraya-zvonilka.html" rel="bookmark" title="Návod na použitie Just5, model CP10"><img width="218" height="150" class="entry-thumb" src="/uploads/62e46f53298174e5628efda0979b8ef3.jpg" alt="Návod na použitie Just5, model CP10" title="Návod na použitie Just5, model CP10"/ 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/sk/instrukciya-po-ekspluatacii-just5-model-cp10-obzor-telefona-just5-bodraya-zvonilka.html" rel="bookmark" title="Návod na použitie Just5, model CP10">Návod na použitie Just5, model CP10</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/sk/jiayu-g3-opisanie-jiayu-g3c---tehnicheskie-harakteristiki-informaciya-o-marke.html" rel="bookmark" title="JiaYu G3C - Špecifikácie"><img width="218" height="150" class="entry-thumb" src="/uploads/04d8cc7305a68f42732ba42b767d9723.jpg" alt="JiaYu G3C - Špecifikácie" title="JiaYu G3C - Špecifikácie"/ 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/sk/jiayu-g3-opisanie-jiayu-g3c---tehnicheskie-harakteristiki-informaciya-o-marke.html" rel="bookmark" title="JiaYu G3C - Špecifikácie">JiaYu G3C - Špecifikácie</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/sk/vygodnyi-smart-mini-ot-mts-tarif-smart-mini-ot-mts-opisanie-podklyuchenie.html" rel="bookmark" title="Tarifa "Smart Mini" od MTS - popis, pripojenie, cena tarifného balíka MTS smart mini"><img width="218" height="150" class="entry-thumb" src="/uploads/8959cbc049816be3c4bc420228dcb413.jpg" alt="Tarifa "Smart Mini" od MTS - popis, pripojenie, cena tarifného balíka MTS smart mini" title="Tarifa "Smart Mini" od MTS - popis, pripojenie, cena tarifného balíka MTS smart mini"/ 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/sk/vygodnyi-smart-mini-ot-mts-tarif-smart-mini-ot-mts-opisanie-podklyuchenie.html" rel="bookmark" title="Tarifa "Smart Mini" od MTS - popis, pripojenie, cena tarifného balíka MTS smart mini">Tarifa "Smart Mini" od MTS - popis, pripojenie, cena tarifného balíka MTS smart mini</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/sk/kto-sotovyi-operator-902-za-kakimi-operatorami-zakreplen.html" rel="bookmark" title="Ktorým operátorom je priradená predpona „902“"><img width="218" height="150" class="entry-thumb" src="/uploads/70029e9b45b4a05180505bba4421c1f2.jpg" alt="Ktorým operátorom je priradená predpona „902“" title="Ktorým operátorom je priradená predpona „902“"/ 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/sk/kto-sotovyi-operator-902-za-kakimi-operatorami-zakreplen.html" rel="bookmark" title="Ktorým operátorom je priradená predpona „902“">Ktorým operátorom je priradená predpona „902“</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/sk/smotret-chto-takoe-yota-v-drugih-slovaryah-informaciya-o.html" rel="bookmark" title="Informácie o spoločnosti Dcérska spoločnosť Yota Yota"><img width="218" height="150" class="entry-thumb" src="/uploads/27a427020b944f31f8586148b2c0fb9b.jpg" alt="Informácie o spoločnosti Dcérska spoločnosť Yota Yota" title="Informácie o spoločnosti Dcérska spoločnosť Yota Yota"/ 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/sk/smotret-chto-takoe-yota-v-drugih-slovaryah-informaciya-o.html" rel="bookmark" title="Informácie o spoločnosti Dcérska spoločnosť Yota Yota">Informácie o spoločnosti Dcérska spoločnosť Yota Yota</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/sk/kakoi-region-po-nomeru-telefona-902-ural-i-ego-okrestnosti-sibir.html" rel="bookmark" title="V ktorom regióne na telefónnom čísle 902"><img width="218" height="150" class="entry-thumb" src="/uploads/20283f7d342e288f0c4b6cfd2985d599.jpg" alt="V ktorom regióne na telefónnom čísle 902" title="V ktorom regióne na telefónnom čísle 902"/ 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/sk/kakoi-region-po-nomeru-telefona-902-ural-i-ego-okrestnosti-sibir.html" rel="bookmark" title="V ktorom regióne na telefónnom čísle 902">V ktorom regióne na telefónnom čísle 902</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/sk/programma-mts-bonus-zakryvaetsya-mts-ugrobil-bonusnuyu-programmu-mts-bonus.html" rel="bookmark" title="MTS sa vzdala bonusového programu „MTS Bonus Bonusový program MTS je alebo nie je uzavretý"><img width="218" height="150" class="entry-thumb" src="/uploads/50307ba8852d8fb0d18f46ad2e9f5017.jpg" alt="MTS sa vzdala bonusového programu „MTS Bonus Bonusový program MTS je alebo nie je uzavretý" title="MTS sa vzdala bonusového programu „MTS Bonus Bonusový program MTS je alebo nie je uzavretý"/ 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/sk/programma-mts-bonus-zakryvaetsya-mts-ugrobil-bonusnuyu-programmu-mts-bonus.html" rel="bookmark" title="MTS sa vzdala bonusového programu „MTS Bonus Bonusový program MTS je alebo nie je uzavretý">MTS sa vzdala bonusového programu „MTS Bonus Bonusový program MTS je alebo nie je uzavretý</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/sk/kak-aktivirovat-bonusy-na-mts-kak-aktivirovat-bonusy-na-mts-chto-delat.html" rel="bookmark" title="Ako aktivovať bonusy na MTS Čo robiť, ak MTS neprijíma bonusy „Ďakujem“"><img width="218" height="150" class="entry-thumb" src="/uploads/75e1e8897954d75a36814df551c0a982.jpg" alt="Ako aktivovať bonusy na MTS Čo robiť, ak MTS neprijíma bonusy „Ďakujem“" title="Ako aktivovať bonusy na MTS Čo robiť, ak MTS neprijíma bonusy „Ďakujem“"/ 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/sk/kak-aktivirovat-bonusy-na-mts-kak-aktivirovat-bonusy-na-mts-chto-delat.html" rel="bookmark" title="Ako aktivovať bonusy na MTS Čo robiť, ak MTS neprijíma bonusy „Ďakujem“">Ako aktivovať bonusy na MTS Čo robiť, ak MTS neprijíma bonusy „Ďakujem“</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/sk/operator-nachinaetsya-na-902-irkutsk-buryatiya-krasnoyarsk.html" rel="bookmark" title="Irkutsk, Burjatsko, Krasnojarsk, Khakassia a Altajské územie"><img width="218" height="150" class="entry-thumb" src="/uploads/38d0041395a573c2e57eb1148cf6141d.jpg" alt="Irkutsk, Burjatsko, Krasnojarsk, Khakassia a Altajské územie" title="Irkutsk, Burjatsko, Krasnojarsk, Khakassia a Altajské územie"/ 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/sk/operator-nachinaetsya-na-902-irkutsk-buryatiya-krasnoyarsk.html" rel="bookmark" title="Irkutsk, Burjatsko, Krasnojarsk, Khakassia a Altajské územie">Irkutsk, Burjatsko, Krasnojarsk, Khakassia a Altajské územie</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/sk/wi-fi-mesh-seti-s-besshovnym-roumingom-iz-neskolkih-tochek-dostupa-dlya-bolshih.html" rel="bookmark" title="Bezproblémový wifi roaming Ktorí klienti podporujú bezproblémový wifi roaming"><img width="218" height="150" class="entry-thumb" src="/uploads/31c58508f6b144c659ebb697f99077af.jpg" alt="Bezproblémový wifi roaming Ktorí klienti podporujú bezproblémový wifi roaming" title="Bezproblémový wifi roaming Ktorí klienti podporujú bezproblémový wifi roaming"/ 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/sk/wi-fi-mesh-seti-s-besshovnym-roumingom-iz-neskolkih-tochek-dostupa-dlya-bolshih.html" rel="bookmark" title="Bezproblémový wifi roaming Ktorí klienti podporujú bezproblémový wifi roaming">Bezproblémový wifi roaming Ktorí klienti podporujú bezproblémový wifi roaming</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/sk/besshovnyi-rouming-wifi-besshovnyi-rouming-wi-fi-seti-v-capsman-na-primere.html" rel="bookmark" title="Bezproblémový roaming Wi-Fi siete v Capsman na príklade hosťovskej wifi"><img width="218" height="150" class="entry-thumb" src="/uploads/cbb47443cbc71948ba0ca4aa145ad262.jpg" alt="Bezproblémový roaming Wi-Fi siete v Capsman na príklade hosťovskej wifi" title="Bezproblémový roaming Wi-Fi siete v Capsman na príklade hosťovskej wifi"/ 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/sk/besshovnyi-rouming-wifi-besshovnyi-rouming-wi-fi-seti-v-capsman-na-primere.html" rel="bookmark" title="Bezproblémový roaming Wi-Fi siete v Capsman na príklade hosťovskej wifi">Bezproblémový roaming Wi-Fi siete v Capsman na príklade hosťovskej wifi</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside> </div> </div> </div> </div> <div class="td-sub-footer-container td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span td-sub-footer-menu"> </div> <div class="td-pb-span td-sub-footer-copy">Copyright 2021 – Oprava počítačov a notebookov. Grafické karty, pevné disky, internet, monitory.</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>