Jak pracovat s XML dokumenty v Delphi? Konkrétně s TXMLDocument? Použití objektového modelu dokumentu XML.

Pro mnoho programátorů Delphi je ukládání nastavení spojeno s používáním INI soubory ve svých programech. Použití této metody ve více či méně závažných projektech je třeba se vyhnout, protože omezuje flexibilitu, což brání dalšímu rozšiřování programu. Je třeba říci, že tento přístup je poměrně populární díky snadnému použití a přítomnosti vestavěných nástrojů ve vývojovém prostředí.

Nicméně strukturované XML soubory. Jejich výhodou je, že počet parametrů nemusí být pevně daný. Abyste tomu lépe porozuměli, zvažte konkrétní příklad.

V programu USearch se po kliknutí na záznam zobrazí kontextové menu, ve kterém je zobrazen seznam položek. Tyto položky jsou příkazy, které se načítají ze souboru nastavení. V případě, že byla nastavení uložena v INI soubor, pak by program mohl uložit a načíst určitý počet příkazů, například 10 nebo 50. Jakmile bude vyžadována větší hodnota, budete muset přepsat kód a znovu jej odpovídajícím způsobem zkompilovat.


Použití přístupu pomocí XML soubory, budeme moci dynamicky načítat všechny parametry sekce. Konfigurační soubor se navíc stane elegantnějším, bez nadbytečného číslování parametrů. Ale, standardní prostředky pracovat s XML Delphi má mnoho nevýhod, proto doporučuji používat standardní knihovna MSXML... Obvykle je standardně součástí operační systémy Rodina Windows.


Chcete-li se připojit MSXML, potřebujeme vygenerovat soubor rozhraní se seznamem všech funkcí jeho importem ze serveru COM. O tom, jak importovat rozhraní, bylo napsáno mnoho podrobných článků, ale doporučuji vám stáhnout soubor MSXML2_TLB.PAS připraven k použití. Po stažení soubor umístěte vedle svého projektu nebo jej přesuňte do složky lib prostředí Delphi. Modul tedy budou moci používat všechny vytvořené programy MSXML, stačí přidat řádek MSXML2_TLB k použití.

Pro srozumitelnost zvažte následující příklad použití této knihovny:

Postup LoadData; var XMLDoc: DOMDocument; Kořen: IXMLDOMElement; begin XMLDoc: = CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Kořen: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("velikost / šířka"). Text); Kořen: = nula; XMLDoc: = nula; konec;

Nejprve se vytvoří instance třídy DOMDocument a poté se do paměti načte obsah souboru settings.xml. Jelikož dle normy jakákoliv XML soubor musí obsahovat kořenovou značku (in v tomto případě config), pak jej musíme získat pomocí funkce DocumentElement... Poté se obsah zobrazí mezi značkami. , které jsou zase mezi značkami ... Naše metoda tedy ze souboru settings.xml zobrazí text ve MessageBoxu "100px".

500 pixelů 100 pixelů

Zde je aplikována metoda SelectSingleNode, která jako parametr bere řetězec

Navzdory tomu, že téma práce s XML v Delphi bylo na internetu hojně diskutováno, dotazy na toto téma se často objevují na nejrůznějších fórech.

Napsal jsem to také, ale rád bych se vrátil k reálnému případu rychlého parsování XML souboru a extrahování dat, které jsem dnes dělal v práci. Získat potřebná data mi netrvalo déle než 5 minut.

Pozadí. Dnes jsem potřeboval zpracovat data o nainstalované programy na počítačích uživatelů (ano, ano, identifikujeme piráty :)). Technické oddělení mi poskytlo tyto informace získané od nic netušících uživatelů přes síť pomocí WMI. Program, který použili, generuje zprávy XML formát... V souladu s tím mi přinesli horu XML souborů s poměrně složitou strukturou, ze které jsem musel vytáhnout pouze název nainstalovaných softwarových produktů.

Léčba . Když jsem si ručně prohlédl několik souborů, uvědomil jsem si, že nebude trvat dlouho, než zestárnu, a rozhodl jsem se napsat malý konvertor. Po spuštění Delphi jsem z úložiště vybral objekt XML DataBinding a vložil do něj jeden ze souborů. Ponechal jsem všechna nastavení a parametry ve výchozím nastavení a v důsledku toho modul s velké množství třídy a rozhraní pro přístup k prvkům tohoto souboru XML. Strukturou tříd jsem se dlouho neobtěžoval řešit, hned jsem přešel k psaní převodníku.

V nové konzolové aplikaci jsem napsal docela jednoduchý kód:


program XML2TXT;

používá
Formuláře,
Třídy, SysUtils,
SoftwareXML v "SoftwareXML.pas";

procedura CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i: celé číslo;
sr: TSearchRec;
CurDir: řetězec;
ExportFile: TStringList;
začít
CurDir: = IncludeTrailingPathDelimiter (ExtractFilePath (Application.ExeName));
pokud FindFirst (CurDir + "*. xml", faAnyFile, sr) = 0, pak
opakovat
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;
dokud FindNext (sr) 0;
konec;

začít
Application.Initialize;
CovertXML2Text;
konec.

V důsledku toho jsem pro každý počítač v mřížce získal jeden textový editor obsahující seznam nainstalovaného softwaru.

Mám pocit, že tento kód bude vyžadovat nějaké vysvětlení. Proč jsem například použil modul Forms v konzolové aplikaci a zavolal proceduru Application.Initialize;?

Je to vlastně jednoduché – jde o malý hack, který vám umožňuje používat XML Data Binding v konzolové aplikaci. Protože tvrdošíjně odmítala inicializovat třídu pro práci s XML. Ještě jsem nepřišel na skutečné důvody - dnes byl důležitý čas, už jsem s touto chybou strávil 4 z 5 minut. :) Myslím, že později se tímto problémem zabývat a napsat, co je skutečným důvodem.

Podivná třída softbase byla vytvořena ze souboru XML - to je název kořenového prvku a softbase.InstalledSoftware.source.software [i] .DisplayName je pouze procházení vnořenými prvky k požadovanému prvku a získávání jeho hodnoty.

Takhle jeden z nej rychlé způsoby práce s XML v Delphi.

XML se stále více používá k ukládání informací a jejich výměně mezi aplikacemi a webovými stránkami. Mnoho aplikací používá tento jazyk jako základní jazyk pro ukládání dat, zatímco jiné jej používají pro export a import dat XML. Je tedy čas, aby vývojáři začali přemýšlet o tom, jak lze data XML použít v jejich vlastních aplikacích.

V tomto článku se podíváme na XML Document Object Model (DOM) a implementaci XML DOM od společnosti Microsoft.

XML DOM je objektový model, který poskytuje vývojářům objekty pro načítání a zpracování souborů XML. Objektový model se skládá z následujících základních objektů: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap a XMLDOMParseError. Každý z těchto objektů (kromě XMLDOMParseError) obsahuje vlastnosti a metody, které vám umožňují získat informace o objektu, manipulovat s hodnotami a strukturou objektu a procházet strukturou dokumentu XML.

Podívejme se na hlavní objekty XML DOM a ukažme si některé příklady jejich použití v Borland Delphi.

Použití XML DOM v Borland Delphi

Abyste mohli používat Microsoft XML DOM v aplikacích Delphi, musíte k projektu připojit příslušnou knihovnu typů. K tomu spustíme příkaz Projekt | Import knihovny typů a v dialogovém okně Import knihovny typů vyberte knihovnu Microsoft XML verze 2.0 (verze 2.0), která se obvykle nachází v souboru Windows \ System \ MSXML.DLL.

Po kliknutí na tlačítko Create Unit se vytvoří modul rozhraní MSXML_TLB, který nám umožní používat objekty XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest a řadu dalších, implementovaných v knihovně MSXML.DLL. Odkaz na modul MSXML_TLB musí být v seznamu Použití.

XML DOM zařízení

Objektový model dokumentu představuje dokument XML ve stromové struktuře větví. XML DOM API umožňují aplikacím procházet strom dokumentů a manipulovat s jeho větvemi. Každá větev může mít specifický typ (DOMNodeType), podle kterého se určuje nadřazená a podřízená větev. Většina dokumentů XML obsahuje větve typu element, atribut a text. Atributy jsou speciálním druhem větvení a nejsou podřízenými větvemi. Chcete-li spravovat atributy, použijte speciální metody poskytované objekty XML DOM.

Kromě implementace rozhraní doporučených konsorciem World Wide Web Consortium (W3C), Microsoft XML DOM obsahuje metody, které podporují XSL, XSL vzory, jmenné prostory a datové typy. Například metoda SelectNodes umožňuje použít syntaxi vzoru XSL k nalezení větví v určitém kontextu a metoda TransformNode podporuje použití XSL k provádění transformací.

Test XML dokumentu

Jako příklad dokumentu XML si vezměme adresář hudebního CD-ROM, který má následující strukturu:

Empírová burleska Bob Dylan USA Kolumbie 10.90 1985 Skryj své srdce Bonnie tylor Spojené království CBS Records 9.90 1988 ... Odpoutejte mé srdce Joe kokr USA EMI 8.20 1987

Nyní jsme připraveni začít zkoumat objektový model XML DOM, počínaje objektem XMLDOMDocument.

Dokument XML - Objekt XMLDOMDocument

Práce s dokumentem XML začíná jeho načtením. K tomu používáme metodu Load, která má pouze jeden parametr, který určuje URL načítaného dokumentu. Při načítání souborů z lokálního disku se zadává pouze celý název souboru (soubor: /// protokol lze v tomto případě vynechat). Pokud je dokument XML uložen jako řetězec, použijte k načtení dokumentu metodu LoadXML.

Vlastnost Async se používá k řízení způsobu načítání dokumentu (synchronního nebo asynchronního). Ve výchozím nastavení je tato vlastnost nastavena na hodnotu True, což znamená, že dokument je načten asynchronně a řízení je vráceno aplikaci před úplným načtením dokumentu. V opačném případě se dokument načte synchronně a pak musíte zkontrolovat hodnotu vlastnosti ReadyState, abyste zjistili, zda se dokument načetl nebo ne. Můžete také vytvořit obslužnou rutinu pro událost OnReadyStateChange, která převezme řízení, když se změní hodnota vlastnosti ReadyState.

Následující text ukazuje, jak načíst dokument XML pomocí metody Load:

Používá ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // // Zde se nachází kód, který // manipuluje s dokumentem XML a jeho větvemi // XMLDoc: = Nil; konec;

Po načtení dokumentu máme přístup k jeho vlastnostem. Vlastnost NodeName tedy bude obsahovat hodnotu #document, vlastnost NodeTypeString bude obsahovat hodnotu dokumentu a vlastnost URL bude obsahovat soubor: /// C: /DATA/DATA.xml value.

Vypořádání se s chybou

Zvláště zajímavé jsou vlastnosti související se zpracováním dokumentů při načítání. Například vlastnost ParseError vrací objekt XMLDOMParseError obsahující informace o chybě, ke které došlo při zpracování dokumentu.

Chcete-li napsat obslužnou rutinu chyb, můžete přidat následující kód:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); XMLError: = XMLDoc.ParseError; Pokud XMLError.ErrorCode<>0 Potom // // Zde zpracujeme chybu // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;

Chcete-li zjistit, jaké informace jsou vráceny v případě chyby, změňte následující položku adresáře:

Empírová burleska Bob Dylan USA Kolumbie 10.90 1985

odstranění uzavíracího prvku na druhém řádku:</p><p> <CD> <TITLE>Empírová burleska <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Kolumbie</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Nyní napíšeme kód, který vrátí hodnoty vlastností objektu XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Pokud XMLError.ErrorCode<>0 Potom s XMLError Memo1.Lines začnou Add (‚Soubor:‘ + URL); Přidat (‚Kód:‘ + IntToStr (Kód chyby)); Přidat (‚Chyba:‘ + Důvod); Přidat (‚Text:‘ + SrcText); Přidat (‚Řádek:‘ + IntToStr (Řádek)); Přidat (‚Position:‘ + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Konec;</p><p>a spusťte naši aplikaci. V důsledku toho získáme následující informace o chybě.</p> <p>Jak můžete vidět z výše uvedeného příkladu, informace vrácené objektem XMLDOMParseError jsou dostatečné k lokalizaci chyby a pochopení příčiny jejího výskytu.</p> <p>Nyní obnovíme uzavírací prvek <TITLE>v našem dokumentu a pokračujte v diskusi o XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Přístup ke stromu dokumentů</h2> <p>Chcete-li získat přístup ke stromu dokumentů, můžete buď získat kořenový prvek a poté iterovat jeho podřízené větve, nebo najít konkrétní větev. V prvním případě získáváme kořenový element prostřednictvím vlastnosti DocumentElement, která vrací objekt typu XMLDOMNode. Zde je návod, jak použít vlastnost DocumentElement k získání obsahu každého podřízeného prvku:</p><p>Var Node: IXMLDOMNode; Kořen: IXMLDOMElement; I: celé číslo; ... Kořen: = XMLDoc.DocumentElement; Pro I: = 0 až Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Konec;</p><p>Pro náš dokument XML získáme následující text.</p> <p>Pokud nás zajímá konkrétní větev nebo větev pod první podřízenou větví, můžeme použít buď metodu NodeFromID nebo metodu GetElementByTagName objektu XMLDOMDocument.</p> <p>Metoda NodeFromID vyžaduje jedinečný identifikátor definovaný v XML Schema nebo Document Type Definition (DTD) a vrací větev s tímto identifikátorem.</p> <p>Metoda GetElementByTagName vyžaduje řetězec s konkrétním prvkem (tag) a vrací všechny větve s tímto prvkem. Zde je návod, jak použít tuto metodu k nalezení všech umělců v našem adresáři CD-ROM:</p><p>Uzly: IXMLDOMNodeList; Uzel: IXMLDOMNode; ... Nodes: = XMLDoc.GetElementsByTagName (‚ARTIST‘); Pro I: = 0 až Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Konec;</p><p>Pro náš dokument XML získáme následující text</p> <p>Všimněte si, že metoda SelectNodes objektu XMLDOMNode poskytuje flexibilnější způsob přístupu k větvím dokumentu. Ale o tom více níže.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Větev dokumentu - Objekt XMLDOMNode</h2> <p>Objekt XMLDOMNode představuje větev dokumentu. S tímto objektem jsme se již setkali, když jsme získali kořenový prvek dokumentu:</p><p>Kořen: = XMLDoc.DocumentElement;</p><p>Chcete-li získat informace o větvi dokumentu XML, můžete použít vlastnosti objektu XMLDOMNode (tabulka 1).</p> <p>Pro přístup k datům uloženým ve větvi se běžně používá buď vlastnost NodeValue (dostupná pro atributy, textové větve, komentáře, instrukce pro zpracování a sekce CDATA), nebo vlastnost Text, která vrací textový obsah větve, nebo vlastnost NodeTypedValue. Ten však lze použít pouze pro pobočky s napsanými položkami.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Procházení stromu dokumentů</h3> <p>Objekt XMLDOMNode poskytuje mnoho způsobů, jak procházet strom dokumentu. Například pro přístup k nadřazené větvi použijte vlastnost ParentNode (typ XMLDOMNode), přistupujte k podřízeným větvím prostřednictvím vlastností ChildNodes (typ XMLDOMNodeList), FirstChild a LastChild (typ XMLDOMNode) atd. Vlastnost OwnerDocument vrací objekt XMLDOMDocument, který identifikuje samotný dokument XML. Výše uvedené vlastnosti usnadňují navigaci ve stromu dokumentu.</p> <p>Nyní projdeme všechny větve dokumentu XML:</p><p>Kořen: = XMLDoc.DocumentElement; Pro I: = 0 až Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Uzel, 0); Konec;</p><p>Jak bylo uvedeno výše, SelectNodes objektu XMLDOMNode poskytuje flexibilnější způsob přístupu k větvím dokumentu. Navíc existuje metoda SelectSingleNode, která vrací pouze první větev dokumentu. Obě tyto metody umožňují definovat šablony XSL pro vyhledávání větví.</p> <p>Podívejme se na proces použití metody SelectNodes k načtení všech větví, které mají větev CD a dílčí větev PRICE:</p><p>Kořen: = XMLDoc.DocumentElement; Nodes: = Root.SelectNodes (‚CD / CENA‘);</p><p>Všechny dílčí větve PRICE větve CD budou umístěny do kolekce Nodes. K diskusi o šablonách XSL se vrátíme o něco později.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulace s dětskými ratolestmi</h3> <p>Pro manipulaci s podřízenými větvemi můžeme použít metody objektu XMLDOMNode (tabulka 2).</p> <p>Chcete-li zcela odstranit záznam o prvním disku, musíte spustit následující kód:</p><p>Var XMLDoc: IXMLDOMDocument; Kořen: IXMLDOMNode; Uzel: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získání kořenového prvku Root: = XMLDoc.DocumentElement; Uzel: = Kořen; // Odebere první podřízenou větev Node.RemoveChild (Node.FirstChild);</p><p>Všimněte si, že v tomto příkladu odstraňujeme první podřízenou větev. Jak odstranit první prvek první podřízené větve je znázorněno níže:</p><p>Var XMLDoc: IXMLDOMDocument; Kořen: IXMLDOMNode; Uzel: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získání kořenového prvku Root: = XMLDoc.DocumentElement; // a první podřízená větev Uzel: = Root.FirstChild; // Odebere první podřízenou větev Node.RemoveChild (Node.FirstChild);</p><p>Ve výše uvedeném příkladu jsme neodstranili první větev <CD>…</CD> a prvním prvkem větve je <TITLE>….

Nyní přidáme novou větev. Níže je uveden kód, který ukazuje, jak přidat nový záznam hudebního disku CD-ROM:

Var NewNode: IXMLDOMNode; Podřízený: IXMLDOMNode; ... // Vytvořit novou větev - NewNode: = XMLDoc.CreateNode (1, ‚CD‘, ‚‘); // Přidání prvku Child: = XMLDoc.CreateNode (1, 'TITLE', ''); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘Pink Floyd’; // Přidání prvku <ARTIST>Child: = XMLDoc.CreateNode (1, 'ARTIST', ''); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘Division Bell’; // Přidání prvku <COUNTRY>Dítě: = XMLDoc.CreateNode (1, ‚ZEMĚ‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘UK’; // Přidání prvku <COMPANY>Dítě: = XMLDoc.CreateNode (1, ‚SPOLEČNOST‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘EMI Records Ltd.’; // Přidání prvku <PRICE>Podřízené: = XMLDoc.CreateNode (1, ‚PRICE‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = '11 .99 "; // Přidejte prvek <YEAR>Child: = XMLDoc.CreateNode (1, ‚YEAR‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘1994’; // A přidáme větev Root.AppendChild (NewNode); ...</p><p>Výše uvedený kód ukazuje následující sekvenci kroků pro přidání nové větve:</p> <ul><li>Vytvoření nové větve pomocí metody CreateNode: <ul><li>vytvoření prvku pomocí metody CreateNode;</li> <li>přidání prvku do větve pomocí metody AppendChild;</li> <li>nastavení hodnoty prvku pomocí vlastnosti Text;</li> <li>… Opakujte pro všechny prvky.</li> </ul></li> <li>Přidání nové větve do dokumentu pomocí metody AppendChild.</li> </ul><p>Připomeňme, že metoda AppendChild přidá větev na konec stromu. Chcete-li přidat větev na konkrétní místo ve stromu, musíte použít metodu InsertBefore.</p> <h2>Sada větví - objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList obsahuje seznam větví, které lze sestavit pomocí metod SelectNodes nebo GetElementsByTagName a také získat z vlastnosti ChildNodes.</p> <p>Použití tohoto objektu jsme již probrali v příkladu uvedeném v části „Navigace ve stromu dokumentů“. Zde uvedeme několik teoretických komentářů.</p> <p>Počet větví v seznamu lze získat jako hodnotu vlastnosti Délka. Větve jsou indexovány od 0 do Délka-1 a každá jednotlivá větev je přístupná prostřednictvím odpovídající indexované položky v poli Item.</p> <p>Procházení seznamu větví lze také provést pomocí metody NextNode, která vrátí další větev v seznamu nebo Nil, pokud je aktuální větev poslední. Chcete-li se vrátit na začátek seznamu, zavolejte metodu Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Vytvářejte a ukládejte dokumenty</h2> <p>Probrali jsme tedy, jak můžete přidat větve a prvky do existujících dokumentů XML. Nyní vytvoříme dokument XML za běhu. V první řadě si pamatujte, že dokument lze načíst nejen z adresy URL, ale také z běžného řetězce. Zde je návod, jak vytvořit kořenový prvek, který pak lze použít k dynamickému sestavení zbytku prvků (které jsme již probrali v sekci Manipulace podřízených větví):</p><p>Var XMLDoc: IXMLDOMDocument; Kořen: IXMLDOMNode; Uzel: IXMLDOMNode; S: WideString; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Kořen: = XMLDoc.DocumentElement; Uzel: = XMLDoc.CreateNode (1, ‚CD‘, ‚‘); Root.AppendChild (Uzel); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;</p><p>Po vytvoření dokumentu XML jej uložte do souboru pomocí metody Save. Například:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Kromě uložení do souboru vám metoda Save umožňuje uložit dokument XML do nového objektu XMLDOMDocument. V tomto případě je dokument plně zpracován a v důsledku toho je zkontrolována jeho struktura a syntaxe. Zde je návod, jak uložit dokument do jiné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: = Nil; konec;</p><p>Závěrem, metoda Save také umožňuje uložit dokument XML do jiných objektů COM, které podporují rozhraní IStream, IPersistStream nebo IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Použití šablon XSL</h2> <p>Když jsme probírali metodu SelectNodes objektu XMLDOMNode, zmínili jsme se, že poskytuje flexibilnější způsob přístupu k větvím dokumentu. Flexibilita spočívá v tom, že jako kritéria pro výběr větví můžete zadat šablonu XSL. Tyto šablony poskytují výkonný mechanismus pro vyhledávání informací v dokumentech XML. Chcete-li například získat seznam všech titulů hudebních CD-ROM v našem adresáři, můžete spustit následující dotaz:</p><p>Chcete-li zjistit, které disky umělců jsou vydány v USA, je požadavek vytvořen následovně:</p><p>Nodes: = Root.SelectNodes (‚CD / ARTIST‘);</p><p>Zde je návod, jak najít první jednotku v adresáři:</p><p>Nodes: = Root.SelectNodes (‚CD / TITLE‘);</p><p>A poslední:</p><p>Nodes: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Chcete-li najít disky Boba Dylana, můžete spustit následující dotaz:</p><p>Nodes: = Root.SelectNodes (‘CD [$ any $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>a abychom získali seznam disků vyrobených po roce 1985, spustíme následující dotaz:</p><p>Nodes: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Podrobnější popis syntaxe XSL vyžaduje samostatnou publikaci. Abych čtenáře zaujal a povzbudil k dalšímu výzkumu, uvedu jen jeden malý příklad možného použití XSL. Řekněme, že potřebujeme převést náš katalog na běžnou HTML tabulku. Pomocí tradičních metod musíme iterovat přes všechny větve stromu a pro každý přijatý prvek vytvořit odpovídající tagy <TD>…</TD>.</p> <p>Pomocí XSL jednoduše vytvoříme šablonu (nebo šablonu stylů), která specifikuje, co a jak transformovat. Poté tuto šablonu překryjeme v našem katalogu – a máte hotovo: máme text šablony XSL, která převede katalog na tabulku (Výpis 2).</p> <p>Kód pro překrytí šablony XSL v našem adresáři vypadá 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; konec;</p><p>Na závěr naší diskuse o XSL je třeba říci, že v současné době se tento jazyk aktivně používá pro transformaci mezi různými dokumenty XML a také pro formátování dokumentů.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Závěr</h2> <p>Z pochopitelných důvodů není možné pokrýt všechny objekty Microsoft XML DOM a uvést příklady jejich použití v jednom článku. Zde jsme se právě dotkli základních otázek používání XML DOM v aplikacích. Stůl 3 ukazuje všechny objekty implementované v Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>XML se stále více používá k ukládání informací a jejich výměně mezi aplikacemi a webovými stránkami. Mnoho aplikací používá tento jazyk jako základní jazyk pro ukládání dat, zatímco jiné jej používají pro export a import dat XML. Je tedy čas, aby vývojáři začali přemýšlet o tom, jak lze data XML použít v jejich vlastních aplikacích.</p> <p>V tomto článku se podíváme na XML Document Object Model (DOM) a implementaci XML DOM od společnosti Microsoft.</p> <p>XML DOM je objektový model, který poskytuje vývojářům objekty pro načítání a zpracování souborů XML. Objektový model se skládá z následujících základních objektů: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap a XMLDOMParseError. Každý z těchto objektů (kromě XMLDOMParseError) obsahuje vlastnosti a metody, které vám umožňují získat informace o objektu, manipulovat s hodnotami a strukturou objektu a procházet strukturou dokumentu XML.</p> <p>Podívejme se na hlavní objekty XML DOM a ukažme si některé příklady jejich použití v Borland Delphi.</p> <h2>Použití XML DOM v Borland Delphi</h2> <p>Abyste mohli používat Microsoft XML DOM v aplikacích Delphi, musíte k projektu připojit příslušnou knihovnu typů. K tomu spustíme příkaz Projekt | Import knihovny typů a v dialogovém okně Import knihovny typů vyberte knihovnu Microsoft XML verze 2.0 (verze 2.0), která se obvykle nachází v souboru Windows \ System \ MSXML.DLL.</p> <p>Po kliknutí na tlačítko Create Unit se vytvoří modul rozhraní MSXML_TLB, který nám umožní používat objekty XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest a řadu dalších, implementovaných v knihovně MSXML.DLL. Odkaz na modul MSXML_TLB musí být v seznamu Použití.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML DOM zařízení</h2> <p>Objektový model dokumentu představuje dokument XML ve stromové struktuře větví. XML DOM API umožňují aplikacím procházet strom dokumentů a manipulovat s jeho větvemi. Každá větev může mít specifický typ (DOMNodeType), podle kterého se určuje nadřazená a podřízená větev. Většina dokumentů XML obsahuje větve typu element, atribut a text. Atributy jsou speciálním druhem větvení a nejsou podřízenými větvemi. K manipulaci s atributy se používají speciální metody poskytované objekty XML DOM.</p> <p>Kromě implementace rozhraní doporučených konsorciem World Wide Web Consortium (W3C), Microsoft XML DOM obsahuje metody, které podporují XSL, XSL vzory, jmenné prostory a datové typy. Například metoda SelectNodes umožňuje použít syntaxi vzoru XSL k nalezení větví v určitém kontextu a metoda TransformNode podporuje použití XSL k provádění transformací.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Test XML dokumentu</h2> <p>Jako příklad dokumentu XML si vezměme adresář hudebního CD-ROM, který má následující strukturu:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Empírová burleska Bob Dylan USA Kolumbie 10.90 1985 Skryj své srdce Bonnie tylor Spojené království CBS Records 9.90 1988 ... Odpoutejte mé srdce Joe kokr USA EMI 8.20 1987

Nyní jsme připraveni začít zkoumat objektový model XML DOM, počínaje objektem XMLDOMDocument.

Dokument XML - Objekt XMLDOMDocument

Práce s dokumentem XML začíná jeho načtením. K tomu používáme metodu Load, která má pouze jeden parametr, který určuje URL načítaného dokumentu. Při načítání souborů z lokálního disku se zadává pouze celý název souboru (soubor: /// protokol lze v tomto případě vynechat). Pokud je dokument XML uložen jako řetězec, použijte k načtení dokumentu metodu LoadXML.

Vlastnost Async se používá k řízení způsobu načítání dokumentu (synchronního nebo asynchronního). Ve výchozím nastavení je tato vlastnost nastavena na hodnotu True, což znamená, že dokument je načten asynchronně a řízení je vráceno aplikaci před úplným načtením dokumentu. V opačném případě se dokument načte synchronně a pak musíte zkontrolovat hodnotu vlastnosti ReadyState, abyste zjistili, zda se dokument načetl nebo ne. Můžete také vytvořit obslužnou rutinu pro událost OnReadyStateChange, která převezme řízení, když se změní hodnota vlastnosti ReadyState.

Následující text ukazuje, jak načíst dokument XML pomocí metody Load:

Používá ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // // Zde se nachází kód, který // manipuluje s dokumentem XML a jeho větvemi // XMLDoc: = Nil; konec;

Po načtení dokumentu máme přístup k jeho vlastnostem. Vlastnost NodeName tedy bude obsahovat hodnotu #document, vlastnost NodeTypeString bude obsahovat hodnotu dokumentu a vlastnost URL bude obsahovat soubor: /// C: /DATA/DATA.xml value.

Vypořádání se s chybou

Zvláště zajímavé jsou vlastnosti související se zpracováním dokumentů při načítání. Například vlastnost ParseError vrací objekt XMLDOMParseError obsahující informace o chybě, ke které došlo při zpracování dokumentu.

Chcete-li napsat obslužnou rutinu chyb, můžete přidat následující kód:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); XMLError: = XMLDoc.ParseError; Pokud XMLError.ErrorCode<>0 Potom // // Zde zpracujeme chybu // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;

Chcete-li zjistit, jaké informace jsou vráceny v případě chyby, změňte následující položku adresáře:

Empírová burleska Bob Dylan USA Kolumbie 10.90 1985

odstranění uzavíracího prvku na druhém řádku:</p><p> <CD> <TITLE>Empírová burleska <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Kolumbie</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Nyní napíšeme kód, který vrátí hodnoty vlastností objektu XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Pokud XMLError.ErrorCode<>0 Potom s XMLError Memo1.Lines začnou Add (‚Soubor:‘ + URL); Přidat (‚Kód:‘ + IntToStr (Kód chyby)); Přidat (‚Chyba:‘ + Důvod); Přidat (‚Text:‘ + SrcText); Přidat (‚Řádek:‘ + IntToStr (Řádek)); Přidat (‚Position:‘ + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); Konec;</p><p>a spusťte naši aplikaci. V důsledku toho získáme následující informace o chybě.</p> <p>Jak můžete vidět z výše uvedeného příkladu, informace vrácené objektem XMLDOMParseError jsou dostatečné k lokalizaci chyby a pochopení příčiny jejího výskytu.</p> <p>Nyní obnovíme uzavírací prvek <TITLE>v našem dokumentu a pokračujte v diskusi o XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Přístup ke stromu dokumentů</h2> <p>Chcete-li získat přístup ke stromu dokumentů, můžete buď získat kořenový prvek a poté iterovat jeho podřízené větve, nebo najít konkrétní větev. V prvním případě získáváme kořenový element prostřednictvím vlastnosti DocumentElement, která vrací objekt typu XMLDOMNode. Zde je návod, jak použít vlastnost DocumentElement k získání obsahu každého podřízeného prvku:</p><p>Var Node: IXMLDOMNode; Kořen: IXMLDOMElement; I: celé číslo; ... Kořen: = XMLDoc.DocumentElement; Pro I: = 0 až Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); Konec;</p><p>Pro náš dokument XML získáme následující text.</p> <p>Pokud nás zajímá konkrétní větev nebo větev pod první podřízenou větví, můžeme použít buď metodu NodeFromID nebo metodu GetElementByTagName objektu XMLDOMDocument.</p> <p>Metoda NodeFromID vyžaduje jedinečný identifikátor definovaný v XML Schema nebo Document Type Definition (DTD) a vrací větev s tímto identifikátorem.</p> <p>Metoda GetElementByTagName vyžaduje řetězec s konkrétním prvkem (tag) a vrací všechny větve s tímto prvkem. Zde je návod, jak použít tuto metodu k nalezení všech umělců v našem adresáři CD-ROM:</p><p>Uzly: IXMLDOMNodeList; Uzel: IXMLDOMNode; ... Nodes: = XMLDoc.GetElementsByTagName (‚ARTIST‘); Pro I: = 0 až Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Node.Text); Konec;</p><p>Pro náš dokument XML získáme následující text</p> <p>Všimněte si, že metoda SelectNodes objektu XMLDOMNode poskytuje flexibilnější způsob přístupu k větvím dokumentu. Ale o tom více níže.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Větev dokumentu - Objekt XMLDOMNode</h2> <p>Objekt XMLDOMNode představuje větev dokumentu. S tímto objektem jsme se již setkali, když jsme získali kořenový prvek dokumentu:</p><p>Kořen: = XMLDoc.DocumentElement;</p><p>Chcete-li získat informace o větvi dokumentu XML, můžete použít vlastnosti objektu XMLDOMNode (tabulka 1).</p> <p>Pro přístup k datům uloženým ve větvi se běžně používá buď vlastnost NodeValue (dostupná pro atributy, textové větve, komentáře, instrukce pro zpracování a sekce CDATA), nebo vlastnost Text, která vrací textový obsah větve, nebo vlastnost NodeTypedValue. Ten však lze použít pouze pro pobočky s napsanými položkami.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Procházení stromu dokumentů</h3> <p>Objekt XMLDOMNode poskytuje mnoho způsobů, jak procházet strom dokumentu. Například pro přístup k nadřazené větvi použijte vlastnost ParentNode (typ XMLDOMNode), přistupujte k podřízeným větvím prostřednictvím vlastností ChildNodes (typ XMLDOMNodeList), FirstChild a LastChild (typ XMLDOMNode) atd. Vlastnost OwnerDocument vrací objekt XMLDOMDocument, který identifikuje samotný dokument XML. Výše uvedené vlastnosti usnadňují navigaci ve stromu dokumentu.</p> <p>Nyní projdeme všechny větve dokumentu XML:</p><p>Kořen: = XMLDoc.DocumentElement; Pro I: = 0 až Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Uzel, 0); Konec;</p><p>Jak bylo uvedeno výše, SelectNodes objektu XMLDOMNode poskytuje flexibilnější způsob přístupu k větvím dokumentu. Navíc existuje metoda SelectSingleNode, která vrací pouze první větev dokumentu. Obě tyto metody umožňují definovat šablony XSL pro vyhledávání větví.</p> <p>Podívejme se na proces použití metody SelectNodes k načtení všech větví, které mají větev CD a dílčí větev PRICE:</p><p>Kořen: = XMLDoc.DocumentElement; Nodes: = Root.SelectNodes (‚CD / CENA‘);</p><p>Všechny dílčí větve PRICE větve CD budou umístěny do kolekce Nodes. K diskusi o šablonách XSL se vrátíme o něco později.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulace s dětskými ratolestmi</h3> <p>Pro manipulaci s podřízenými větvemi můžeme použít metody objektu XMLDOMNode (tabulka 2).</p> <p>Chcete-li zcela odstranit záznam o prvním disku, musíte spustit následující kód:</p><p>Var XMLDoc: IXMLDOMDocument; Kořen: IXMLDOMNode; Uzel: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získání kořenového prvku Root: = XMLDoc.DocumentElement; Uzel: = Kořen; // Odebere první podřízenou větev Node.RemoveChild (Node.FirstChild);</p><p>Všimněte si, že v tomto příkladu odstraňujeme první podřízenou větev. Jak odstranit první prvek první podřízené větve je znázorněno níže:</p><p>Var XMLDoc: IXMLDOMDocument; Kořen: IXMLDOMNode; Uzel: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.Load (‘C: \ DATA \ DATA.xml‘); // Získání kořenového prvku Root: = XMLDoc.DocumentElement; // a první podřízená větev Uzel: = Root.FirstChild; // Odebere první podřízenou větev Node.RemoveChild (Node.FirstChild);</p><p>Ve výše uvedeném příkladu jsme neodstranili první větev <CD>…</CD> a prvním prvkem větve je <TITLE>….

Nyní přidáme novou větev. Níže je uveden kód, který ukazuje, jak přidat nový záznam hudebního disku CD-ROM:

Var NewNode: IXMLDOMNode; Podřízený: IXMLDOMNode; ... // Vytvořit novou větev - NewNode: = XMLDoc.CreateNode (1, ‚CD‘, ‚‘); // Přidání prvku Child: = XMLDoc.CreateNode (1, 'TITLE', ''); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘Pink Floyd’; // Přidání prvku <ARTIST>Child: = XMLDoc.CreateNode (1, 'ARTIST', ''); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘Division Bell’; // Přidání prvku <COUNTRY>Dítě: = XMLDoc.CreateNode (1, ‚ZEMĚ‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘UK’; // Přidání prvku <COMPANY>Dítě: = XMLDoc.CreateNode (1, ‚SPOLEČNOST‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘EMI Records Ltd.’; // Přidání prvku <PRICE>Podřízené: = XMLDoc.CreateNode (1, ‚PRICE‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = '11 .99 "; // Přidejte prvek <YEAR>Child: = XMLDoc.CreateNode (1, ‚YEAR‘, ‚‘); // Přidání prvku NewNode.AppendChild (Child); // A nastavte jeho hodnotu Child.Text: = ‘1994’; // A přidáme větev Root.AppendChild (NewNode); ...</p><p>Výše uvedený kód ukazuje následující sekvenci kroků pro přidání nové větve:</p> <ul><li>Vytvoření nové větve pomocí metody CreateNode: <ul><li>vytvoření prvku pomocí metody CreateNode;</li> <li>přidání prvku do větve pomocí metody AppendChild;</li> <li>nastavení hodnoty prvku pomocí vlastnosti Text;</li> <li>… Opakujte pro všechny prvky.</li> </ul></li> <li>Přidání nové větve do dokumentu pomocí metody AppendChild.</li> </ul><p>Připomeňme, že metoda AppendChild přidá větev na konec stromu. Chcete-li přidat větev na konkrétní místo ve stromu, musíte použít metodu InsertBefore.</p> <h2>Sada větví - objekt XMLDOMNodeList</h2> <p>Objekt XMLNodeList obsahuje seznam větví, které lze sestavit pomocí metod SelectNodes nebo GetElementsByTagName a také získat z vlastnosti ChildNodes.</p> <p>Použití tohoto objektu jsme již probrali v příkladu uvedeném v části „Navigace ve stromu dokumentů“. Zde uvedeme několik teoretických komentářů.</p> <p>Počet větví v seznamu lze získat jako hodnotu vlastnosti Délka. Větve jsou indexovány od 0 do Délka-1 a každá jednotlivá větev je přístupná prostřednictvím odpovídající indexované položky v poli Item.</p> <p>Procházení seznamu větví lze také provést pomocí metody NextNode, která vrátí další větev v seznamu nebo Nil, pokud je aktuální větev poslední. Chcete-li se vrátit na začátek seznamu, zavolejte metodu Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Vytvářejte a ukládejte dokumenty</h2> <p>Probrali jsme tedy, jak můžete přidat větve a prvky do existujících dokumentů XML. Nyní vytvoříme dokument XML za běhu. V první řadě si pamatujte, že dokument lze načíst nejen z adresy URL, ale také z běžného řetězce. Zde je návod, jak vytvořit kořenový prvek, který pak lze použít k dynamickému sestavení zbytku prvků (které jsme již probrali v sekci Manipulace podřízených větví):</p><p>Var XMLDoc: IXMLDOMDocument; Kořen: IXMLDOMNode; Uzel: IXMLDOMNode; S: WideString; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = False; XMLDoc.LoadXML (S); Kořen: = XMLDoc.DocumentElement; Uzel: = XMLDoc.CreateNode (1, ‚CD‘, ‚‘); Root.AppendChild (Uzel); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Nil;</p><p>Po vytvoření dokumentu XML jej uložte do souboru pomocí metody Save. Například:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Kromě uložení do souboru vám metoda Save umožňuje uložit dokument XML do nového objektu XMLDOMDocument. V tomto případě je dokument plně zpracován a v důsledku toho je zkontrolována jeho struktura a syntaxe. Zde je návod, jak uložit dokument do jiné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: = Nil; konec;</p><p>Závěrem, metoda Save také umožňuje uložit dokument XML do jiných objektů COM, které podporují rozhraní IStream, IPersistStream nebo IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Použití šablon XSL</h2> <p>Když jsme probírali metodu SelectNodes objektu XMLDOMNode, zmínili jsme se, že poskytuje flexibilnější způsob přístupu k větvím dokumentu. Flexibilita spočívá v tom, že jako kritéria pro výběr větví můžete zadat šablonu XSL. Tyto šablony poskytují výkonný mechanismus pro vyhledávání informací v dokumentech XML. Chcete-li například získat seznam všech titulů hudebních CD-ROM v našem adresáři, můžete spustit následující dotaz:</p><p>Chcete-li zjistit, které disky umělců jsou vydány v USA, je požadavek vytvořen následovně:</p><p>Nodes: = Root.SelectNodes (‚CD / ARTIST‘);</p><p>Zde je návod, jak najít první jednotku v adresáři:</p><p>Nodes: = Root.SelectNodes (‚CD / TITLE‘);</p><p>A poslední:</p><p>Nodes: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Chcete-li najít disky Boba Dylana, můžete spustit následující dotaz:</p><p>Nodes: = Root.SelectNodes (‘CD [$ any $ ARTIST =” Bob Dylan ”] / TITLE’);</p><p>a abychom získali seznam disků vyrobených po roce 1985, spustíme následující dotaz:</p><p>Nodes: = Root.SelectNodes (‚CD / TITLE‘);</p><p>Podrobnější popis syntaxe XSL vyžaduje samostatnou publikaci. Abych čtenáře zaujal a povzbudil k dalšímu výzkumu, uvedu jen jeden malý příklad možného použití XSL. Řekněme, že potřebujeme převést náš katalog na běžnou HTML tabulku. Pomocí tradičních metod musíme iterovat přes všechny větve stromu a pro každý přijatý prvek vytvořit odpovídající tagy <TD>…</TD>.</p> <p>Pomocí XSL jednoduše vytvoříme šablonu (nebo šablonu stylů), která specifikuje, co a jak transformovat. Poté tuto šablonu překryjeme v našem katalogu – a máte hotovo: máme text šablony XSL, která převede katalog na tabulku (Výpis 2).</p> <p>Kód pro překrytí šablony XSL v našem adresáři vypadá 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; konec;</p><p>Na závěr naší diskuse o XSL je třeba říci, že v současné době se tento jazyk aktivně používá pro transformaci mezi různými dokumenty XML a také pro formátování dokumentů.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Závěr</h2> <p>Z pochopitelných důvodů není možné pokrýt všechny objekty Microsoft XML DOM a uvést příklady jejich použití v jednom článku. Zde jsme se právě dotkli základních otázek používání XML DOM v aplikacích. Stůl 3 ukazuje všechny objekty implementované v Microsoft XML DOM.</p> <p>ComputerPress 12 "2000</p> <p>Všechny vítám! Několik let jsem psal v Matlabu a pak jsem byl netrpělivý, abych napsal program v Delphi.</p><p>Potřebuji se naučit pracovat s xml dokumenty. Pracuji ve společnosti RAD Stiduo XE3. Existuje komponenta TXMLDocument, pravděpodobně známá mnoha programátorům Delphi. Zdá se, že toho dokáže hodně. Problém je ale v tom, že k tomu neexistuje jasná dokumentace a popis. Pomoc v RAD Studiu je svinstvo, protože tam nejsou žádné normální informace; pouze roztroušeně po stránkách skrovné nápovědy k některým metodám a postupům (žádné příklady a normální popis). Prohrabaný celým internetem. Nalezená pouze témata na fórech s řešením konkrétních problémů, kde musíte další hodinu hádat, co dělá ten či onen řádek spojený s přístupem k xml souboru. <br>Dále potřebuji manuál o hlavních funkcích, postupech a metodách používaných při práci s xml. Učebnice, manuál, popis. Nebo alespoň "xml v Delphi pro figuríny". Například:</p><p><i>Chcete-li otevřít soubor xml, použijte metodu XMLDocument1.LoadFromFile ("filemane.xml"), kde název_souboru je název souboru. <br>Proměnná nodelist typu IXMLNode slouží k uložení seznamu potomků. K definování tohoto seznamu se používá metoda Xmldocument1.DocumentElement (kde XMLDocument1 je soubor xml, který má být zkoumán). <br>K dotazu na obsah podřízeného prvku "element1" použijte metodu XMLDocument1.DocumentElement.ChildNodes ["element1"]. <br></i><br>a v tomto duchu dále na všechny aplikované metody, postupy, datové typy. <br>Kde najdu podobné návody/popisy? Kdo může pomoci?</p><p>Pokud potřebujete konkrétní úkol, popíšu ho. <br>Existuje xml dokument formuláře:</p><p> <br><ltm version="1.0" type="settings" ><br><progname>LTM</progname></p><p><templateFiles><br> <assets>fon.png</assets><br> <assets>up.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">Nějaký text</data><br><data name="onerror" mode="noVoice">Nějaký text chyby</data><br><data name="onerror" mode="alarm">Jiný text chyby</data></p><p>V kódu programu máme:</p><p>var <br>...<br>rodič, potomek1: IXMLNode;</p><p>začít <br>XMLDocument1.LoadFromFile ("f: \ název_souboru.x ml"); <br>XMLDocument1.Active: = true; <br>.<br>.<br>konec</p><p>Co se musíte naučit dělat: <br>(předem se omlouvám, pokud nesprávně pojmenuji součásti xml dokumentu) <br>1. Získejte jméno kořenového prvku (v našem případě ltm) a také seznam jeho atributů (verze, typ) a jejich hodnot ("1.0", "nastavení"). <br>2. Získejte počet prvků, které jsou potomky kořene. V tomto případě je jich 7: templateFiles, dimenze, hotspot, hotspot, data, data, data. Získejte názvy prvků (tagů) (templateFiles, dimenze atd.). Poté, co získám počet prvků a naučím se, jak extrahovat jejich jména, budu opakovat od 0 do počtu-1 a udělám, co potřebuji. <br>3. Získejte číslo a seznam atributů požadovaného prvku. Například pro prvek hotspot. Správná odpověď by byla 4 atributy. U prvního aktivního prvku to budou jméno, styl, scéna, ath. Pro druhý - stejný, jen místo atributu ath - atribut rz. <br>Všimněte si, že v souboru jsou 2 prvky aktivního bodu s různými atributy. Zde je návod, jak s nimi pracovat (pokud existuje více než 1 prvek stejného názvu)? <br>Chci takto: Dostanu seznam dětí podle rel. ke kořenovému (viz str. 2), proveďte přes ně smyčku for a najděte prvky aktivního bodu, ve kterých se parametr name rovná požadovanému (řekněme "hs015_2" - jeden takový prvek určitě bude). Je možné nějak vyřešit tento problém bez smyčky? To znamená, získat hodnotu atributu scény pro prvek hotspot s názvem = "hs015_2"? <br>4. Výše ​​uvedené proveďte pro uzly a prvky, které jsou ve vztahu k dětem děti. V mém příkladu uzel (potomek a rodič a. <br>Pokud tomu dobře rozumím, musíte nějak přenést obsah uzlu do <a href="https://obanracer.ru/cs/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">variabilní jako</a> IXMLNode a proveďte totéž jako v položkách 1-3. Tak?</p><p>5. Musíte se naučit, jak změnit výše uvedené parametry (nastavit si vlastní).</p><p>Zdá se to zatím. V této fázi jsou pro mě nejdůležitější syntaktické konstrukce. <br>Kdo vlastní toto téma, napište prosím další syntaktické konstrukce k vyřešení výše uvedených problémů (jak získat atributy, jejich počet, počet prvků, jejich názvy atd.). Hlavní věcí je nyní zvládnout syntaxi a svůj algoritmus implementuji později. Předem moc děkuji!</p><p>P.S. Opravdu bych nechtěl psát svůj vlastní XML parser od začátku jen proto, že neexistuje žádný normální popis pro ty stávající.</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>Předchozí článek</span><a href="https://obanracer.ru/cs/obrazec-iskovogo-zayavleniya-o-poteri-posylki-pretenziya-o.html">Nárok na náhradu škody způsobené ztrátou poštovních zásilek (zásilka na území Ruské federace)</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>Další článek</span><a href="https://obanracer.ru/cs/protokol-marshrutizacii-ip-protokoly-marshrutizacii-v-ip-setyah-opredelenie-marshruta.html">Směrovací protokoly v IP sítích Určení trasy předávání informací</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/cs/author/iulia">Julie</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/cs/informacionnye-tehnologii-kem-rabotat-informacionnye-sistemy-i.html" rel="bookmark" title="Informační systémy a technologie - bakalářský titul (09"><img width="218" height="150" class="entry-thumb" src="/uploads/9b8c2efb87ad34acafefbd0edba2df1e.jpg" alt="Informační systémy a technologie - bakalářský titul (09" title="Informační systémy a technologie - bakalářský titul (09"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/the-winchesters/" class="td-post-category">Winchesterové</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/informacionnye-tehnologii-kem-rabotat-informacionnye-sistemy-i.html" rel="bookmark" title="Informační systémy a technologie - bakalářský titul (09">Informační systémy a technologie - bakalářský titul (09</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/cs/prilozhenie-kopii-dokumentov-na-listah-kak-oformit-prilozhenie-k-dokumentu.html" rel="bookmark" title="Jak uspořádat přílohu k dokumentu"><img width="218" height="150" class="entry-thumb" src="/uploads/24f6bc0d4f465443e5f2a83c317f14b2.jpg" alt="Jak uspořádat přílohu k dokumentu" title="Jak uspořádat přílohu k dokumentu"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/motherboard/" class="td-post-category">základní desky</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/prilozhenie-kopii-dokumentov-na-listah-kak-oformit-prilozhenie-k-dokumentu.html" rel="bookmark" title="Jak uspořádat přílohu k dokumentu">Jak uspořádat přílohu k dokumentu</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/cs/chto-takoe-teleks-formaty-swift-na-primere-mt103-apparat-bodo-novyi-etap.html" rel="bookmark" title="Formáty SWIFT (například MT103)"><img width="218" height="150" class="entry-thumb" src="/uploads/7e5935aeca893f822e1294eea0e7533e.jpg" alt="Formáty SWIFT (například MT103)" title="Formáty SWIFT (například MT103)"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/security/" class="td-post-category">Bezpečnost</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/chto-takoe-teleks-formaty-swift-na-primere-mt103-apparat-bodo-novyi-etap.html" rel="bookmark" title="Formáty SWIFT (například MT103)">Formáty SWIFT (například MT103)</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/cs/kak-zaregistrirovatsya-v-email-kak-sozdat-elektronnuyu-pochtu.html" rel="bookmark" title="Jak vytvořím e-mail?"><img width="218" height="150" class="entry-thumb" src="/uploads/8add7460c5e68a7fcbe8d442b3cfb0e0.jpg" alt="Jak vytvořím e-mail?" title="Jak vytvořím e-mail?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/monitors/" class="td-post-category">Monitory</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/kak-zaregistrirovatsya-v-email-kak-sozdat-elektronnuyu-pochtu.html" rel="bookmark" title="Jak vytvořím e-mail?">Jak vytvořím e-mail?</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/cs/sklonenie-familii-v-aksess-kak-sdelat-sklonenie-po-padezham-v-excel.html" rel="bookmark" title="Jak skloňovat malá a velká písmena v Excelu?"><img width="218" height="150" class="entry-thumb" src="/uploads/1a063eb5d57ec77d68811bd85cf35dfc.jpg" alt="Jak skloňovat malá a velká písmena v Excelu?" title="Jak skloňovat malá a velká písmena v Excelu?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/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/cs/sklonenie-familii-v-aksess-kak-sdelat-sklonenie-po-padezham-v-excel.html" rel="bookmark" title="Jak skloňovat malá a velká písmena v Excelu?">Jak skloňovat malá a velká písmena v Excelu?</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/cs/xml-web-services-obzor-tehnologii-chto-takoe-veb-servis-chto-takoe-web.html" rel="bookmark" title="Webové služby XML. Přehled technologie. Co je webová služba Co je webová služba"><img width="218" height="150" class="entry-thumb" src="/uploads/27b318ee0e2c5747e48ac75ce26612f2.jpg" alt="Webové služby XML. Přehled technologie. Co je webová služba Co je webová služba" title="Webové služby XML. Přehled technologie. Co je webová služba Co je webová služba"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/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/cs/xml-web-services-obzor-tehnologii-chto-takoe-veb-servis-chto-takoe-web.html" rel="bookmark" title="Webové služby XML. Přehled technologie. Co je webová služba Co je webová služba">Webové služby XML. Přehled technologie. Co je webová služba Co je webová služba</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/cs/kak-generirovat-dokumenty-v-word-exwog---generator-otchetov-iz-excel.html" rel="bookmark" title="Exwog - generátor sestav z Excelu do Wordu podle šablony"><img width="218" height="150" class="entry-thumb" src="/uploads/b1d6337690171fefbf0855b8728de005.jpg" alt="Exwog - generátor sestav z Excelu do Wordu podle šablony" title="Exwog - generátor sestav z Excelu do Wordu podle šablony"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/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/cs/kak-generirovat-dokumenty-v-word-exwog---generator-otchetov-iz-excel.html" rel="bookmark" title="Exwog - generátor sestav z Excelu do Wordu podle šablony">Exwog - generátor sestav z Excelu do Wordu podle šablony</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/cs/facebook-stanet-platnym-s-noyabrya-etogo-goda-facebook-vvodit-platnye.html" rel="bookmark" title="Facebook zavádí placené skupiny"><img width="218" height="150" class="entry-thumb" src="/uploads/71a5e2b97104dd95f291d63c219f70ad.jpg" alt="Facebook zavádí placené skupiny" title="Facebook zavádí placené skupiny"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/processors/" class="td-post-category">Procesory</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/facebook-stanet-platnym-s-noyabrya-etogo-goda-facebook-vvodit-platnye.html" rel="bookmark" title="Facebook zavádí placené skupiny">Facebook zavádí placené skupiny</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/cs/kakoi-kod-u-zelenogo-cveta-cvet-v-stilyah-mozhno-zadavat.html" rel="bookmark" title="Barvu ve stylech lze nastavit různými způsoby: pomocí hexadecimální hodnoty, podle názvu, ve formátu RGB, RGBA, HSL, HSLA"><img width="218" height="150" class="entry-thumb" src="/uploads/e6affc7799bc46d3cd515f1c1fb778a5.jpg" alt="Barvu ve stylech lze nastavit různými způsoby: pomocí hexadecimální hodnoty, podle názvu, ve formátu RGB, RGBA, HSL, HSLA" title="Barvu ve stylech lze nastavit různými způsoby: pomocí hexadecimální hodnoty, podle názvu, ve formátu RGB, RGBA, HSL, HSLA"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/power-supply/" class="td-post-category">Zásoby energie</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/kakoi-kod-u-zelenogo-cveta-cvet-v-stilyah-mozhno-zadavat.html" rel="bookmark" title="Barvu ve stylech lze nastavit různými způsoby: pomocí hexadecimální hodnoty, podle názvu, ve formátu RGB, RGBA, HSL, HSLA">Barvu ve stylech lze nastavit různými způsoby: pomocí hexadecimální hodnoty, podle názvu, ve formátu RGB, RGBA, HSL, HSLA</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">Doporučeno</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/cs/kak-uznat-skolki-yadernyi-processor-stoit-v-kompyutere-skolko-yader-v.html" rel="bookmark" title="Kolik jader je v počítači nebo notebooku (2 způsoby zobrazení) Jak zjistit počet procesorů"><img width="324" height="235" class="entry-thumb" src="/uploads/30dbf37026217d2b050672d00a0dfff1.jpg" alt="Kolik jader je v počítači nebo notebooku (2 způsoby zobrazení) Jak zjistit počet procesorů" title="Kolik jader je v počítači nebo notebooku (2 způsoby zobrazení) Jak zjistit počet procesorů"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/cs/category/case/" class="td-post-category">Pouzdra</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/kak-uznat-skolki-yadernyi-processor-stoit-v-kompyutere-skolko-yader-v.html" rel="bookmark" title="Kolik jader je v počítači nebo notebooku (2 způsoby zobrazení) Jak zjistit počet procesorů">Kolik jader je v počítači nebo notebooku (2 způsoby zobrazení) Jak zjistit počet procesorů</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Dobré odpoledne. Při koupi počítače se každý z nás snaží vybrat lepší počítač. Více RAM, více pevného disku a všechno by mělo být nejlepší ...</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/cs/kak-pochistit-kesh-v-mozile-mozilla-firefox-kak-ochistit-kesh-v-mozile.html" rel="bookmark" title="Jak vymazat mezipaměť v muffu rychle a trvale Jak vymazat mezipaměť v muffu"><img width="100" height="70" class="entry-thumb" src="/uploads/7eea196d3b1d7c840670bd05d53e677a.jpg" alt="Jak vymazat mezipaměť v muffu rychle a trvale Jak vymazat mezipaměť v muffu" title="Jak vymazat mezipaměť v muffu rychle a trvale Jak vymazat mezipaměť v muffu"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/kak-pochistit-kesh-v-mozile-mozilla-firefox-kak-ochistit-kesh-v-mozile.html" rel="bookmark" title="Jak vymazat mezipaměť v muffu rychle a trvale Jak vymazat mezipaměť v muffu">Jak vymazat mezipaměť v muffu rychle a trvale Jak vymazat mezipaměť v muffu</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/cs/category/graphics-card/" class="td-post-category">Video karty</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/cs/chto-takoe-router-dlya-doma-chto-takoe-wifi-router-i-dlya-chego-on-nuzhen.html" rel="bookmark" title="Co je to WiFi router a k čemu doma slouží?"><img width="100" height="70" class="entry-thumb" src="/uploads/15f490857f1a7fb3168a8806e29f550a.jpg" alt="Co je to WiFi router a k čemu doma slouží?" title="Co je to WiFi router a k čemu doma slouží?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/chto-takoe-router-dlya-doma-chto-takoe-wifi-router-i-dlya-chego-on-nuzhen.html" rel="bookmark" title="Co je to WiFi router a k čemu doma slouží?">Co je to WiFi router a k čemu doma slouží?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/cs/category/the-winchesters/" class="td-post-category">Winchesterové</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/cs/chto-daet-termopasta-chto-takoe-termopasta-i-kak-ee-nanosit.html" rel="bookmark" title="Co je teplovodivá pasta a jak ji nanáším?"><img width="100" height="70" class="entry-thumb" src="/uploads/1a2dab3fb12ccad63627b7abe32cfd0a.jpg" alt="Co je teplovodivá pasta a jak ji nanáším?" title="Co je teplovodivá pasta a jak ji nanáším?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/chto-daet-termopasta-chto-takoe-termopasta-i-kak-ee-nanosit.html" rel="bookmark" title="Co je teplovodivá pasta a jak ji nanáším?">Co je teplovodivá pasta a jak ji nanáším?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/cs/category/case/" class="td-post-category">Pouzdra</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/cs/kak-vyzvat-ekstrennye-sluzhby-kak-vyzvat-pozharnyh-i.html" rel="bookmark" title="Jak volat hasiče a záchranáře z mts"><img width="100" height="70" class="entry-thumb" src="/uploads/cf02c9d3bf671a2de0d4889811143f8a.jpg" alt="Jak volat hasiče a záchranáře z mts" title="Jak volat hasiče a záchranáře z mts"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/kak-vyzvat-ekstrennye-sluzhby-kak-vyzvat-pozharnyh-i.html" rel="bookmark" title="Jak volat hasiče a záchranáře z mts">Jak volat hasiče a záchranáře z mts</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/cs/category/the-winchesters/" class="td-post-category">Winchesterové</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/cs/kak-zavershit-seansy-v-vk-kak-vyiti-iz-kontakta-na-android-ne-zahodya-v.html" rel="bookmark" title="Jak se odhlásit z Kontaktu na Androidu"><img width="100" height="70" class="entry-thumb" src="/uploads/8b512786d5668528c3f82a7e3830da5e.jpg" alt="Jak se odhlásit z Kontaktu na Androidu" title="Jak se odhlásit z Kontaktu na Androidu"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/kak-zavershit-seansy-v-vk-kak-vyiti-iz-kontakta-na-android-ne-zahodya-v.html" rel="bookmark" title="Jak se odhlásit z Kontaktu na Androidu">Jak se odhlásit z Kontaktu na Androidu</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/cs/category/motherboard/" class="td-post-category">základní desky</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/cs/obnovlyaem-brauzer-internet-explorer-do-aktualnoi-versii-internet-explorer-zachem-obnovlyat.html" rel="bookmark" title="Internet Explorer: proč a jak aktualizovat prohlížeč Jak aktualizovat např. 8 na nejnovější verzi"><img width="100" height="70" class="entry-thumb" src="/uploads/cfaf137f6a2cca48db60cc94c0bd4ccd.jpg" alt="Internet Explorer: proč a jak aktualizovat prohlížeč Jak aktualizovat např. 8 na nejnovější verzi" title="Internet Explorer: proč a jak aktualizovat prohlížeč Jak aktualizovat např. 8 na nejnovější verzi"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/cs/obnovlyaem-brauzer-internet-explorer-do-aktualnoi-versii-internet-explorer-zachem-obnovlyat.html" rel="bookmark" title="Internet Explorer: proč a jak aktualizovat prohlížeč Jak aktualizovat např. 8 na nejnovější verzi">Internet Explorer: proč a jak aktualizovat prohlížeč Jak aktualizovat např. 8 na nejnovější verzi</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/cs/category/windows-7/" class="td-post-category">Windows 7</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/cs/esli-na-zhestkom-diske-malo-mesta-chistim-disk-c-ot-nenuzhnyh-failov-i.html" rel="bookmark" title="Vyčistěte jednotku C od nepotřebných souborů a uvolněte místo"><img width="218" height="150" class="entry-thumb" src="/uploads/9e242de6c9e0fe10768b17660f171b20.jpg" alt="Vyčistěte jednotku C od nepotřebných souborů a uvolněte místo" title="Vyčistěte jednotku C od nepotřebných souborů a uvolněte místo"/ 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/cs/esli-na-zhestkom-diske-malo-mesta-chistim-disk-c-ot-nenuzhnyh-failov-i.html" rel="bookmark" title="Vyčistěte jednotku C od nepotřebných souborů a uvolněte místo">Vyčistěte jednotku C od nepotřebných souborů a uvolněte místo</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/cs/brauzer-chto-eto-takoe-prostymi-slovami-i-kakoi-iz-nih-samyi.html" rel="bookmark" title="Podívejme se, co je prohlížeč Co to znamená vstoupit do prohlížeče"><img width="218" height="150" class="entry-thumb" src="/uploads/9e167ce490c28397856c71568eb3bad8.jpg" alt="Podívejme se, co je prohlížeč Co to znamená vstoupit do prohlížeče" title="Podívejme se, co je prohlížeč Co to znamená vstoupit do prohlížeče"/ 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/cs/brauzer-chto-eto-takoe-prostymi-slovami-i-kakoi-iz-nih-samyi.html" rel="bookmark" title="Podívejme se, co je prohlížeč Co to znamená vstoupit do prohlížeče">Podívejme se, co je prohlížeč Co to znamená vstoupit do prohlížeče</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/cs/net-pamyati-na-diske-s-chto-delat-esli-net-mesta-na-diske-s-v-windows-nahodim-i.html" rel="bookmark" title="Co dělat, když na jednotce C ve Windows není místo?"><img width="218" height="150" class="entry-thumb" src="/uploads/b63e09e695f91c56f1018c83ca98f8ae.jpg" alt="Co dělat, když na jednotce C ve Windows není místo?" title="Co dělat, když na jednotce C ve Windows není místo?"/ 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/cs/net-pamyati-na-diske-s-chto-delat-esli-net-mesta-na-diske-s-v-windows-nahodim-i.html" rel="bookmark" title="Co dělat, když na jednotce C ve Windows není místo?">Co dělat, když na jednotce C ve Windows není místo?</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/cs/pochemu-telefon-ne-zaryazhaetsya-ot-zaryadnogo-ustroistva-pochemu.html" rel="bookmark" title="Proč se telefon nenabíjí přes USB z počítače?"><img width="218" height="150" class="entry-thumb" src="/uploads/d6b35cd2b9067aa8cf47eacfa98a1bb5.jpg" alt="Proč se telefon nenabíjí přes USB z počítače?" title="Proč se telefon nenabíjí přes USB z počítače?"/ 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/cs/pochemu-telefon-ne-zaryazhaetsya-ot-zaryadnogo-ustroistva-pochemu.html" rel="bookmark" title="Proč se telefon nenabíjí přes USB z počítače?">Proč se telefon nenabíjí přes USB z počítače?</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/cs/pochemu-ne-rabotaet-yutub-izbavlyaemsya-ot-oshibok-videohostinga.html" rel="bookmark" title="Zbavte se chyb hostování videa"><img width="218" height="150" class="entry-thumb" src="/uploads/5b9bfda40ffc5ba65ebac43981923d53.jpg" alt="Zbavte se chyb hostování videa" title="Zbavte se chyb hostování videa"/ 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/cs/pochemu-ne-rabotaet-yutub-izbavlyaemsya-ot-oshibok-videohostinga.html" rel="bookmark" title="Zbavte se chyb hostování videa">Zbavte se chyb hostování videa</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/cs/kak-otklyuchit-privyazku-telefona-v-kontakte-kak-vkontakte-otvyazat.html" rel="bookmark" title="Jak může „VKontakte“ odpojit stránku od telefonního čísla?"><img width="218" height="150" class="entry-thumb" src="/uploads/6d85d7b029abf982aba128a4e5c20087.jpg" alt="Jak může „VKontakte“ odpojit stránku od telefonního čísla?" title="Jak může „VKontakte“ odpojit stránku od telefonního čísla?"/ 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/cs/kak-otklyuchit-privyazku-telefona-v-kontakte-kak-vkontakte-otvyazat.html" rel="bookmark" title="Jak může „VKontakte“ odpojit stránku od telefonního čísla?">Jak může „VKontakte“ odpojit stránku od telefonního čísla?</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/cs/kak-otvyazat-telefon-ot-staroi-stranicy-vk-kak-otvyazat-nomer-ot.html" rel="bookmark" title="Jak uvolnit číslo ze stránky VKontakte?"><img width="218" height="150" class="entry-thumb" src="/uploads/426b3e73860dfab26c256ab3186421fb.jpg" alt="Jak uvolnit číslo ze stránky VKontakte?" title="Jak uvolnit číslo ze stránky VKontakte?"/ 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/cs/kak-otvyazat-telefon-ot-staroi-stranicy-vk-kak-otvyazat-nomer-ot.html" rel="bookmark" title="Jak uvolnit číslo ze stránky VKontakte?">Jak uvolnit číslo ze stránky VKontakte?</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/cs/pochtovye-golubi-shpiony-soldaty-i-fotoreport-ry-golubinaya-pochta-kak.html" rel="bookmark" title="Holubí pošta: Jak se z ptáků stali pošťáci a posláni, aby sloužili na frontě "vojensko-holubí povinnost v SSSR""><img width="218" height="150" class="entry-thumb" src="/uploads/0bce0765fab4be9c695a07b444724247.jpg" alt="Holubí pošta: Jak se z ptáků stali pošťáci a posláni, aby sloužili na frontě "vojensko-holubí povinnost v SSSR"" title="Holubí pošta: Jak se z ptáků stali pošťáci a posláni, aby sloužili na frontě "vojensko-holubí povinnost v SSSR""/ 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/cs/pochtovye-golubi-shpiony-soldaty-i-fotoreport-ry-golubinaya-pochta-kak.html" rel="bookmark" title="Holubí pošta: Jak se z ptáků stali pošťáci a posláni, aby sloužili na frontě "vojensko-holubí povinnost v SSSR"">Holubí pošta: Jak se z ptáků stali pošťáci a posláni, aby sloužili na frontě "vojensko-holubí povinnost v SSSR"</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/cs/golubinaya-pochta-kak-rabotaet-principy-raboty-golubinoi-pochty-na-chem.html" rel="bookmark" title="Jak funguje holubí pošta Na čem je založen instinkt návratu domů?"><img width="218" height="150" class="entry-thumb" src="/uploads/0bce0765fab4be9c695a07b444724247.jpg" alt="Jak funguje holubí pošta Na čem je založen instinkt návratu domů?" title="Jak funguje holubí pošta Na čem je založen instinkt návratu domů?"/ 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/cs/golubinaya-pochta-kak-rabotaet-principy-raboty-golubinoi-pochty-na-chem.html" rel="bookmark" title="Jak funguje holubí pošta Na čem je založen instinkt návratu domů?">Jak funguje holubí pošta Na čem je založen instinkt návratu domů?</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/cs/kogda-den-rozhdeniya-u-richarda-hammonda-richard-hammond-filmy-foto-i-lichnaya.html" rel="bookmark" title="Richard Hammond: filmy, fotografie a osobní život herce"><img width="218" height="150" class="entry-thumb" src="/uploads/b7c3cf8dbb97378c043b663cacbefb7e.jpg" alt="Richard Hammond: filmy, fotografie a osobní život herce" title="Richard Hammond: filmy, fotografie a osobní život herce"/ 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/cs/kogda-den-rozhdeniya-u-richarda-hammonda-richard-hammond-filmy-foto-i-lichnaya.html" rel="bookmark" title="Richard Hammond: filmy, fotografie a osobní život herce">Richard Hammond: filmy, fotografie a osobní život herce</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/cs/akusticheskaya-sistema-dzhi-bi-el-sabvufery-jbl-izmereniya-parametrov-kolonki.html" rel="bookmark" title="Akustický systém gbi el"><img width="218" height="150" class="entry-thumb" src="/uploads/b2f538c6c7bd8868ef4d9651ce224a97.jpg" alt="Akustický systém gbi el" title="Akustický systém gbi el"/ 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/cs/akusticheskaya-sistema-dzhi-bi-el-sabvufery-jbl-izmereniya-parametrov-kolonki.html" rel="bookmark" title="Akustický systém gbi el">Akustický systém gbi el</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/cs/akustika-dzhi-bi-el-sabvufery-jbl-istoriya-razvitiya-sabvuferov.html" rel="bookmark" title="Akustika gi bi el. Subwoofery JBL. Historie vývoje subwooferů JBL"><img width="218" height="150" class="entry-thumb" src="/uploads/b2f538c6c7bd8868ef4d9651ce224a97.jpg" alt="Akustika gi bi el. Subwoofery JBL. Historie vývoje subwooferů JBL" title="Akustika gi bi el. Subwoofery JBL. Historie vývoje subwooferů JBL"/ 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/cs/akustika-dzhi-bi-el-sabvufery-jbl-istoriya-razvitiya-sabvuferov.html" rel="bookmark" title="Akustika gi bi el. Subwoofery JBL. Historie vývoje subwooferů JBL">Akustika gi bi el. Subwoofery JBL. Historie vývoje subwooferů JBL</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/cs/obzor-i-testirovanie-plansheta-acer-iconia-w700-gibridnyi-planshet-acer-iconia.html" rel="bookmark" title="Hybridní tablet – Videorecenze a rozbalení Acer Iconia Tab W700"><img width="218" height="150" class="entry-thumb" src="/uploads/8963f5abaa116939d3496e374bc1525e.jpg" alt="Hybridní tablet – Videorecenze a rozbalení Acer Iconia Tab W700" title="Hybridní tablet – Videorecenze a rozbalení Acer Iconia Tab W700"/ 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/cs/obzor-i-testirovanie-plansheta-acer-iconia-w700-gibridnyi-planshet-acer-iconia.html" rel="bookmark" title="Hybridní tablet – Videorecenze a rozbalení Acer Iconia Tab W700">Hybridní tablet – Videorecenze a rozbalení Acer Iconia Tab W700</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/cs/planshetnyi-kompyuter-acer-iconia-w700-acer-iconia-w700-samyi-dostupnyi.html" rel="bookmark" title="Acer Iconia W700: Nejdostupnější Windows tablet s Core i5"><img width="218" height="150" class="entry-thumb" src="/uploads/7e738aceb579075ac02fd0a56d506e01.jpg" alt="Acer Iconia W700: Nejdostupnější Windows tablet s Core i5" title="Acer Iconia W700: Nejdostupnější Windows tablet s Core i5"/ 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/cs/planshetnyi-kompyuter-acer-iconia-w700-acer-iconia-w700-samyi-dostupnyi.html" rel="bookmark" title="Acer Iconia W700: Nejdostupnější Windows tablet s Core i5">Acer Iconia W700: Nejdostupnější Windows tablet s Core i5</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/cs/iexplorer-kopaemsya-v-failah-ios-ustroistv-s-udobstvom-narezaem.html" rel="bookmark" title="IExplorer – pohodlné procházení souborů zařízení iOS"><img width="218" height="150" class="entry-thumb" src="/uploads/82800fdcee23e52c598dca8bdf1e90fd.jpg" alt="IExplorer – pohodlné procházení souborů zařízení iOS" title="IExplorer – pohodlné procházení souborů zařízení iOS"/ 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/cs/iexplorer-kopaemsya-v-failah-ios-ustroistv-s-udobstvom-narezaem.html" rel="bookmark" title="IExplorer – pohodlné procházení souborů zařízení iOS">IExplorer – pohodlné procházení souborů zařízení iOS</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/cs/3d-effekt-v-fotoshope-delaem-anaglif-foto-v-photoshop-i-etap-kadrirovanie.html" rel="bookmark" title="Jak udělat anaglyfovou fotografii ve Photoshopu"><img width="218" height="150" class="entry-thumb" src="/uploads/b6be2998d5587f49135c4f85ccb1e1ad.jpg" alt="Jak udělat anaglyfovou fotografii ve Photoshopu" title="Jak udělat anaglyfovou fotografii ve Photoshopu"/ 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/cs/3d-effekt-v-fotoshope-delaem-anaglif-foto-v-photoshop-i-etap-kadrirovanie.html" rel="bookmark" title="Jak udělat anaglyfovou fotografii ve Photoshopu">Jak udělat anaglyfovou fotografii ve Photoshopu</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/cs/kak-otpravit-soobshchenie-v-zadannoe-vremya-kak-otpravlyat-soobshcheniya-imessage-i-sms-na.html" rel="bookmark" title="Jak posílat iMessages a SMS na iPhone podle plánu"><img width="218" height="150" class="entry-thumb" src="/uploads/77b4823fd82a3e99bcd2951410d767d7.jpg" alt="Jak posílat iMessages a SMS na iPhone podle plánu" title="Jak posílat iMessages a SMS na iPhone podle plánu"/ 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/cs/kak-otpravit-soobshchenie-v-zadannoe-vremya-kak-otpravlyat-soobshcheniya-imessage-i-sms-na.html" rel="bookmark" title="Jak posílat iMessages a SMS na iPhone podle plánu">Jak posílat iMessages a SMS na iPhone podle plánu</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/cs/kak-postavit-taimer-na-soobshchenie-v-vk-kak-otpravlyat-otlozhennye-pisma-na.html" rel="bookmark" title="Jak odesílat zpožděné e-maily na iPhone a iPad"><img width="218" height="150" class="entry-thumb" src="/uploads/112386173ba677a0102ce2f46c853646.jpg" alt="Jak odesílat zpožděné e-maily na iPhone a iPad" title="Jak odesílat zpožděné e-maily na iPhone a 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/cs/kak-postavit-taimer-na-soobshchenie-v-vk-kak-otpravlyat-otlozhennye-pisma-na.html" rel="bookmark" title="Jak odesílat zpožděné e-maily na iPhone a iPad">Jak odesílat zpožděné e-maily na iPhone a iPad</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 2022 – Opravy počítačů a notebooků. 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>