How to work with XML documents in Delphi? Specifically, using TXMLDocument? Using the XML Document Object Model.

For many Delphi programmers, saving settings is associated with using INI files in your programs. The use of this method, in more or less serious projects, should be avoided, as it limits flexibility, which prevents further expansion of the program. It is worth saying that this approach is quite popular, due to its ease of use and the presence of built-in tools in the development environment.

However, the ideal option for storing program settings are structured XML files. Their advantage is that the number of parameters may not be fixed. To understand this better, let's look at a specific example.

In the USearch program, when you click on an entry, a context menu appears in which a list of items is displayed. These items are commands, which in turn are loaded from the settings file. If the settings were stored in INI file, the program could save and load a certain number of instructions, such as 10 or 50. As soon as a larger value is needed, the code will have to be rewritten and recompiled accordingly.


Taking the approach using XML files, we will be able to load all section parameters dynamically. To all this, the configuration file will become more elegant, without excessive numbering of parameters. But, standard means to work with XML in Delphi have many disadvantages, so I recommend using standard library MSXML. It is usually included by default operating systems Windows family.


To connect MSXML, we need to generate an interface file with a list of all functions by importing it from the COM server. How to import an interface, quite a few detailed articles have been written, but I suggest you download the file MSXML2_TLB.PAS already ready to use. After the file is downloaded, place it next to your project, or drop it into the lib folder of the Delphi environment. Thus, all created programs will be able to use the module MSXML, you just need to add the line MSXML2_TLB to uses .

For clarity, consider the following example of using this library:

LoadProcedureData; var XMLDoc: DOMDocument; Root: IXMLDOMElement; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("size/width").Text); Root:= nil; XMLDoc:= nil; end;

First, an instance of the DOMDocument class is created, and then the contents of the settings.xml file are loaded into memory. Since according to the standard any XML the file must contain a root tag (in this case config), then we need to get it using the function DocumentElement. Then the content between the tags is displayed , which in turn are between the tags . Thus, from the settings.xml file, our method will display the text in the MessageBox "100px".

500px 100px

Here the SelectSingleNode method is used, which takes a string as a parameter

Despite the fact that the topic of working with XML in Delphi has been widely discussed on the Internet, questions on this topic quite often arise on all kinds of forums.

I've already posted this as well, but I'd like to get back to a real case of quickly parsing an XML file and extracting data, which I did at work today. It took me no more than 5 minutes to get the necessary data.

Background. Today it was necessary to process data on installed programs on users' computers (yes, yes, we detect pirates :)). The technical department provided me with such information ripped from unsuspecting users over a network using WMI. The program they used generates reports in XML format. Accordingly, they brought me a mountain of XML files with a rather complex structure, from which I needed to extract only the name of the installed software products.

Treatment . After reviewing a couple of files manually, I realized that it would not take long to grow old, and decided to write a small converter. Launching Delphi, I selected the XML DataBinding object in the repository and fed it one of the files. I left all the settings and parameters by default, and as a result, I formed a module with large quantity classes and interfaces to access the elements of this XML file. I did not begin to deal with the class structure for a long time, I immediately proceeded to writing a converter.

In a new console application, I wrote a fairly simple code:


program XML2TXT;

uses
forms,
Classes, SysUtils,
SoftwareXML in "SoftwareXML.pas";

procedure CovertXML2Text;
var
softbase: IXMLSTDSoftwareType;
i: integer;
sr: TSearchRec;
CurDir:string;
ExportFile: TStringList;
begin
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
if FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0 then
repeat
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;
until FindNext(sr) 0;
end;

begin
Application.Initialize;
CovertXML2Text;
end.

As a result of which, I got one textbook for each computer in the grid, containing a list of installed software.

I feel that this code will require explanations. For example, why did I use the Forms module in a console application and call the Application.Initialize; procedure?

In fact, everything is simple - this is a small hack that allows you to use XML Data Binding in a console application. Because it stubbornly refused to initialize the class for working with XML. I haven’t figured out the true reasons yet - today time was important, and so I spent 4 out of 5 minutes fighting this error. :) I think later to deal with this problem and write what is the real reason.

The strange softbase class was created based on an XML file - that was the name of the root element, and softbase.InstalledSoftware.source.software[i].DisplayName - just navigating through nested elements to the desired one and getting its value.

This is what one of the most looks like. quick ways working with XML in Delphi.

XML is increasingly being used to store information and exchange it between applications and Web sites. In many applications, this language is used as a base language for storing data, in others - for exporting and importing XML data. It follows from this that it is time for developers to think about how XML data can be used in their own applications.

In this article, we'll take a look at the XML Document Object Model (DOM) and Microsoft's implementation of it, the Microsoft XML DOM.

The XML DOM is an object model that provides the developer with objects for loading and manipulating XML files. The object model consists of the following main objects: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap, and XMLDOMParseError. Each of these objects (except XMLDOMParseError) contains properties and methods that allow you to get information about the object, manipulate the values ​​and structure of the object, and navigate the structure of the XML document.

Let's look at the main XML DOM objects and give some examples of their use in Borland Delphi.

Using XML DOM in Borland Delphi

In order to use the Microsoft XML DOM in Delphi applications, you must include the appropriate type library in your project. To do this, we execute the command Project | Import Type Library and in the Import Type Library dialog box, select the Microsoft XML version 2.0 (Version 2.0) library, which is usually located in the Windows\System\MSXML.DLL file

After clicking the Create Unit button, the MSXML_TLB interface module will be created, which will allow us to use the XML DOM objects: DOMDocument, XMLDocument, XMLHTTPRequest and a number of others implemented in the MSXML.DLL library. A reference to the MSXML_TLB module must be specified in the Uses list.

XML DOM device

The Document Object Model represents an XML document as a tree structure consisting of branches. The XML DOM APIs allow applications to traverse the document tree and manipulate its branches. Each branch can have a specific type (DOMNodeType), according to which the parent and child branches are defined. In most XML documents, you will find element, attribute, and text branches. Attributes are a special kind of branch and are not child branches. Attributes are managed. special methods, provided by XML DOM objects.

In addition to implementing the World Wide Web Consortium (W3C) recommended interfaces, the Microsoft XML DOM contains methods that support XSL, XSL Patterns, Namespaces, and data types. For example, the SelectNodes method allows you to use the XSL Pattern Syntax to find branches in a specific context, and the TransformNode method supports using XSL to perform transformations.

Test XML Document

As an example of an XML document, let's take a music CD-ROM directory, which has the following structure:

Empire Burlesque Bob Dylan USA Columbia 10.90 1985 hide your heart Bonnie Tylor UK CBS Records 9.90 1988 ... Unchain my heart Joe Cocker USA EMI 8.20 1987

Now we're ready to start looking at the XML DOM object model, which we'll start with the XMLDOMDocument object.

XML document - XMLDOMDocument object

Working with an XML document begins with loading it. To do this, we use the Load method, which has only one parameter, which specifies the URL of the document to be loaded. When loading files from a local disk, only the full file name is specified (the file:/// protocol can be omitted in this case). If the XML document is stored as a string, you should use the LoadXML method to load the document.

To control how the document is loaded (synchronous or asynchronous), use the Async property. By default, this property is set to True to indicate that the document is loaded asynchronously and control is returned to the application before the document is fully loaded. Otherwise, the document is loaded synchronously, and then you have to check the value of the ReadyState property to see if the document has loaded or not. You can also create an event handler for the OnReadyStateChange event that will receive control when the value of the ReadyState property changes.

The following shows how to load an XML document using the Load method:

Uses ... MSXML_TLB ... procedure TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // // Here is the code that manipulates // the XML document and its branches // XMLDoc:= Nil; end;

After the document is loaded, we can access its properties. For example, the NodeName property will contain the value #document, the NodeTypeString property will contain the value document, and the URL property will contain the value file:///C:/DATA/DATA.xml.

Error Handling

Of particular interest are the properties associated with the processing of the document when it is loaded. For example, the ParseError property returns an XMLDOMParseError object containing information about an error that occurred while processing the document.

To write an error handler, you can add the following code:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; If XMLError.ErrorCode<>0 Then // // Here we handle the error // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;

To find out what information is returned in case of an error, change the following directory entry:

Empire Burlesque Bob Dylan USA Columbia 10.90 1985

remove closing element in the second line:</p><p> <CD> <TITLE>Empire Burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Now let's write the code that returns the property values ​​of the XMLDOMParseError object:</p><p>XMLError:= XMLDoc.ParseError; If XMLError.ErrorCode<>0 Then With XMLError, Memo1.Lines do begin Add('File:' + URL); Add('Code:' + IntToStr(ErrorCode)); Add('Error:' + Reason); Add('Text:' + SrcText); Add('Line: ' + IntToStr(Line)); Add('Position:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); end;</p><p>and run our application. As a result, we get the following error information.</p> <p>As you can see from the above example, the information returned by the XMLDOMParseError object is quite enough to locate the error and understand the reason for its occurrence.</p> <p>Now let's restore the closing element <TITLE>in our document and continue our discussion of the XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Accessing the document tree</h2> <p>To access the document tree, you can either get the root element and then iterate through its child branches, or find some specific branch. In the first case, we get the root element through the DocumentElement property, which returns an object of type XMLDOMNode. The following shows how to use the DocumentElement property to get the contents of each child element:</p><p>VarNode: IXMLDOMNode; Root: IXMLDOMElement; I: Integer; ... Root:= XMLDoc.DocumentElement; For I:= 0 to Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); end;</p><p>For our XML document, we will get the following text.</p> <p>If we are interested in a specific branch, or a branch below the first child branch, we can use either the NodeFromID method or the GetElementByTagName method of the XMLDOMDocument object.</p> <p>The NodeFromID method requires a unique identifier defined in the XML Schema or Document Type Definition (DTD) and returns the branch with that identifier.</p> <p>The GetElementByTagName method requires a string with a specific element (tag) and returns all branches with this element. The following shows how to use this method to find all the artists in our CD-ROM directory:</p><p>Nodes: IXMLDOMNodeList; Node: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); For I:= 0 to Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); end;</p><p>For our XML document, we will get the following text</p> <p>Note that the SelectNodes method of the XMLDOMNode object provides a more flexible way to access document branches. But more on that below.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Document branch - XMLDOMNode object</h2> <p>An XMLDOMNode object represents a document branch. We've already encountered this object when we got the document's root element:</p><p>Root:= XMLDoc.DocumentElement;</p><p>To obtain information about the branch of an XML document, you can use the properties of the XMLDOMNode object (Table 1).</p> <p>To access the data stored in a branch, one typically uses either the NodeValue property (available for attributes, text branches, comments, processing instructions, and CDATA sections), the Text property, which returns the text content of the branch, or the NodeTypedValue property. The latter, however, can only be used for branches with typed elements.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigating the document tree</h3> <p>The XMLDOMNode object provides many ways to navigate the document tree. For example, the parent branch is accessed through the ParentNode property (XMLDOMNode type), child branches are accessed through the ChildNodes (XMLDOMNodeList type), FirstChild and LastChild (XMLDOMNode type) properties, and so on. The OwnerDocument property returns an object of type XMLDOMDocument that identifies the XML document itself. The properties listed above make it easy to navigate the document tree.</p> <p>Now let's iterate through all the branches of the XML document:</p><p>Root:= XMLDoc.DocumentElement; For I:= 0 to Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes Then GetChilds(Node,0); end;</p><p>As noted above, the SelectNodes of the XMLDOMNode object provides a more flexible way to access document branches. In addition, there is a SelectSingleNode method that returns only the first branch of the document. Both of these methods allow you to specify XSL templates for finding branches.</p> <p>Consider the process of using the SelectNodes method to retrieve all branches that have a CD branch and a PRICE sub-branch:</p><p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');</p><p>All PRICE sub-branches of the CD branch will be placed in the Nodes collection. We will return to the discussion of XSL templates a little later.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulation of child branches</h3> <p>To manipulate child branches, we can use the methods of the XMLDOMNode object (Table 2).</p> <p>In order to completely remove the entry about the first disk, you must run the following code:</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // Get the root element Root:= XMLDoc.DocumentElement; Node:= Root; // Remove the first child branch Node.RemoveChild(Node.FirstChild);</p><p>Note that in this example we are deleting the first child branch. How to remove the first element of the first child branch is shown below:</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // Get the root element Root:= XMLDoc.DocumentElement; // and first child branch Node:= Root.FirstChild; // Remove the first child branch Node.RemoveChild(Node.FirstChild);</p><p>In the above example, we have not deleted the first branch <CD>…</CD>, and the first element of the branch is <TITLE>….

Now let's add a new branch. Below is the code showing how to add a new music CD-ROM entry:

Var NewNode: IXMLDOMNode; Child: IXMLDOMNode; ... // Create a new branch - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // Add element Child:= XMLDoc.CreateNode(1,'TITLE',''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'Pink Floyd'; // Add element <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'Division Bell'; // Add element <COUNTRY>Child:= XMLDoc.CreateNode(1, 'COUNTRY', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'UK'; // Add element <COMPANY>Child:= XMLDoc.CreateNode(1, 'COMPANY', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'EMI Records Ltd.'; // Add element <PRICE>Child:= XMLDoc.CreateNode(1, 'PRICE', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= '11.99"; // Add an element <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= '1994'; // And add a branch Root.AppendChild(NewNode); ...</p><p>The above code shows the following sequence of steps for adding a new branch:</p> <ul><li>Creating a new branch using the CreateNode method: <ul><li>creating an element using the CreateNode method;</li> <li>adding an element to a branch using the AppendChild method;</li> <li>setting the value of an element through the Text property;</li> <li>... repeat for all elements.</li> </ul></li> <li>Adding a new branch to a document using the AppendChild method.</li> </ul><p>Recall that the AppendChild method adds a branch to the end of the tree. To add a branch to a specific location in the tree, you must use the InsertBefore method.</p> <h2>Branch set - XMLDOMNodeList object</h2> <p>The XMLNodeList object contains a list of branches, which can be built using the SelectNodes or GetElementsByTagName methods, or retrieved from the ChildNodes property.</p> <p>We have already seen the use of this object in the example given in the "Navigating the Document Tree" section. Here we present some theoretical remarks.</p> <p>The number of branches in the list can be obtained as the value of the Length property. The branches have indices from 0 to Length-1, and each individual branch is accessible through the Item array element with the corresponding index.</p> <p>Moving through the list of branches can also be done using the NextNode method, which returns the next branch in the list, or Nil if the current branch is the last one. To return to the beginning of the list, call the Reset method.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Create and save documents</h2> <p>So, we have seen how you can add branches and elements to existing XML documents. Now let's create an XML document on the fly. First of all, remember that a document can be loaded not only from a URL, but also from a regular string. The following shows how to create a root element, which can then be used to build the rest of the elements dynamically (which we already covered in Manipulating Child Branches):</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; S: WideString; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Node:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Node); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;</p><p>After building the XML document, we save it to a file using the Save method. For instance:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>In addition to saving to a file, the Save method allows you to save an XML document to a new XMLDOMDocument object. In this case, the document is completely processed and, as a result, its structure and syntax are checked. The following shows how to store the document in another object:</p><p>Procedure TForm1.Button2Click(Sender: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nil; end;</p><p>Finally, the Save method also allows you to save the XML document to other COM objects that support the IStream, IPersistStream, or IPersistStreamInit interfaces.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Using XSL Templates</h2> <p>When discussing the SelectNodes method of the XMLDOMNode object, we mentioned that it provides a more flexible way to access document branches. The flexibility is that you can specify an XSL template as a criterion for selecting branches. Such templates provide a powerful mechanism for finding information in XML documents. For example, to get a list of all the music CD-ROM titles in our catalog, we could run the following query:</p><p>To find out which artists' CDs were released in the US, the query is formed as follows:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>The following shows how to find the first drive in a directory:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>And last:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>To find Bob Dylan's discs, you can run the following query:</p><p>Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');</p><p>and to get a list of discs released after 1985, we run the following query:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>A more detailed discussion of XSL syntax requires a separate post. To intrigue readers and encourage further research, I will give just one small example of a possible use of XSL. Let's say we need to convert our directory into a regular HTML table. Using traditional methods, we must go through all the branches of the tree and form the corresponding tags for each element received. <TD>…</TD>.</p> <p>Using XSL, we simply create a template (or style sheet) in which we specify what and how to transform. Then we impose this template on our catalog - and you're done: we have the text of the XSL template that converts the catalog into a table (Listing 2).</p> <p>The code for overlaying the XSL template on our directory looks like this:</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:= Nil; end;</p><p>Concluding our discussion of XSL, it should be said that at present this language is actively used for transformation between different XML documents, as well as for document formatting.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Conclusion</h2> <p>For obvious reasons, it is impossible to cover all the Microsoft XML DOM objects and give examples of their use in one article. Here we have only touched on the main issues of using the XML DOM in applications. In table. Figure 3 shows all the objects implemented in the Microsoft XML DOM.</p> <p>ComputerPress 12"2000</p> <p>XML is increasingly being used to store information and exchange it between applications and Web sites. In many applications, this language is used as a base language for storing data, in others - for exporting and importing XML data. It follows from this that it is time for developers to think about how XML data can be used in their own applications.</p> <p>In this article, we'll take a look at the XML Document Object Model (DOM) and Microsoft's implementation of it, the Microsoft XML DOM.</p> <p>The XML DOM is an object model that provides the developer with objects for loading and manipulating XML files. The object model consists of the following main objects: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap, and XMLDOMParseError. Each of these objects (except XMLDOMParseError) contains properties and methods that allow you to get information about the object, manipulate the values ​​and structure of the object, and navigate the structure of the XML document.</p> <p>Let's look at the main XML DOM objects and give some examples of their use in Borland Delphi.</p> <h2>Using XML DOM in Borland Delphi</h2> <p>In order to use the Microsoft XML DOM in Delphi applications, you must include the appropriate type library in your project. To do this, we execute the command Project | Import Type Library and in the Import Type Library dialog box, select the Microsoft XML version 2.0 (Version 2.0) library, which is usually located in the Windows\System\MSXML.DLL file</p> <p>After clicking the Create Unit button, the MSXML_TLB interface module will be created, which will allow us to use the XML DOM objects: DOMDocument, XMLDocument, XMLHTTPRequest and a number of others implemented in the MSXML.DLL library. A reference to the MSXML_TLB module must be specified in the Uses list.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML DOM device</h2> <p>The Document Object Model represents an XML document as a tree structure consisting of branches. The XML DOM APIs allow applications to traverse the document tree and manipulate its branches. Each branch can have a specific type (DOMNodeType), according to which the parent and child branches are defined. In most XML documents, you will find element, attribute, and text branches. Attributes are a special kind of branch and are not child branches. Attributes are manipulated using special methods provided by XML DOM objects.</p> <p>In addition to implementing the World Wide Web Consortium (W3C) recommended interfaces, the Microsoft XML DOM contains methods that support XSL, XSL Patterns, Namespaces, and data types. For example, the SelectNodes method allows you to use the XSL Pattern Syntax to find branches in a specific context, and the TransformNode method supports using XSL to perform transformations.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Test XML Document</h2> <p>As an example of an XML document, let's take a music CD-ROM directory, which has the following structure:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>Empire Burlesque Bob Dylan USA Columbia 10.90 1985 hide your heart Bonnie Tylor UK CBS Records 9.90 1988 ... Unchain my heart Joe Cocker USA EMI 8.20 1987

Now we're ready to start looking at the XML DOM object model, which we'll start with the XMLDOMDocument object.

XML document - XMLDOMDocument object

Working with an XML document begins with loading it. To do this, we use the Load method, which has only one parameter, which specifies the URL of the document to be loaded. When loading files from a local disk, only the full file name is specified (the file:/// protocol can be omitted in this case). If the XML document is stored as a string, you should use the LoadXML method to load the document.

To control how the document is loaded (synchronous or asynchronous), use the Async property. By default, this property is set to True to indicate that the document is loaded asynchronously and control is returned to the application before the document is fully loaded. Otherwise, the document is loaded synchronously, and then you have to check the value of the ReadyState property to see if the document has loaded or not. You can also create an event handler for the OnReadyStateChange event that will receive control when the value of the ReadyState property changes.

The following shows how to load an XML document using the Load method:

Uses ... MSXML_TLB ... procedure TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // // Here is the code that manipulates // the XML document and its branches // XMLDoc:= Nil; end;

After the document is loaded, we can access its properties. For example, the NodeName property will contain the value #document, the NodeTypeString property will contain the value document, and the URL property will contain the value file:///C:/DATA/DATA.xml.

Error Handling

Of particular interest are the properties associated with the processing of the document when it is loaded. For example, the ParseError property returns an XMLDOMParseError object containing information about an error that occurred while processing the document.

To write an error handler, you can add the following code:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; If XMLError.ErrorCode<>0 Then // // Here we handle the error // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;

To find out what information is returned in case of an error, change the following directory entry:

Empire Burlesque Bob Dylan USA Columbia 10.90 1985

remove closing element in the second line:</p><p> <CD> <TITLE>Empire Burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Now let's write the code that returns the property values ​​of the XMLDOMParseError object:</p><p>XMLError:= XMLDoc.ParseError; If XMLError.ErrorCode<>0 Then With XMLError, Memo1.Lines do begin Add('File:' + URL); Add('Code:' + IntToStr(ErrorCode)); Add('Error:' + Reason); Add('Text:' + SrcText); Add('Line: ' + IntToStr(Line)); Add('Position:' + IntToStr(LinePos)); end Else Memo1.Lines.Add(XMLDoc.XML); end;</p><p>and run our application. As a result, we get the following error information.</p> <p>As you can see from the above example, the information returned by the XMLDOMParseError object is quite enough to locate the error and understand the reason for its occurrence.</p> <p>Now let's restore the closing element <TITLE>in our document and continue our discussion of the XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Accessing the document tree</h2> <p>To access the document tree, you can either get the root element and then iterate through its child branches, or find some specific branch. In the first case, we get the root element through the DocumentElement property, which returns an object of type XMLDOMNode. The following shows how to use the DocumentElement property to get the contents of each child element:</p><p>VarNode: IXMLDOMNode; Root: IXMLDOMElement; I: Integer; ... Root:= XMLDoc.DocumentElement; For I:= 0 to Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); end;</p><p>For our XML document, we will get the following text.</p> <p>If we are interested in a specific branch, or a branch below the first child branch, we can use either the NodeFromID method or the GetElementByTagName method of the XMLDOMDocument object.</p> <p>The NodeFromID method requires a unique identifier defined in the XML Schema or Document Type Definition (DTD) and returns the branch with that identifier.</p> <p>The GetElementByTagName method requires a string with a specific element (tag) and returns all branches with this element. The following shows how to use this method to find all the artists in our CD-ROM directory:</p><p>Nodes: IXMLDOMNodeList; Node: IXMLDOMNode; ... Nodes:= XMLDoc.GetElementsByTagName('ARTIST'); For I:= 0 to Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); end;</p><p>For our XML document, we will get the following text</p> <p>Note that the SelectNodes method of the XMLDOMNode object provides a more flexible way to access document branches. But more on that below.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Document branch - XMLDOMNode object</h2> <p>An XMLDOMNode object represents a document branch. We've already encountered this object when we got the document's root element:</p><p>Root:= XMLDoc.DocumentElement;</p><p>To obtain information about the branch of an XML document, you can use the properties of the XMLDOMNode object (Table 1).</p> <p>To access the data stored in a branch, one typically uses either the NodeValue property (available for attributes, text branches, comments, processing instructions, and CDATA sections), the Text property, which returns the text content of the branch, or the NodeTypedValue property. The latter, however, can only be used for branches with typed elements.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Navigating the document tree</h3> <p>The XMLDOMNode object provides many ways to navigate the document tree. For example, the parent branch is accessed through the ParentNode property (XMLDOMNode type), child branches are accessed through the ChildNodes (XMLDOMNodeList type), FirstChild and LastChild (XMLDOMNode type) properties, and so on. The OwnerDocument property returns an object of type XMLDOMDocument that identifies the XML document itself. The properties listed above make it easy to navigate the document tree.</p> <p>Now let's iterate through all the branches of the XML document:</p><p>Root:= XMLDoc.DocumentElement; For I:= 0 to Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; If Node.HasChildNodes Then GetChilds(Node,0); end;</p><p>As noted above, the SelectNodes of the XMLDOMNode object provides a more flexible way to access document branches. In addition, there is a SelectSingleNode method that returns only the first branch of the document. Both of these methods allow you to specify XSL templates for finding branches.</p> <p>Consider the process of using the SelectNodes method to retrieve all branches that have a CD branch and a PRICE sub-branch:</p><p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');</p><p>All PRICE sub-branches of the CD branch will be placed in the Nodes collection. We will return to the discussion of XSL templates a little later.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulation of child branches</h3> <p>To manipulate child branches, we can use the methods of the XMLDOMNode object (Table 2).</p> <p>In order to completely remove the entry about the first disk, you must run the following code:</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // Get the root element Root:= XMLDoc.DocumentElement; Node:= Root; // Remove the first child branch Node.RemoveChild(Node.FirstChild);</p><p>Note that in this example we are deleting the first child branch. How to remove the first element of the first child branch is shown below:</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // Get the root element Root:= XMLDoc.DocumentElement; // and first child branch Node:= Root.FirstChild; // Remove the first child branch Node.RemoveChild(Node.FirstChild);</p><p>In the above example, we have not deleted the first branch <CD>…</CD>, and the first element of the branch is <TITLE>….

Now let's add a new branch. Below is the code showing how to add a new music CD-ROM entry:

Var NewNode: IXMLDOMNode; Child: IXMLDOMNode; ... // Create a new branch - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // Add element Child:= XMLDoc.CreateNode(1,'TITLE',''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'Pink Floyd'; // Add element <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'Division Bell'; // Add element <COUNTRY>Child:= XMLDoc.CreateNode(1, 'COUNTRY', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'UK'; // Add element <COMPANY>Child:= XMLDoc.CreateNode(1, 'COMPANY', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= 'EMI Records Ltd.'; // Add element <PRICE>Child:= XMLDoc.CreateNode(1, 'PRICE', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= '11.99"; // Add an element <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // Add an element NewNode.AppendChild(Child); // And set its value Child.Text:= '1994'; // And add a branch Root.AppendChild(NewNode); ...</p><p>The above code shows the following sequence of steps for adding a new branch:</p> <ul><li>Creating a new branch using the CreateNode method: <ul><li>creating an element using the CreateNode method;</li> <li>adding an element to a branch using the AppendChild method;</li> <li>setting the value of an element through the Text property;</li> <li>... repeat for all elements.</li> </ul></li> <li>Adding a new branch to a document using the AppendChild method.</li> </ul><p>Recall that the AppendChild method adds a branch to the end of the tree. To add a branch to a specific location in the tree, you must use the InsertBefore method.</p> <h2>Branch set - XMLDOMNodeList object</h2> <p>The XMLNodeList object contains a list of branches, which can be built using the SelectNodes or GetElementsByTagName methods, or retrieved from the ChildNodes property.</p> <p>We have already seen the use of this object in the example given in the "Navigating the Document Tree" section. Here we present some theoretical remarks.</p> <p>The number of branches in the list can be obtained as the value of the Length property. The branches have indices from 0 to Length-1, and each individual branch is accessible through the Item array element with the corresponding index.</p> <p>Moving through the list of branches can also be done using the NextNode method, which returns the next branch in the list, or Nil if the current branch is the last one. To return to the beginning of the list, call the Reset method.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Create and save documents</h2> <p>So, we have seen how you can add branches and elements to existing XML documents. Now let's create an XML document on the fly. First of all, remember that a document can be loaded not only from a URL, but also from a regular string. The following shows how to create a root element, which can then be used to build the rest of the elements dynamically (which we already covered in Manipulating Child Branches):</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; S: WideString; ...S:=' <CATALOG></CATALOG>'; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.LoadXML(S); Root:= XMLDoc.DocumentElement; Node:= XMLDoc.CreateNode(1, 'CD', ''); Root.AppendChild(Node); Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;</p><p>After building the XML document, we save it to a file using the Save method. For instance:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>In addition to saving to a file, the Save method allows you to save an XML document to a new XMLDOMDocument object. In this case, the document is completely processed and, as a result, its structure and syntax are checked. The following shows how to store the document in another object:</p><p>Procedure TForm1.Button2Click(Sender: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nil; end;</p><p>Finally, the Save method also allows you to save the XML document to other COM objects that support the IStream, IPersistStream, or IPersistStreamInit interfaces.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Using XSL Templates</h2> <p>When discussing the SelectNodes method of the XMLDOMNode object, we mentioned that it provides a more flexible way to access document branches. The flexibility is that you can specify an XSL template as a criterion for selecting branches. Such templates provide a powerful mechanism for finding information in XML documents. For example, to get a list of all the music CD-ROM titles in our catalog, we could run the following query:</p><p>To find out which artists' CDs were released in the US, the query is formed as follows:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>The following shows how to find the first drive in a directory:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>And last:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>To find Bob Dylan's discs, you can run the following query:</p><p>Nodes:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');</p><p>and to get a list of discs released after 1985, we run the following query:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>A more detailed discussion of XSL syntax requires a separate post. To intrigue readers and encourage further research, I will give just one small example of a possible use of XSL. Let's say we need to convert our directory into a regular HTML table. Using traditional methods, we must go through all the branches of the tree and form the corresponding tags for each element received. <TD>…</TD>.</p> <p>Using XSL, we simply create a template (or style sheet) in which we specify what and how to transform. Then we impose this template on our catalog - and you're done: we have the text of the XSL template that converts the catalog into a table (Listing 2).</p> <p>The code for overlaying the XSL template on our directory looks like this:</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:= Nil; end;</p><p>Concluding our discussion of XSL, it should be said that at present this language is actively used for transformation between different XML documents, as well as for document formatting.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Conclusion</h2> <p>For obvious reasons, it is impossible to cover all the Microsoft XML DOM objects and give examples of their use in one article. Here we have only touched on the main issues of using the XML DOM in applications. In table. Figure 3 shows all the objects implemented in the Microsoft XML DOM.</p> <p>ComputerPress 12"2000</p> <p>I welcome everyone! For several years I wrote in Matlab, and then I was impatient to write a program in Delphi.</p><p>I need to learn how to work with xml documents. I work in RAD Stiduo XE3. There is a TXMLDocument component, probably known to many Delphi programmers. It seems like he can do a lot. But the problem is that there is no clear documentation and description for it. Help in RAD Studio is garbage, because there is no normal information there; only meager help scattered across the pages on some methods and procedures (without examples and a normal description). Rummaged all Internet. I found only topics on forums with specific tasks, where you have to guess for another hour what this or that line does, associated with accessing the xml file. <br>I also need a guide to the main functions, procedures and methods used when working with xml. Textbook, manual, description. Or at least "xml in Delphi for dummies". For instance:</p><p><i>To open an xml file, use the XMLDocument1.LoadFromFile("filemane.xml") method, where filename is the file name. <br>The nodelist variable of type IXMLNode is used to store the list of child elements. To determine this list, use the Xmldocument1.DocumentElement method (where XMLDocument1 is the xml file being examined). <br>To query the contents of the child element "element1" use the XMLDocument1.DocumentElement.ChildNodes[ "element1"].Text... method. <br></i><br>and in this spirit further on all applied methods, procedures, data types. <br>Where can I find such manuals/descriptions? Who can help?</p><p>If you need a specific task, I will describe it. <br>I have an xml document like this:</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">some text</data><br><data name="onerror" mode="noVoice">some errortext</data><br><data name="onerror" mode="alarm">Other error text</data></p><p>In the program code we have:</p><p>var <br>...<br>parent, child1: IXMLNode;</p><p>begin <br>XMLDocument1.LoadFromFile("f:\filename.xml"); <br>XMLDocument1.Active:=true; <br>.<br>.<br>end</p><p>What you need to learn to do: <br>(I apologize in advance if I name the components of the xml document incorrectly) <br>1. Get the name of the root element (in our case, ltm), as well as a list of its attributes (version, type) and their values ​​("1.0", "settings"). <br>2. Get the number of elements that are children of the root. In this case, there are 7 of them: templateFiles, dimensions, hotspot, hotspot, data, data, data. Get the names of elements (tags) (templateFiles, dimensions, etc.). After getting the number of elements and learning how to extract their names, I will loop from 0 to count-1 and do what I need. <br>3. Get the number and list of attributes of the required element. For example, for the hotspot element. The correct answer would be 4 attributes. For the first hotspot element, these will be name, style, scena, ath. For the second - the same, only instead of the ath attribute - the rz attribute. <br>Note that there are 2 hotspot elements in the file, with different attributes. Here's how to work with them (if there are more than 1 elements of the same name)? <br>I want so: I receive the list of child elements on rel. to the root one (see point 2), I run a loop through them with for and find the hotspot elements whose name parameter is equal to the required one (say "hs015_2" - there will certainly be one such element). Is there any way to solve this issue without a loop? That is, get the value of the scena attribute for the hotspot element that has name="hs015_2"? <br>4. Do the above with respect to nodes and elements that are children of children. In my example, a node (child of and parent of and. <br>If I understand correctly, you need to somehow transfer the contents of the node to <a href="https://obanracer.ru/en/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">type variable</a> IXMLNode and do the same as in paragraphs 1-3. So?</p><p>5. You need to learn how to change the above parameters (set your own).</p><p>It seems that's all for now. At this stage, syntactic constructions are the most important for me. <br>Who owns this topic, please write other syntactic constructions to solve the above questions (how to get attributes, their number, number of elements, their names, etc.). The main thing now is to master the syntax, and I will implement my algorithm later. Many thanks in advance to everyone!</p><p>P.S. I really would not want to write my own XML parser from scratch just because there is no normal description for the existing ones.</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>Previous article</span><a href="https://obanracer.ru/en/updater-chto-eto-za-programma-v-obshchem-smysle-kak-udalit-software.html">How to remove Software Version Updater (adware) updater process</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>Next article</span><a href="https://obanracer.ru/en/kak-pomenyat-parametry-stranicy-v-vorde-kak-ustanovit-parametry-stranicy.html">How to set the page options of a word document</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/en/author/iulia">Julia</a></span></div> <span style="display: none;" itemprop="author" itemscope itemtype="https://schema.org/Person"><meta itemprop="name" content="Юлия"></span> <meta itemprop="datePublished" content="2016-05-16T15:47:37+00:00"> <meta itemprop="dateModified" content="2016-10-25T16:54:41+00:00"> <meta itemscope itemprop="mainEntityOfPage" itemType="https://schema.org/WebPage" itemid="/other/kak-zavyazat-galstuk-foto-poshagovo.html" /><span style="display: none;" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><span style="display: none;" itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="//obanracer.ru/wp-content/uploads/2017/01/logo-300x100.png"></span> <meta itemprop="name" content="Мой секрет"> </span> <meta itemprop="headline " content="Как завязать галстук пошагово фото"><span style="display: none;" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><meta itemprop="url" content="/wp-content/uploads/2016/05/1-19.jpg"><meta itemprop="width" content="640"><meta itemprop="height" content="450"></span> </footer> </article> <div class="td_block_wrap td_block_related_posts td_uid_3_5a236fb03c961_rand td_with_ajax_pagination td-pb-border-top td_block_template_1" data-td-block-uid="td_uid_3_5a236fb03c961" ><script>var block_td_uid_3_5a236fb03c961 = new tdBlock(); block_td_uid_3_5a236fb03c961.id = "td_uid_3_5a236fb03c961"; block_td_uid_3_5a236fb03c961.atts = '{ "limit":9,"sort":"","post_ids":"","tag_slug":"","autors_id":"","installed_post_types":"","category_id":"","category_ids":"","custom_title":"","custom_url":"","show_child_cat":"","sub_cat_ajax":"","ajax_pagination":"next_prev","header_color":"","header_text_color":"","ajax_pagination_infinite_stop":"","td_column_number":3,"td_ajax_preloading":"","td_ajax_filter_type":"td_custom_related","td_ajax_filter_ids":"","td_filter_default_txt":"\u0412\u0441\u0435","color_preset":"","border_top":"","class":"td_uid_3_5a236fb03c961_rand","el_class":"","offset":"","css":"","tdc_css":"","tdc_css_class":"td_uid_3_5a236fb03c961_rand","live_filter":"cur_post_same_categories","live_filter_cur_post_id":10046,"live_filter_cur_post_author":"694350","block_template_id":""} '; block_td_uid_3_5a236fb03c961.td_column_number = "3"; block_td_uid_3_5a236fb03c961.block_type = "td_block_related_posts"; block_td_uid_3_5a236fb03c961.post_count = "9"; block_td_uid_3_5a236fb03c961.found_posts = "26"; block_td_uid_3_5a236fb03c961.header_color = ""; block_td_uid_3_5a236fb03c961.ajax_pagination_infinite_stop = ""; block_td_uid_3_5a236fb03c961.max_num_pages = "3"; tdBlocksArray.push(block_td_uid_3_5a236fb03c961); </script><h4 class="td-related-title td-block-title"><a id="td_uid_4_5a236fb03e35d" class="td-related-left td-cur-simple-item" data-td_filter_value="" data-td_block_id="td_uid_3_5a236fb03c961" href="#">RELATED ARTICLES</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/en/kak-pochistit-fail-hosts-windows-xp-ochistka-i-vosstanovlenie-faila-hosts-chto.html" rel="bookmark" title="Cleaning and restoring the Hosts file"><img width="218" height="150" class="entry-thumb" src="/uploads/82df474e8fe9812e1b18722be4a549f3.jpg" alt="Cleaning and restoring the Hosts file" title="Cleaning and restoring the Hosts file"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/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/en/kak-pochistit-fail-hosts-windows-xp-ochistka-i-vosstanovlenie-faila-hosts-chto.html" rel="bookmark" title="Cleaning and restoring the Hosts file">Cleaning and restoring the Hosts file</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/en/programma-onlain-vstavit-lico-v-gotovyi-shablon-kak-vstavit-lico-v.html" rel="bookmark" title="How to insert a face into a photo"><img width="218" height="150" class="entry-thumb" src="/uploads/8a55e13fd28761849f9013b3e26aec35.jpg" alt="How to insert a face into a photo" title="How to insert a face into a photo"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/security/" class="td-post-category">Safety</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/programma-onlain-vstavit-lico-v-gotovyi-shablon-kak-vstavit-lico-v.html" rel="bookmark" title="How to insert a face into a photo">How to insert a face into a photo</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/en/kak-otformatirovat-disk-na-makbuke-kak-polnostyu-steret.html" rel="bookmark" title="How to Completely Erase Your Mac Hard Drive"><img width="218" height="150" class="entry-thumb" src="/uploads/8370231f597532ba724a7ce93e721d28.jpg" alt="How to Completely Erase Your Mac Hard Drive" title="How to Completely Erase Your Mac Hard Drive"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/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/en/kak-otformatirovat-disk-na-makbuke-kak-polnostyu-steret.html" rel="bookmark" title="How to Completely Erase Your Mac Hard Drive">How to Completely Erase Your Mac Hard Drive</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/en/perevod-deneg-na-schet-bilain-perevod-deneg-s-bilaina-na-bilain-v.html" rel="bookmark" title="Transferring money from beeline to beeline"><img width="218" height="150" class="entry-thumb" src="/uploads/ff9a95c9b9ec0cb3e6c1ac5a645ecec2.jpg" alt="Transferring money from beeline to beeline" title="Transferring money from beeline to beeline"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/case/" class="td-post-category">Corps</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/perevod-deneg-na-schet-bilain-perevod-deneg-s-bilaina-na-bilain-v.html" rel="bookmark" title="Transferring money from beeline to beeline">Transferring money from beeline to beeline</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/en/css-podklyuchenie-shriftov-ttf-ustanavlivaem-shrifty-v-css-kogda.html" rel="bookmark" title="Set fonts in css"><img width="218" height="150" class="entry-thumb" src="/uploads/cf9f88d65405223c1d0b5221e2ab5c84.jpg" alt="Set fonts in css" title="Set fonts in css"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/graphics-card/" class="td-post-category">Video cards</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/css-podklyuchenie-shriftov-ttf-ustanavlivaem-shrifty-v-css-kogda.html" rel="bookmark" title="Set fonts in css">Set fonts in css</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/en/sozdanie-html-stranicy-v-bloknote-razyasneniya-dlya-chainikov-vyravnivanie.html" rel="bookmark" title="Center Align Header"><img width="218" height="150" class="entry-thumb" src="/uploads/bdfcd9d5cc907e58f17776cc3052fbf5.jpg" alt="Center Align Header" title="Center Align Header"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/processors/" class="td-post-category">Processors</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/sozdanie-html-stranicy-v-bloknote-razyasneniya-dlya-chainikov-vyravnivanie.html" rel="bookmark" title="Center Align Header">Center Align Header</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/en/kak-v-fotoshope-vyrezat-figuru-vse-sposoby-vydelit-i.html" rel="bookmark" title="All the ways to select and cut an object in Photoshop"><img width="218" height="150" class="entry-thumb" src="/uploads/5d229b1df833925b9c19df34f8dceba7.jpg" alt="All the ways to select and cut an object in Photoshop" title="All the ways to select and cut an object in Photoshop"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/monitors/" class="td-post-category">Monitors</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/kak-v-fotoshope-vyrezat-figuru-vse-sposoby-vydelit-i.html" rel="bookmark" title="All the ways to select and cut an object in Photoshop">All the ways to select and cut an object in Photoshop</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/en/kak-sohranit-zakladki-yandeksa-v-kompyutere-pereustanovka-yandeks.html" rel="bookmark" title="How to save Yandex bookmarks on a computer"><img width="218" height="150" class="entry-thumb" src="/uploads/fc1350348173d69bd790a862ba5c98e7.jpg" alt="How to save Yandex bookmarks on a computer" title="How to save Yandex bookmarks on a computer"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/monitors/" class="td-post-category">Monitors</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/kak-sohranit-zakladki-yandeksa-v-kompyutere-pereustanovka-yandeks.html" rel="bookmark" title="How to save Yandex bookmarks on a computer">How to save Yandex bookmarks on a computer</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/en/kak-udalit-virus-hosts-ochistit-fail-hosts-kak-udalit-fail-hosts.html" rel="bookmark" title="How to remove hosts virus (clear hosts file)?"><img width="218" height="150" class="entry-thumb" src="/uploads/6f2840f8748634b83e5a72ed95f519d7.jpg" alt="How to remove hosts virus (clear hosts file)?" title="How to remove hosts virus (clear hosts file)?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/processors/" class="td-post-category">Processors</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/kak-udalit-virus-hosts-ochistit-fail-hosts-kak-udalit-fail-hosts.html" rel="bookmark" title="How to remove hosts virus (clear hosts file)?">How to remove hosts virus (clear hosts file)?</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">Recommended</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/en/printskrin-na-makbuke-eir-kak-sdelat-skrinshot-na-make-s-vindoi-kak-sdelat.html" rel="bookmark" title="How to take a screenshot on a mac windows"><img width="324" height="235" class="entry-thumb" src="/uploads/3dcc25c964d094cb182142223439da7f.jpg" alt="How to take a screenshot on a mac windows" title="How to take a screenshot on a mac windows"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/en/category/monitors/" class="td-post-category">Monitors</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/printskrin-na-makbuke-eir-kak-sdelat-skrinshot-na-make-s-vindoi-kak-sdelat.html" rel="bookmark" title="How to take a screenshot on a mac windows">How to take a screenshot on a mac windows</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">Not every Makovod knows how to take a screenshot on a Mac! Let's talk today about how to take a screenshot in MacOS in various ways, with examples! If...</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/en/printskrin-na-make-goryachie-klavishi-kak-delat-skrinshoty-v-mac-os-x.html" rel="bookmark" title="How to take screenshots in Mac OS X"><img width="100" height="70" class="entry-thumb" src="/uploads/be5b020fc43da1d223eb3202a94b16c9.jpg" alt="How to take screenshots in Mac OS X" title="How to take screenshots in Mac OS X"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/printskrin-na-make-goryachie-klavishi-kak-delat-skrinshoty-v-mac-os-x.html" rel="bookmark" title="How to take screenshots in Mac OS X">How to take screenshots in Mac OS X</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/en/category/power-supply/" class="td-post-category">Power supplies</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/en/kuda-zvonit-esli-gai-gonyayutsya-kak-vyzvat-gai-na-mesto-dtp-chto-delat-v.html" rel="bookmark" title="How to call the traffic police to the scene of an accident?"><img width="100" height="70" class="entry-thumb" src="/uploads/7b7137652f715c1d8a5caa848976108e.jpg" alt="How to call the traffic police to the scene of an accident?" title="How to call the traffic police to the scene of an accident?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/kuda-zvonit-esli-gai-gonyayutsya-kak-vyzvat-gai-na-mesto-dtp-chto-delat-v.html" rel="bookmark" title="How to call the traffic police to the scene of an accident?">How to call the traffic police to the scene of an accident?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/en/category/security/" class="td-post-category">Safety</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/en/gai-avariya-chto-delat-pri-dtp-poryadok-deistvii-kuda-zvonit-kak.html" rel="bookmark" title="What to do in case of an accident (procedure, where to call)?"><img width="100" height="70" class="entry-thumb" src="/uploads/9c1befb002d24b63eb971f802de704da.jpg" alt="What to do in case of an accident (procedure, where to call)?" title="What to do in case of an accident (procedure, where to call)?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/gai-avariya-chto-delat-pri-dtp-poryadok-deistvii-kuda-zvonit-kak.html" rel="bookmark" title="What to do in case of an accident (procedure, where to call)?">What to do in case of an accident (procedure, where to call)?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/en/category/windows-8/" class="td-post-category">Windows 8</a> </div> </div> </div> </div> <div class="td-block-span12"> <div class="td_module_6 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-thumb"><a href="https://obanracer.ru/en/udalit-el-pochtu-v-yandekse-kak-udalit-pochtovyi-yashchik-na-yandekse-navsegda-kak.html" rel="bookmark" title="How to delete a mailbox on Yandex forever?"><img width="100" height="70" class="entry-thumb" src="/uploads/606e73d3d732f844ae9678a15bbd2eea.jpg" alt="How to delete a mailbox on Yandex forever?" title="How to delete a mailbox on Yandex forever?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/udalit-el-pochtu-v-yandekse-kak-udalit-pochtovyi-yashchik-na-yandekse-navsegda-kak.html" rel="bookmark" title="How to delete a mailbox on Yandex forever?">How to delete a mailbox on Yandex forever?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/en/category/security/" class="td-post-category">Safety</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/en/chem-otkryt-fail-hosts-windows-7-kak-otkryt-fail-hosts-prednaznachenie-faila-hosts.html" rel="bookmark" title="How to open hosts file windows 7"><img width="100" height="70" class="entry-thumb" src="/uploads/08a6624c2f08ce8b927d6e9aff78b340.jpg" alt="How to open hosts file windows 7" title="How to open hosts file windows 7"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/chem-otkryt-fail-hosts-windows-7-kak-otkryt-fail-hosts-prednaznachenie-faila-hosts.html" rel="bookmark" title="How to open hosts file windows 7">How to open hosts file windows 7</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/en/category/internet/" class="td-post-category">Internet</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/en/ne-aktiviruetsya-windows-8-1-na-noutbuke.html" rel="bookmark" title="Windows 8 won't activate"><img width="100" height="70" class="entry-thumb" src="/uploads/635dc404337566e0c0a89f9a87752ebc.jpg" alt="Windows 8 won't activate" title="Windows 8 won't activate"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/ne-aktiviruetsya-windows-8-1-na-noutbuke.html" rel="bookmark" title="Windows 8 won't activate">Windows 8 won't activate</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/en/category/power-supply/" class="td-post-category">Power supplies</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/en/ne-poluchaetsya-aktivirovat-windows-8.html" rel="bookmark" title="Can't activate windows 8"><img width="218" height="150" class="entry-thumb" src="/uploads/00e17651fc60e20ffa8eaf1ad1c49904.jpg" alt="Can't activate windows 8" title="Can't activate windows 8"/ 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/en/ne-poluchaetsya-aktivirovat-windows-8.html" rel="bookmark" title="Can't activate windows 8">Can't activate windows 8</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/en/privyazka-uch-tnoi-zapisi-k-mobilnomu-telefonu-privyazka-akkaunta-k.html" rel="bookmark" title="Linking an account to email Wot purchased account linking a phone your name"><img width="218" height="150" class="entry-thumb" src="/uploads/fa8df6ed130f6cce48cfb7c7f4a1dc57.jpg" alt="Linking an account to email Wot purchased account linking a phone your name" title="Linking an account to email Wot purchased account linking a phone your name"/ 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/en/privyazka-uch-tnoi-zapisi-k-mobilnomu-telefonu-privyazka-akkaunta-k.html" rel="bookmark" title="Linking an account to email Wot purchased account linking a phone your name">Linking an account to email Wot purchased account linking a phone your name</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/en/rar-ili-zip-chto-vybrat-raznica-mezhdu-zip-i-rar-sravnitelnaya.html" rel="bookmark" title="Difference between ZIP and RAR Comparative characteristics of rar zip archivers"><img width="218" height="150" class="entry-thumb" src="/uploads/a4cc39406f0a0e30f9ae2e202e093124.jpg" alt="Difference between ZIP and RAR Comparative characteristics of rar zip archivers" title="Difference between ZIP and RAR Comparative characteristics of rar zip archivers"/ 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/en/rar-ili-zip-chto-vybrat-raznica-mezhdu-zip-i-rar-sravnitelnaya.html" rel="bookmark" title="Difference between ZIP and RAR Comparative characteristics of rar zip archivers">Difference between ZIP and RAR Comparative characteristics of rar zip archivers</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/en/whatsapp-dannyi-obekt-bolshe-nedostupen-etot-element-foto-bolshe.html" rel="bookmark" title="Whatsapp this item is no longer available - This photo item is no longer available Viber Trying to change system fields"><img width="218" height="150" class="entry-thumb" src="/uploads/203eff1de75cdc3a7b7351df2b5a0435.jpg" alt="Whatsapp this item is no longer available - This photo item is no longer available Viber Trying to change system fields" title="Whatsapp this item is no longer available - This photo item is no longer available Viber Trying to change system fields"/ 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/en/whatsapp-dannyi-obekt-bolshe-nedostupen-etot-element-foto-bolshe.html" rel="bookmark" title="Whatsapp this item is no longer available - This photo item is no longer available Viber Trying to change system fields">Whatsapp this item is no longer available - This photo item is no longer available Viber Trying to change system fields</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/en/kak-privyazat-kaban-k-drugoi-pochte-kak-privyazat-pochtu-k-drugoi-pochte.html" rel="bookmark" title="How to link mail to another mail"><img width="218" height="150" class="entry-thumb" src="/uploads/8ac105564c075c0dd2c098582f31b47d.jpg" alt="How to link mail to another mail" title="How to link mail to another mail"/ 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/en/kak-privyazat-kaban-k-drugoi-pochte-kak-privyazat-pochtu-k-drugoi-pochte.html" rel="bookmark" title="How to link mail to another mail">How to link mail to another mail</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/en/kak-polzovatsya-semeinoi-bibliotekoi-google-play-kak-upravlyat-semeinoi.html" rel="bookmark" title="How to manage a family group in Google Family Library google play"><img width="218" height="150" class="entry-thumb" src="/uploads/e59cca17ebacb6372213b5522283a1ad.jpg" alt="How to manage a family group in Google Family Library google play" title="How to manage a family group in Google Family Library google play"/ 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/en/kak-polzovatsya-semeinoi-bibliotekoi-google-play-kak-upravlyat-semeinoi.html" rel="bookmark" title="How to manage a family group in Google Family Library google play">How to manage a family group in Google Family Library google play</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/en/privyazat-telefon-k-vot-privyazka-akkaunta-k-elektronnoi-pochte.html" rel="bookmark" title="Linking an account to email"><img width="218" height="150" class="entry-thumb" src="/uploads/1cd874bd7d05c52dd7023ade9c0b1bed.jpg" alt="Linking an account to email" title="Linking an account to email"/ 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/en/privyazat-telefon-k-vot-privyazka-akkaunta-k-elektronnoi-pochte.html" rel="bookmark" title="Linking an account to email">Linking an account to email</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/en/obzor-besplatnoi-versii-budilnik-besplatnaya-programma-chasy-budilnik-dlya.html" rel="bookmark" title="Free alarm clock program for computer and laptop"><img width="218" height="150" class="entry-thumb" src="/uploads/044dc73ad12bbb753e7fb6f1ee1e7ef9.jpg" alt="Free alarm clock program for computer and laptop" title="Free alarm clock program for computer and laptop"/ 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/en/obzor-besplatnoi-versii-budilnik-besplatnaya-programma-chasy-budilnik-dlya.html" rel="bookmark" title="Free alarm clock program for computer and laptop">Free alarm clock program for computer and laptop</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/en/kak-privyazat-pochtu-k-drugoi-pochte-kak-privyazat-pochtu-k-drugoi-pochte.html" rel="bookmark" title="How to link mail to another mail How to link a wild boar to another mail"><img width="218" height="150" class="entry-thumb" src="/uploads/3325cd3648c065ce0225d23cfe5237f5.jpg" alt="How to link mail to another mail How to link a wild boar to another mail" title="How to link mail to another mail How to link a wild boar to another mail"/ 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/en/kak-privyazat-pochtu-k-drugoi-pochte-kak-privyazat-pochtu-k-drugoi-pochte.html" rel="bookmark" title="How to link mail to another mail How to link a wild boar to another mail">How to link mail to another mail How to link a wild boar to another mail</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/en/kak-smenit-pochtovyi-yashchik-v-world-of-tanks-kak-smenit-pochtovyi-yashchik-v-world-of-tanks.html" rel="bookmark" title="How to change the mailbox in World of Tanks E-mail game world of tanks"><img width="218" height="150" class="entry-thumb" src="/uploads/808ffe1573568450c65e79e9825a5b2d.jpg" alt="How to change the mailbox in World of Tanks E-mail game world of tanks" title="How to change the mailbox in World of Tanks E-mail game world of tanks"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/en/kak-smenit-pochtovyi-yashchik-v-world-of-tanks-kak-smenit-pochtovyi-yashchik-v-world-of-tanks.html" rel="bookmark" title="How to change the mailbox in World of Tanks E-mail game world of tanks">How to change the mailbox in World of Tanks E-mail game world of tanks</a></h3> </div> </div> </div><div class="td-cust-row"> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/en/kak-ustanovit-pokemon-go-na-iphone-i-ipad-esli-ty-zhivesh-v-rossii-kak-skachat-pok-mon-go-v.html" rel="bookmark" title="How to download Pokémon GO in Russia (both on iOS and Android) Download pokemon go app on ios"><img width="218" height="150" class="entry-thumb" src="/uploads/336a6d9e038d307f47704299f7a1aebc.jpg" alt="How to download Pokémon GO in Russia (both on iOS and Android) Download pokemon go app on ios" title="How to download Pokémon GO in Russia (both on iOS and Android) Download pokemon go app on 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/en/kak-ustanovit-pokemon-go-na-iphone-i-ipad-esli-ty-zhivesh-v-rossii-kak-skachat-pok-mon-go-v.html" rel="bookmark" title="How to download Pokémon GO in Russia (both on iOS and Android) Download pokemon go app on ios">How to download Pokémon GO in Russia (both on iOS and Android) Download pokemon go app on 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/en/chem-otkryt-dds-kak-otkryt-fail-dds-na-windows-7.html" rel="bookmark" title="How to open dds file on windows 7"><img width="218" height="150" class="entry-thumb" src="/uploads/90272a5bdbfb55809166eedb4b2343d1.jpg" alt="How to open dds file on windows 7" title="How to open dds file on windows 7"/ 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/en/chem-otkryt-dds-kak-otkryt-fail-dds-na-windows-7.html" rel="bookmark" title="How to open dds file on windows 7">How to open dds file on windows 7</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/en/chto-takoe-microsoft-visual-foxpro-skachat-programmu-foxpro-skachat-programmu.html" rel="bookmark" title="Download foxpro software"><img width="218" height="150" class="entry-thumb" src="/uploads/9e707763ade07c69426a783729cf9575.jpg" alt="Download foxpro software" title="Download foxpro software"/ 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/en/chto-takoe-microsoft-visual-foxpro-skachat-programmu-foxpro-skachat-programmu.html" rel="bookmark" title="Download foxpro software">Download foxpro software</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/en/dalnost-svyazi-racii-maus-a-v-vot-chto-daet-raciya-v-world-of-tanks-i.html" rel="bookmark" title="What does a walkie-talkie give in World of Tanks and why is it needed"><img width="218" height="150" class="entry-thumb" src="/uploads/2d6b1b2adc7b31957bcb68752ed98a07.jpg" alt="What does a walkie-talkie give in World of Tanks and why is it needed" title="What does a walkie-talkie give in World of Tanks and why is it needed"/ 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/en/dalnost-svyazi-racii-maus-a-v-vot-chto-daet-raciya-v-world-of-tanks-i.html" rel="bookmark" title="What does a walkie-talkie give in World of Tanks and why is it needed">What does a walkie-talkie give in World of Tanks and why is it needed</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/en/nastroika-upravleniya-v-droid4x-prevrashchaem-planshet-v-polnocennoe-rabochee.html" rel="bookmark" title="We turn the tablet into a full-fledged workplace for Android games with keyboard and mouse support"><img width="218" height="150" class="entry-thumb" src="/uploads/4806b3ffb65b48410cca5443e55872b6.jpg" alt="We turn the tablet into a full-fledged workplace for Android games with keyboard and mouse support" title="We turn the tablet into a full-fledged workplace for Android games with keyboard and mouse support"/ 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/en/nastroika-upravleniya-v-droid4x-prevrashchaem-planshet-v-polnocennoe-rabochee.html" rel="bookmark" title="We turn the tablet into a full-fledged workplace for Android games with keyboard and mouse support">We turn the tablet into a full-fledged workplace for Android games with keyboard and mouse support</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/en/nedostatochno-pamyati-v-world-of-tanks-reshenie-problemy-predotvrashchenie.html" rel="bookmark" title="Preventing Out-of-Memory Problems"><img width="218" height="150" class="entry-thumb" src="/uploads/675db6ccaf8907890dc857eaabc691ee.jpg" alt="Preventing Out-of-Memory Problems" title="Preventing Out-of-Memory Problems"/ 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/en/nedostatochno-pamyati-v-world-of-tanks-reshenie-problemy-predotvrashchenie.html" rel="bookmark" title="Preventing Out-of-Memory Problems">Preventing Out-of-Memory Problems</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/en/prevrashchaem-planshet-v-polnocennoe-rabochee-mesto-nastroika.html" rel="bookmark" title="Setting up control in Droid4X How to control games on android from the keyboard"><img width="218" height="150" class="entry-thumb" src="/uploads/cb51c9eb42a821b604bfdedade461621.jpg" alt="Setting up control in Droid4X How to control games on android from the keyboard" title="Setting up control in Droid4X How to control games on android from the keyboard"/ 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/en/prevrashchaem-planshet-v-polnocennoe-rabochee-mesto-nastroika.html" rel="bookmark" title="Setting up control in Droid4X How to control games on android from the keyboard">Setting up control in Droid4X How to control games on android from the keyboard</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/en/internet-prodazhi-sposoby-tehnologii-i-instrumenty-marketinga-v-seti-kak.html" rel="bookmark" title="How to increase sales in an online store: some useful recommendations Calls to action"><img width="218" height="150" class="entry-thumb" src="/uploads/ce003d1f3a3d37d64e62510816b0352c.jpg" alt="How to increase sales in an online store: some useful recommendations Calls to action" title="How to increase sales in an online store: some useful recommendations Calls to action"/ 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/en/internet-prodazhi-sposoby-tehnologii-i-instrumenty-marketinga-v-seti-kak.html" rel="bookmark" title="How to increase sales in an online store: some useful recommendations Calls to action">How to increase sales in an online store: some useful recommendations Calls to action</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 - Repair of computers and laptops. Video cards, hard drives, internet, monitors.</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>