როგორ ვიმუშაოთ XML დოკუმენტებთან Delphi-ში? კონკრეტულად იყენებთ TXMLDocument-ს? XML დოკუმენტის ობიექტის მოდელის გამოყენება.

დელფის ბევრი პროგრამისტი აკავშირებს პარამეტრების შენახვას გამოყენებასთან INIფაილები თქვენს პროგრამებში. ამ მეთოდის გამოყენება ნაკლებად სერიოზულ პროექტებში თავიდან უნდა იქნას აცილებული, რადგან ის ზღუდავს მოქნილობას, რაც ხელს უშლის პროგრამის შემდგომ გაფართოებას. აღსანიშნავია, რომ ეს მიდგომა საკმაოდ პოპულარულია გამოყენების სიმარტივის და განვითარების გარემოში ჩაშენებული ხელსაწყოების ხელმისაწვდომობის გამო.

თუმცა, პროგრამის პარამეტრების შესანახად იდეალური ვარიანტი სტრუქტურირებულია XMLფაილები. მათი უპირატესობა ის არის, რომ პარამეტრების რაოდენობა შეიძლება არ იყოს დაფიქსირებული. ამის უკეთ გასაგებად, მოდით შევხედოთ კონკრეტულ მაგალითს.

USearch პროგრამაში, როდესაც თქვენ დააჭირეთ ჩანაწერს, ჩნდება კონტექსტური მენიუ, რომელიც აჩვენებს ნივთების სიას. ეს ელემენტები არის ბრძანებები, რომლებიც თავის მხრივ იტვირთება პარამეტრების ფაილიდან. თუ პარამეტრები იყო შენახული INIფაილი, მაშინ პროგრამას შეუძლია შეინახოს და ჩატვირთოს გარკვეული რაოდენობის ბრძანებები, მაგალითად 10 ან 50. როგორც კი უფრო დიდი მნიშვნელობა იქნება საჭირო, კოდი უნდა გადაიწეროს და შესაბამისად გადაიწეროს.


მიდგომის გამოყენება გამოყენებით XMLფაილები, ჩვენ შევძლებთ ყველა სექციის პარამეტრის დინამიურად ჩატვირთვას. ამ ყველაფრის გარდა, კონფიგურაციის ფაილი გახდება უფრო ელეგანტური, პარამეტრების ზედმეტი ნუმერაციის გარეშე. თუმცა, სტანდარტული საშუალებებიიმუშაოს XMLდელფში ბევრი ნაკლი აქვს, ამიტომ გირჩევთ გამოიყენოთ სტანდარტული ბიბლიოთეკა MSXML. ის ჩვეულებრივ შედის ნაგულისხმევად ოპერატიული სისტემავინდოუსის ოჯახი.


Დაკავშირება MSXML, ჩვენ უნდა შევქმნათ ინტერფეისის ფაილი ყველა ფუნქციის სიით, მისი იმპორტი COM სერვერიდან. საკმაოდ დეტალური სტატია დაიწერა ინტერფეისის იმპორტის შესახებ, მაგრამ გირჩევთ ჩამოტვირთოთ ფაილი MSXML2_TLB.PASუკვე მზადაა გამოსაყენებლად. ფაილის გადმოტვირთვის შემდეგ, მოათავსეთ იგი თქვენი პროექტის გვერდით, ან ჩააგდეთ Delphi გარემოს lib საქაღალდეში. ამრიგად, ყველა შექმნილ პროგრამას შეეძლება მოდულის გამოყენება MSXML, თქვენ უბრალოდ უნდა დაამატოთ ხაზი MSXML2_TLB გამოყენებას.

სიცხადისთვის, განიხილეთ ამ ბიბლიოთეკის გამოყენების შემდეგი მაგალითი:

პროცედურა LoadData; var XMLDoc: DOMDocument; ფესვი: IXMLDOMElement; დაწყება XMLDoc:= CoDOMDocument.Create; XMLDoc.Load("settins.xml"); Root:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode("ზომა/სიგანე").ტექსტი); ფესვი:= ნული; XMLDoc:= ნული; დასასრული;

ჯერ იქმნება DODocument კლასის ეგზემპლარი, შემდეგ კი settings.xml ფაილის შიგთავსი იტვირთება მეხსიერებაში. ვინაიდან სტანდარტის მიხედვით ნებისმიერი XMLფაილი უნდა შეიცავდეს root ტეგს (in ამ შემთხვევაში კონფიგურაცია), მაშინ ჩვენ უნდა მივიღოთ იგი ფუნქციის გამოყენებით დოკუმენტის ელემენტი. შემდეგ ტეგებს შორის შიგთავსი გამოდის , რომლებიც თავის მხრივ განლაგებულია ტეგებს შორის . ამრიგად, settings.xml ფაილიდან ჩვენი მეთოდი აჩვენებს ტექსტს MessageBox-ში "100px".

500 პიქსელი 100 პიქსელი

აქ გამოიყენება SelectSingleNode მეთოდი, რომელიც პარამეტრად იღებს სტრიქონს

იმისდა მიუხედავად, რომ დელფში XML-თან მუშაობის თემა საკმაოდ ფართოდ იყო განხილული ინტერნეტში, ამ თემაზე კითხვები საკმაოდ ხშირად ჩნდება სხვადასხვა ფორუმზე.

მეც უკვე დავწერე, მაგრამ მინდა დავუბრუნდე XML ფაილის სწრაფად გარჩევისა და მონაცემების ამოღების რეალურ შემთხვევას, რაც დღეს სამსახურში გავაკეთე. საჭირო მონაცემების მოპოვებას არაუმეტეს 5 წუთი დამჭირდა.

ფონი. დღეს დაგვჭირდა მონაცემების დამუშავება დაინსტალირებული პროგრამებიმომხმარებელთა კომპიუტერებზე (დიახ, დიახ, ჩვენ აღმოვაჩენთ მეკობრეებს :)). ტექნიკურმა განყოფილებამ მომაწოდა ეს ინფორმაცია, რომელიც გათავისუფლდა უეჭველი მომხმარებლებისგან ქსელის საშუალებით WMI-ის გამოყენებით. მათ მიერ გამოყენებული პროგრამა აწარმოებს ანგარიშებს XML ფორმატი. შესაბამისად, მათ მომიტანეს XML ფაილების მთა საკმაოდ რთული სტრუქტურით, საიდანაც მხოლოდ დაინსტალირებული პროგრამული პროდუქტების სახელის ამოღება მჭირდებოდა.

მკურნალობა . რამდენიმე ფაილის ხელით გადახედვის შემდეგ მივხვდი, რომ დაბერებას დიდი დრო არ დასჭირდებოდა და გადავწყვიტე დამეწერა პატარა გადამყვანი. Delphi-ის გაშვების შემდეგ, მე ავირჩიე XML DataBinding ობიექტი საცავში და მივაწოდე მას ერთ-ერთი ფაილი. ნაგულისხმევად დავტოვე ყველა პარამეტრი და პარამეტრი და შედეგად შევქმენი მოდული დიდი თანხაკლასები და ინტერფეისები ამ XML ფაილის ელემენტებზე წვდომისთვის. დიდი დრო არ დავხარჯე კლასის სტრუქტურის გასარკვევად და მაშინვე გადავედი გადამყვანის დაწერაზე.

კონსოლის ახალ აპლიკაციაში დავწერე საკმაოდ მარტივი კოდი:


პროგრამა XML2TXT;

იყენებს
ფორმები
კლასები, SysUtils,
SoftwareXML "SoftwareXML.pas"-ში;

პროცედურა CovertXML2Text;
ვარ
softbase: IXMLSTDSoftwareType;
მე: მთელი რიცხვი;
sr: TSearchRec;
CurDir: სიმებიანი;
ExportFile: TStringList;
დაიწყება
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
თუ FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0 მაშინ
გაიმეორეთ
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;
სანამ FindNext(sr) 0;
დასასრული;

დაიწყება
განაცხადი.ინიციალიზაცია;
CovertXML2Text;
დასასრული.

შედეგად, მე მქონდა ერთი ტექსტური ფაილი თითოეული კომპიუტერისთვის ქსელში, რომელიც შეიცავდა დაინსტალირებული პროგრამული უზრუნველყოფის სიას.

ვგრძნობ, რომ ეს კოდი გარკვეულ ახსნას მოითხოვს. მაგალითად, რატომ გამოვიყენე Forms მოდული კონსოლის აპლიკაციაში და გამოვიძახე Application.Initialize; პროცედურა?

სინამდვილეში ეს მარტივია - ეს არის პატარა ჰაკ, რომელიც საშუალებას გაძლევთ გამოიყენოთ XML Data Binding კონსოლის აპლიკაციაში. იმის გამო, რომ მან ჯიუტად თქვა უარი XML-თან მუშაობისთვის კლასის ინიციალიზაციაზე. მე ჯერ ვერ გავარკვიე რეალური მიზეზები - დრო მნიშვნელოვანი იყო დღეს, მე უკვე დავხარჯე 5 წუთიდან 4 ამ შეცდომასთან ბრძოლაში. :) მგონი ამ პრობლემას მოგვიანებით გავუმკლავდები და დავწერ რა არის რეალური მიზეზი.

უცნაური softbase კლასი შეიქმნა XML ფაილის საფუძველზე - ასე ერქვა root ელემენტს და softbase.InstalledSoftware.source.software[i].DisplayName - უბრალოდ გადაიტანეთ ჩადგმული ელემენტები სასურველზე და მიიღეთ მისი მნიშვნელობა.

ეს არის რეალურად ის, რაც ერთ-ერთი ყველაზე გამოიყურება სწრაფი გზებიმუშაობა XML-თან Delphi-ში.

XML სულ უფრო ხშირად გამოიყენება ინფორმაციის შესანახად და აპლიკაციებსა და ვებსაიტებს შორის მისი გაცვლისთვის. ბევრი აპლიკაცია იყენებს ამ ენას, როგორც საბაზისო ენას მონაცემთა შესანახად, ზოგი კი იყენებს მას XML მონაცემების ექსპორტისა და იმპორტისთვის. ეს ნიშნავს, რომ დროა დეველოპერებმა იფიქრონ იმაზე, თუ როგორ შეუძლიათ გამოიყენონ XML მონაცემები საკუთარ აპლიკაციებში.

ამ სტატიაში განვიხილავთ XML დოკუმენტს ობიექტის მოდელი(DOM) და მისი განხორციელება Microsoft-ის მიერ - Microsoft XML DOM.

XML DOM არის ობიექტის მოდელი, რომელიც უზრუნველყოფს დეველოპერს ობიექტებს XML ფაილების ჩატვირთვისა და დამუშავებისთვის. ობიექტის მოდელი შედგება შემდეგი ძირითადი ობიექტებისგან: XMLDOMdocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap და XMLDOMParseError. თითოეული ეს ობიექტი (გარდა XMLDOMParseError-ისა) შეიცავს თვისებებს და მეთოდებს, რომლებიც საშუალებას გაძლევთ მიიღოთ ინფორმაცია ობიექტის შესახებ, მანიპულიროთ ობიექტის მნიშვნელობებით და სტრუქტურით და ნავიგაცია XML დოკუმენტის სტრუქტურაში.

მოდით გადავხედოთ XML DOM-ის ძირითად ობიექტებს და მოვიყვანოთ მათი გამოყენების რამდენიმე მაგალითი Borland Delphi-ში.

XML DOM-ის გამოყენება Borland Delphi-ში

იმისათვის, რომ გამოიყენოთ Microsoft XML DOM დელფის აპლიკაციებში, თქვენ უნდა დააკავშიროთ შესაბამისი ტიპის ბიბლიოთეკა პროექტს. ამისათვის ჩვენ ვასრულებთ ბრძანებას Project | იმპორტის ტიპის ბიბლიოთეკა და იმპორტის ტიპის ბიბლიოთეკის დიალოგურ ფანჯარაში აირჩიეთ Microsoft XML ვერსიის 2.0 ბიბლიოთეკა (ვერსია 2.0), რომელიც ჩვეულებრივ მდებარეობს ფაილში Windows\System\MSXML.DLL.

Create Unit ღილაკზე დაწკაპუნების შემდეგ შეიქმნება MSXML_TLB ინტერფეისის მოდული, რომელიც საშუალებას მოგვცემს გამოვიყენოთ XML DOM ობიექტები: DOMDocument, XMLDocument, XMLHTTPRequest და MSXML.DLL ბიბლიოთეკაში დანერგილი რიგი სხვა. MSXML_TLB მოდულის მითითება უნდა იყოს ჩამოთვლილი გამოყენების სიაში.

XML DOM მოწყობილობა

დოკუმენტის ობიექტის მოდელი წარმოადგენს XML დოკუმენტს, როგორც ხის სტრუქტურას, რომელიც შედგება ტოტებისაგან. XML DOM პროგრამირების ინტერფეისები საშუალებას აძლევს აპლიკაციებს ნავიგაცია მოახდინონ დოკუმენტის ხეზე და მანიპულირონ მისი ტოტებით. თითოეულ ფილიალს შეიძლება ჰქონდეს კონკრეტული ტიპი (DOMNodeType), რომლის მიხედვითაც განისაზღვრება მშობელი და შვილი ფილიალები. XML დოკუმენტების უმეტესობაში ნახავთ ფილიალებს, როგორიცაა ელემენტი, ატრიბუტი და ტექსტი. ატრიბუტები არის სპეციალური სახის ფილიალი და არ არის ბავშვის ფილიალი. ატრიბუტები გამოიყენება მართვისთვის სპეციალური მეთოდები, მოწოდებული XML DOM ობიექტებით.

მსოფლიო ქსელის კონსორციუმის (W3C) რეკომენდებული ინტერფეისების დანერგვის გარდა, Microsoft XML DOM შეიცავს მეთოდებს, რომლებიც მხარს უჭერენ XSL, XSL შაბლონებს, სახელების სივრცეებს ​​და მონაცემთა ტიპებს. მაგალითად, SelectNodes მეთოდი საშუალებას გაძლევთ გამოიყენოთ XSL Pattern Syntax ფილიალების მოსაძებნად კონკრეტულ კონტექსტში, ხოლო TransformNode მეთოდი მხარს უჭერს XSL-ის გამოყენებას ტრანსფორმაციების შესასრულებლად.

ტესტი XML დოკუმენტი

როგორც XML დოკუმენტის მაგალითი, ავიღოთ მუსიკალური CD-ROM-ების დირექტორია, რომელსაც აქვს შემდეგი სტრუქტურა:

იმპერიის ბურლესკი ბობ დილანი აშშ კოლუმბია 10.90 1985 დაიმალე შენი გული ბონი ტაილორი დიდი ბრიტანეთი CBS Records 9.90 1988 ... გახსენი ჩემი გული ჯო კოკერი აშშ EMI 8.20 1987

ახლა ჩვენ მზად ვართ დავიწყოთ XML DOM ობიექტის მოდელის ყურება, რომელსაც დავიწყებთ XMLDOMDocument ობიექტით.

XML დოკუმენტი - XMLDOMDdocument ობიექტი

XML დოკუმენტთან მუშაობა იწყება მისი ჩატვირთვით. ამისთვის ვიყენებთ Load მეთოდს, რომელსაც აქვს მხოლოდ ერთი პარამეტრი, რომელიც მიუთითებს ჩასატვირთი დოკუმენტის URL-ზე. ფაილების ლოკალური დისკიდან ჩატვირთვისას მითითებულია მხოლოდ ფაილის სრული სახელი (ამ შემთხვევაში შესაძლებელია file:/// პროტოკოლის გამოტოვება). თუ XML დოკუმენტი ინახება როგორც სტრიქონი, თქვენ უნდა გამოიყენოთ LoadXML მეთოდი დოკუმენტის ჩასატვირთად.

დოკუმენტის ჩატვირთვის (სინქრონული ან ასინქრონული) სამართავად, გამოიყენეთ Async თვისება. ნაგულისხმევად, ეს თვისება დაყენებულია True-ზე, რაც მიუთითებს იმაზე, რომ დოკუმენტი ასინქრონულად იტვირთება და კონტროლი უბრუნდება აპლიკაციას დოკუმენტის სრულად ჩატვირთვამდე. წინააღმდეგ შემთხვევაში, დოკუმენტი იტვირთება სინქრონულად და შემდეგ თქვენ უნდა შეამოწმოთ ReadyState თვისების მნიშვნელობა, რათა გაარკვიოთ, ჩაიტვირთა თუ არა დოკუმენტი. თქვენ ასევე შეგიძლიათ შექმნათ OnReadyStateChange ღონისძიების დამმუშავებელი, რომელიც მიიღებს კონტროლს, როდესაც შეიცვლება ReadyState თვისების მნიშვნელობა.

ქვემოთ მოცემულია, თუ როგორ უნდა ჩატვირთოთ XML დოკუმენტი ჩატვირთვის მეთოდის გამოყენებით:

იყენებს ... MSXML_TLB ... პროცედურა TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDdocument; დაწყება XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // // აქ არის კოდი, რომელიც მანიპულირებს // XML დოკუმენტს და მის ფილიალებს // XMLDoc:= Nil; დასასრული;

დოკუმენტის ჩატვირთვის შემდეგ, ჩვენ შეგვიძლია მივიღოთ მისი თვისებები. ამრიგად, NodeName თვისება შეიცავს მნიშვნელობას #document, NodeTypeString თვისება შეიცავს მნიშვნელობის დოკუმენტს, ხოლო URL თვისება შეიცავს მნიშვნელობას file:///C:/DATA/DATA.xml.

შეცდომის დამუშავება

განსაკუთრებით საინტერესოა ის თვისებები, რომლებიც დაკავშირებულია დოკუმენტის დამუშავებასთან მისი ჩატვირთვისას. ამრიგად, ParseError თვისება აბრუნებს XMLDOMParseError ობიექტს, რომელიც შეიცავს ინფორმაციას დოკუმენტის დამუშავების დროს წარმოქმნილი შეცდომის შესახებ.

შეცდომის დამმუშავებლის დასაწერად შეგიძლიათ დაამატოთ შემდეგი კოდი:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; თუ XMLError.ErrorCode<>0 შემდეგ // // აქ ჩვენ ვამუშავებთ შეცდომას // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;

იმის სანახავად, თუ რა ინფორმაცია დაბრუნდება შეცდომის შემთხვევაში, შევცვალოთ დირექტორიაში ჩანაწერი:

იმპერიის ბურლესკი ბობ დილანი აშშ კოლუმბია 10.90 1985

დახურვის ელემენტის ამოღება მეორე სტრიქონში:</p><p> <CD> <TITLE>იმპერიის ბურლესკი <ARTIST>ბობ დილანი</ARTIST> <COUNTRY>აშშ</COUNTRY> <COMPANY>კოლუმბია</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>ახლა მოდით დავწეროთ კოდი, რომელიც აბრუნებს XMLDOMParseError ობიექტის თვისებების მნიშვნელობებს:</p><p>XMLError:= XMLDoc.ParseError; თუ XMLError.ErrorCode<>0 შემდეგ XMLError-ით, Memo1.Lines იწყება Add('File:' + URL); Add('Code:' + IntToStr(ErrorCode)); დამატება ("შეცდომა:" + მიზეზი); Add('ტექსტი:' + SrcText); Add('Line:' + IntToStr(Line)); Add('პოზიცია:' + IntToStr(LinePos)); ბოლოს Else Memo1.Lines.Add(XMLDoc.XML); Დასასრული;</p><p>და მოდით გავუშვათ ჩვენი აპლიკაცია. შედეგად, ჩვენ ვიღებთ შემდეგ ინფორმაციას შეცდომის შესახებ.</p> <p>როგორც ზემოთ მოყვანილი მაგალითიდან ხედავთ, XMLDOMParseError ობიექტის მიერ დაბრუნებული ინფორმაცია სავსებით საკმარისია შეცდომის ლოკალიზაციისთვის და მისი წარმოშობის მიზეზის გასაგებად.</p> <p>ახლა აღვადგინოთ დახურვის ელემენტი <TITLE>ჩვენს დოკუმენტში და გავაგრძელოთ XML DOM-ის განხილვა.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დოკუმენტის ხეზე წვდომა</h2> <p>დოკუმენტის ხეზე წვდომისთვის შეგიძლიათ მიიღოთ root ელემენტი და შემდეგ გაიმეოროთ მისი შვილობილი ტოტებით, ან იპოვოთ კონკრეტული ფილიალი. პირველ შემთხვევაში, ჩვენ ვიღებთ root ელემენტს DocumentElement თვისების მეშვეობით, რომელიც აბრუნებს XMLDOMNode ტიპის ობიექტს. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ DocumentElement თვისება თითოეული ბავშვის ელემენტის შინაარსის მისაღებად:</p><p>Var Node: IXMLDOMNode; ფესვი: IXMLDOMElement; I: მთელი რიცხვი; ... Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;</p><p>ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს.</p> <p>თუ ჩვენ გვაინტერესებს კონკრეტული ფილიალი ან ფილიალი პირველი შვილის ფილიალის ქვემოთ, შეგვიძლია გამოვიყენოთ NodeFromID მეთოდი ან XMLDOMDocument ობიექტის GetElementByTagName მეთოდი.</p> <p>NodeFromID მეთოდი მოითხოვს უნიკალურ იდენტიფიკატორს, რომელიც განსაზღვრულია XML სქემაში ან დოკუმენტის ტიპის განსაზღვრაში (DTD) და აბრუნებს ფილიალს ამ იდენტიფიკატორით.</p> <p>GetElementByTagName მეთოდი მოითხოვს სტრიქონის მითითებას კონკრეტული ელემენტით (ტეგი) და აბრუნებს ყველა ფილიალს ამ ელემენტით. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ ეს მეთოდი, რომ იპოვოთ ყველა შემსრულებელი ჩვენს CD-ROM დირექტორიაში:</p><p>კვანძები: IXMLDOMNodeList; კვანძი: IXMLDOMNode; ... კვანძები:= XMLDoc.GetElementsByTagName('ARTIST'); I:= 0-ისთვის Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;</p><p>ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს</p> <p>გაითვალისწინეთ, რომ XMLDOMNode ობიექტის SelectNodes მეთოდი უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. მაგრამ უფრო მეტი ამის შესახებ ქვემოთ.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დოკუმენტის ფილიალი - XMLDOMNode ობიექტი</h2> <p>XMLDOMNode ობიექტი წარმოადგენს დოკუმენტის ფილიალს. ჩვენ უკვე შევხვდით ამ ობიექტს, როდესაც მივიღეთ დოკუმენტის ძირითადი ელემენტი:</p><p>Root:= XMLDoc.DocumentElement;</p><p>XML დოკუმენტის ფილიალის შესახებ ინფორმაციის მისაღებად, შეგიძლიათ გამოიყენოთ XMLDOMNode ობიექტის თვისებები (ცხრილი 1).</p> <p>ფილიალში შენახულ მონაცემებზე წვდომისთვის, ჩვეულებრივ, იყენებთ NodeValue თვისებას (ხელმისაწვდომია ატრიბუტებისთვის, ტექსტის ტოტებისთვის, კომენტარებისთვის, დამუშავების ინსტრუქციებისთვის და CDATA სექციებისთვის), ტექსტის თვისებას, რომელიც აბრუნებს ფილიალის ტექსტურ შინაარსს, ან NodeTypedValue თვისებას. . თუმცა, ეს უკანასკნელი შეიძლება გამოყენებულ იქნას მხოლოდ აკრეფილი ელემენტების მქონე ტოტებისთვის.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>დოკუმენტის ხეზე ნავიგაცია</h3> <p>XMLDOMNode ობიექტი გთავაზობთ დოკუმენტის ხეზე ნავიგაციის მრავალ გზას. მაგალითად, მშობლის ფილიალში წვდომისთვის გამოიყენება ParentNode თვისება (XMLDOMNode ტიპი), შვილობილი ფილიალების წვდომა ხდება ChildNodes (XMLDOMNodeList ტიპი), FirstChild და LastChild (XMLDOMNode ტიპის) თვისებებით და ა.შ. OwnerDocument თვისება აბრუნებს XMLDOMDocument ტიპის ობიექტს, რომელიც განსაზღვრავს თავად XML დოკუმენტს. ზემოთ ჩამოთვლილი თვისებები საშუალებას გაძლევთ მარტივად გადახვიდეთ დოკუმენტის ხეზე.</p> <p>ახლა მოდით გადავხედოთ XML დოკუმენტის ყველა ფილიალს:</p><p>Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; თუ Node.HasChildNodes მაშინ GetChilds(Node,0); Დასასრული;</p><p>როგორც ზემოთ აღინიშნა, XMLDOMNode ობიექტის SelectNodes უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. გარდა ამისა, არსებობს SelectSingleNode მეთოდი, რომელიც აბრუნებს დოკუმენტის მხოლოდ პირველ ფილიალს. ორივე ეს მეთოდი საშუალებას გაძლევთ მიუთითოთ XSL შაბლონები ფილიალების მოსაძებნად.</p> <p>მოდით გავიაროთ SelectNodes მეთოდის გამოყენების პროცესი, რათა მოვიძიოთ ყველა ფილიალი, რომელსაც აქვს CD ფილიალი და PRICE ქვეგანყოფილება:</p><p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');</p><p>CD-ის ფილიალის PRICE-ის ყველა ქვეგანყოფილება განთავსდება Nodes-ის კოლექციაში. XSL შაბლონების განხილვას ცოტა მოგვიანებით დავუბრუნდებით.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>ბავშვთა ფილიალების მანიპულირება</h3> <p>ბავშვის ფილიალების მანიპულირებისთვის, ჩვენ შეგვიძლია გამოვიყენოთ XMLDOMNode ობიექტის მეთოდები (ცხრილი 2).</p> <p>იმისათვის, რომ მთლიანად წაშალოთ პირველი დისკის ჩანაწერი, თქვენ უნდა გაუშვათ შემდეგი კოდი:</p><p>Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= მცდარი; XMLDoc.Load('C:\DATA\DATA.xml'); // მიიღეთ ძირეული ელემენტი Root:= XMLDoc.DocumentElement; კვანძი:= ფესვი; // პირველი შვილის ტოტის ამოღება Node.RemoveChild(Node.FirstChild);</p><p>გაითვალისწინეთ, რომ ამ მაგალითში ჩვენ ვშლით პირველი შვილის ფილიალს. როგორ ამოიღოთ პირველი ბავშვის ფილიალის პირველი ელემენტი, ნაჩვენებია ქვემოთ:</p><p>Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= მცდარი; XMLDoc.Load('C:\DATA\DATA.xml'); // მიიღეთ ძირეული ელემენტი Root:= XMLDoc.DocumentElement; // და პირველი შვილის ფილიალი Node:= Root.FirstChild; // პირველი შვილის ტოტის ამოღება Node.RemoveChild(Node.FirstChild);</p><p>ზემოთ მოყვანილ მაგალითში ჩვენ წავშალეთ არა პირველი ფილიალი <CD>…</CD>, და ფილიალის პირველი ელემენტია <TITLE>….

ახლა დავამატოთ ახალი ფილიალი. ქვემოთ მოცემულია კოდი, რომელიც გვიჩვენებს, თუ როგორ უნდა დაამატოთ ახალი მუსიკალური CD-ROM ჩანაწერი:

Var NewNode: IXMLDOMNode; ბავშვი: IXMLDOMNode; ... // შექმენით ახალი ფილიალი - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // ელემენტის დამატება Child:= XMLDoc.CreateNode(1,'TITLE',''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= 'Pink Floyd'; // ელემენტის დამატება <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= 'Division Bell'; // ელემენტის დამატება <COUNTRY>Child:= XMLDoc.CreateNode(1, 'COUNTRY', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= 'UK'; // ელემენტის დამატება <COMPANY>Child:= XMLDoc.CreateNode(1, 'COMPANY', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= ‘EMI Records Ltd.’; // ელემენტის დამატება <PRICE>Child:= XMLDoc.CreateNode(1, 'PRICE', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= '11.99"; // დაამატეთ ელემენტი <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= '1994'; // და დაამატეთ ფილიალი Root.AppendChild(NewNode); ...</p><p>ზემოთ მოცემული კოდი გვიჩვენებს შემდეგი ნაბიჯების თანმიმდევრობას ახალი ფილიალის დასამატებლად:</p> <ul><li>ახალი ფილიალის შექმნა CreateNode მეთოდის გამოყენებით: <ul><li>ელემენტის შექმნა CreateNode მეთოდის გამოყენებით;</li> <li>ფილიალში ელემენტის დამატება AppendChild მეთოდის გამოყენებით;</li> <li>ელემენტის მნიშვნელობის დაყენება Text თვისების მეშვეობით;</li> <li>...გაიმეორეთ ყველა ელემენტისთვის.</li> </ul></li> <li>დოკუმენტში ახალი ფილიალის დამატება AppendChild მეთოდის გამოყენებით.</li> </ul><p>შეგახსენებთ, რომ AppendChild მეთოდი ამატებს ტოტს ხის ბოლოს. იმისათვის, რომ დაამატოთ ტოტი ხის კონკრეტულ ადგილას, უნდა გამოიყენოთ მეთოდი InsertBefore.</p> <h2>ფილიალის ნაკრები - XMLDOMNodeList ობიექტი</h2> <p>XMLNodeList ობიექტი შეიცავს ფილიალების სიას, რომლებიც შეიძლება აშენდეს SelectNodes ან GetElementsByTagName მეთოდების გამოყენებით, ან მიღებულ იქნას ChildNodes თვისებიდან.</p> <p>ჩვენ უკვე განვიხილეთ ამ ობიექტის გამოყენება მაგალითში, რომელიც მოცემულია სექციაში "დოკუმენტის ხეზე ნავიგაცია". წარმოგიდგენთ რამდენიმე თეორიულ შენიშვნას.</p> <p>სიაში ფილიალების რაოდენობა შეიძლება მივიღოთ Length ქონების ღირებულების სახით. ფილიალებს აქვთ ინდექსები 0-დან Length-1-მდე და თითოეული ცალკეული ფილიალი ხელმისაწვდომია Item array ელემენტის მეშვეობით შესაბამისი ინდექსით.</p> <p>ფილიალების სიაში ნავიგაცია ასევე შეიძლება განხორციელდეს NextNode მეთოდის გამოყენებით, რომელიც აბრუნებს სიაში მომდევნო ფილიალს, ან Nil-ს, თუ მიმდინარე ფილიალი ბოლოა. სიის დასაწყისში დასაბრუნებლად გამოიძახეთ გადატვირთვის მეთოდი.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დოკუმენტების შექმნა და შენახვა</h2> <p>აქამდე ჩვენ განვიხილეთ, თუ როგორ შეგიძლიათ დაამატოთ ფილიალები და ელემენტები არსებულ XML დოკუმენტებში. ახლა მოდით შევქმნათ XML დოკუმენტი პირდაპირ ეთერში. პირველ რიგში, შეგახსენებთ, რომ დოკუმენტის ჩატვირთვა შესაძლებელია არა მხოლოდ URL-დან, არამედ ჩვეულებრივი სტრიქონიდან. ქვემოთ მოცემულია, თუ როგორ უნდა შექმნათ root ელემენტი, რომელიც შემდეგ შეიძლება გამოყენებულ იქნას სხვა ელემენტების დინამიურად ასაგებად (რაზეც ჩვენ უკვე განვიხილეთ ბავშვთა ფილიალების მანიპულირება განყოფილებაში):</p><p>Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; S: WideString; ... ს: = ' <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>XML დოკუმენტის აგების შემდეგ, ჩვენ შევინახავთ მას ფაილში Save მეთოდის გამოყენებით. Მაგალითად:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>გარდა ფაილში შენახვისა, Save მეთოდი საშუალებას გაძლევთ შეინახოთ XML დოკუმენტი ახალ XMLDOMDocument ობიექტში. ამ შემთხვევაში დოკუმენტი მთლიანად დამუშავებულია და შედეგად, მოწმდება მისი სტრუქტურა და სინტაქსი. ქვემოთ მოცემულია, თუ როგორ შეინახოთ დოკუმენტი სხვა ობიექტში:</p><p>პროცედურა TForm1.Button2Click(Sender: TObject); var XMLDoc2: IXMLDOMDდოკუმენტი; დაწყება XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nil; დასასრული;</p><p>და ბოლოს, გაითვალისწინეთ, რომ Save მეთოდი ასევე გაძლევთ საშუალებას შეინახოთ XML დოკუმენტი სხვა COM ობიექტებში, რომლებიც მხარს უჭერენ IStream, IPersistStream ან IPersistStreamInit ინტერფეისებს.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL შაბლონების გამოყენება</h2> <p>XMLDOMNode ობიექტის SelectNodes მეთოდის განხილვისას აღვნიშნეთ, რომ ის უზრუნველყოფს დოკუმენტის ფილიალების წვდომის უფრო მოქნილ გზას. მოქნილობა მდგომარეობს იმაში, რომ ფილიალების შერჩევის კრიტერიუმად შეგიძლიათ მიუთითოთ XSL შაბლონი. ასეთი შაბლონები XML დოკუმენტებში ინფორმაციის ძიების მძლავრ მექანიზმს იძლევა. მაგალითად, ჩვენს კატალოგში არსებული ყველა მუსიკალური CD-ROM-ის სათაურის სიის მისაღებად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:</p><p>იმის გასარკვევად, თუ რომელი შემსრულებლის დისკები გამოუშვეს აშშ-ში, მოთხოვნა ყალიბდება შემდეგნაირად:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>ქვემოთ მოცემულია, თუ როგორ უნდა იპოვოთ პირველი დისკი დირექტორიაში:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>და ბოლო:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>ბობ დილანის დისკების საპოვნელად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:</p><p>Nodes:= Root.SelectNodes('CD[$any$ ARTIST= "ბობ დილანი"]/TITLE');</p><p>და 1985 წლის შემდეგ გამოშვებული დისკების სიის მისაღებად, ჩვენ ვატარებთ შემდეგ შეკითხვას:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>XSL სინტაქსის უფრო დეტალური განხილვა მოითხოვს ცალკე პოსტს. მკითხველების დასაინტრიგებლად და შემდგომი კვლევის წახალისებისთვის, მე მოვიყვან მხოლოდ ერთ მცირე მაგალითს XSL-ის შესაძლო გამოყენების შესახებ. ვთქვათ, ჩვენ უნდა გადავიყვანოთ ჩვენი კატალოგი ჩვეულებრივ HTML ცხრილად. ტრადიციული მეთოდების გამოყენებით, ჩვენ უნდა გავიაროთ ხის ყველა ტოტი და შევქმნათ შესაბამისი ტეგები თითოეული მიღებული ელემენტისთვის <TD>…</TD>.</p> <p>XSL-ის გამოყენებით, ჩვენ უბრალოდ ვქმნით შაბლონს (ან სტილის ფურცელს), რომელშიც მივუთითებთ რა და როგორ უნდა გადაკეთდეს. შემდეგ ამ შაბლონს გადავაფარებთ ჩვენს დირექტორიაში - და დავასრულეთ: გვაქვს XSL შაბლონის ტექსტი, რომელიც კატალოგს ცხრილად გარდაქმნის (განცხადება 2).</p> <p>ჩვენს დირექტორიაში XSL შაბლონის გადაფარვის კოდი ასე გამოიყურება:</p><p>პროცედურა TForm1.Button2Click(Sender: TObject); var XSLDoc: IXMLDOMDდოკუმენტი; დაწყება XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Nil; დასასრული;</p><p>XSL-ის შესახებ ჩვენი განხილვის დასასრულს, უნდა ითქვას, რომ ამჟამად ეს ენა აქტიურად გამოიყენება სხვადასხვა XML დოკუმენტებს შორის ტრანსფორმაციისთვის, ასევე დოკუმენტის ფორმატირებისთვის.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დასკვნა</h2> <p>გასაგები მიზეზების გამო, შეუძლებელია Microsoft XML DOM-ის ყველა ობიექტის მიმოხილვა და მათი გამოყენების მაგალითების ერთ სტატიაში მოყვანა. აქ მხოლოდ აპლიკაციებში XML DOM-ის გამოყენების ძირითად საკითხებს შევეხეთ. მაგიდაზე სურათი 3 გვიჩვენებს Microsoft XML DOM-ში განხორციელებულ ყველა ობიექტს.</p> <p>ComputerPress 12"2000წ</p> <p>XML სულ უფრო ხშირად გამოიყენება ინფორმაციის შესანახად და აპლიკაციებსა და ვებსაიტებს შორის მისი გაცვლისთვის. ბევრი აპლიკაცია იყენებს ამ ენას, როგორც საბაზისო ენას მონაცემთა შესანახად, ზოგი კი იყენებს მას XML მონაცემების ექსპორტისა და იმპორტისთვის. ეს ნიშნავს, რომ დროა დეველოპერებმა იფიქრონ იმაზე, თუ როგორ შეუძლიათ გამოიყენონ XML მონაცემები საკუთარ აპლიკაციებში.</p> <p>ამ სტატიაში განვიხილავთ XML Document Object Model-ს (DOM) და მის განხორციელებას Microsoft-ის მიერ - Microsoft XML DOM.</p> <p>XML DOM არის ობიექტის მოდელი, რომელიც უზრუნველყოფს დეველოპერს ობიექტებს XML ფაილების ჩატვირთვისა და დამუშავებისთვის. ობიექტის მოდელი შედგება შემდეგი ძირითადი ობიექტებისგან: XMLDOMdocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap და XMLDOMParseError. თითოეული ეს ობიექტი (გარდა XMLDOMParseError-ისა) შეიცავს თვისებებს და მეთოდებს, რომლებიც საშუალებას გაძლევთ მიიღოთ ინფორმაცია ობიექტის შესახებ, მანიპულიროთ ობიექტის მნიშვნელობებით და სტრუქტურით და ნავიგაცია XML დოკუმენტის სტრუქტურაში.</p> <p>მოდით გადავხედოთ XML DOM-ის ძირითად ობიექტებს და მოვიყვანოთ მათი გამოყენების რამდენიმე მაგალითი Borland Delphi-ში.</p> <h2>XML DOM-ის გამოყენება Borland Delphi-ში</h2> <p>იმისათვის, რომ გამოიყენოთ Microsoft XML DOM დელფის აპლიკაციებში, თქვენ უნდა დააკავშიროთ შესაბამისი ტიპის ბიბლიოთეკა პროექტს. ამისათვის ჩვენ ვასრულებთ ბრძანებას Project | იმპორტის ტიპის ბიბლიოთეკა და იმპორტის ტიპის ბიბლიოთეკის დიალოგურ ფანჯარაში აირჩიეთ Microsoft XML ვერსიის 2.0 ბიბლიოთეკა (ვერსია 2.0), რომელიც ჩვეულებრივ მდებარეობს ფაილში Windows\System\MSXML.DLL.</p> <p>Create Unit ღილაკზე დაწკაპუნების შემდეგ შეიქმნება MSXML_TLB ინტერფეისის მოდული, რომელიც საშუალებას მოგვცემს გამოვიყენოთ XML DOM ობიექტები: DOMDocument, XMLDocument, XMLHTTPRequest და MSXML.DLL ბიბლიოთეკაში დანერგილი რიგი სხვა. MSXML_TLB მოდულის მითითება უნდა იყოს ჩამოთვლილი გამოყენების სიაში.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XML DOM მოწყობილობა</h2> <p>დოკუმენტის ობიექტის მოდელი წარმოადგენს XML დოკუმენტს, როგორც ხის სტრუქტურას, რომელიც შედგება ტოტებისაგან. XML DOM პროგრამირების ინტერფეისები საშუალებას აძლევს აპლიკაციებს ნავიგაცია მოახდინონ დოკუმენტის ხეზე და მანიპულირონ მისი ტოტებით. თითოეულ ფილიალს შეიძლება ჰქონდეს კონკრეტული ტიპი (DOMNodeType), რომლის მიხედვითაც განისაზღვრება მშობელი და შვილი ფილიალები. XML დოკუმენტების უმეტესობაში ნახავთ ფილიალებს, როგორიცაა ელემენტი, ატრიბუტი და ტექსტი. ატრიბუტები არის სპეციალური სახის ფილიალი და არ არის ბავშვის ფილიალი. ატრიბუტების მანიპულირება ხდება XML DOM ობიექტების მიერ მოწოდებული სპეციალური მეთოდების გამოყენებით.</p> <p>მსოფლიო ქსელის კონსორციუმის (W3C) რეკომენდებული ინტერფეისების დანერგვის გარდა, Microsoft XML DOM შეიცავს მეთოდებს, რომლებიც მხარს უჭერენ XSL, XSL შაბლონებს, სახელების სივრცეებს ​​და მონაცემთა ტიპებს. მაგალითად, SelectNodes მეთოდი საშუალებას გაძლევთ გამოიყენოთ XSL Pattern Syntax ფილიალების მოსაძებნად კონკრეტულ კონტექსტში, ხოლო TransformNode მეთოდი მხარს უჭერს XSL-ის გამოყენებას ტრანსფორმაციების შესასრულებლად.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>ტესტი XML დოკუმენტი</h2> <p>როგორც XML დოკუმენტის მაგალითი, ავიღოთ მუსიკალური CD-ROM-ების დირექტორია, რომელსაც აქვს შემდეგი სტრუქტურა:</p><p> <?xml version=”1.0"?> <CATALOG> <CD> <TITLE>იმპერიის ბურლესკი ბობ დილანი აშშ კოლუმბია 10.90 1985 დაიმალე შენი გული ბონი ტაილორი დიდი ბრიტანეთი CBS Records 9.90 1988 ... გახსენი ჩემი გული ჯო კოკერი აშშ EMI 8.20 1987

ახლა ჩვენ მზად ვართ დავიწყოთ XML DOM ობიექტის მოდელის ყურება, რომელსაც დავიწყებთ XMLDOMDocument ობიექტით.

XML დოკუმენტი - XMLDOMDdocument ობიექტი

XML დოკუმენტთან მუშაობა იწყება მისი ჩატვირთვით. ამისთვის ვიყენებთ Load მეთოდს, რომელსაც აქვს მხოლოდ ერთი პარამეტრი, რომელიც მიუთითებს ჩასატვირთი დოკუმენტის URL-ზე. ფაილების ლოკალური დისკიდან ჩატვირთვისას მითითებულია მხოლოდ ფაილის სრული სახელი (ამ შემთხვევაში შესაძლებელია file:/// პროტოკოლის გამოტოვება). თუ XML დოკუმენტი ინახება როგორც სტრიქონი, თქვენ უნდა გამოიყენოთ LoadXML მეთოდი დოკუმენტის ჩასატვირთად.

დოკუმენტის ჩატვირთვის (სინქრონული ან ასინქრონული) სამართავად, გამოიყენეთ Async თვისება. ნაგულისხმევად, ეს თვისება დაყენებულია True-ზე, რაც მიუთითებს იმაზე, რომ დოკუმენტი ასინქრონულად იტვირთება და კონტროლი უბრუნდება აპლიკაციას დოკუმენტის სრულად ჩატვირთვამდე. წინააღმდეგ შემთხვევაში, დოკუმენტი იტვირთება სინქრონულად და შემდეგ თქვენ უნდა შეამოწმოთ ReadyState თვისების მნიშვნელობა, რათა გაარკვიოთ, ჩაიტვირთა თუ არა დოკუმენტი. თქვენ ასევე შეგიძლიათ შექმნათ OnReadyStateChange ღონისძიების დამმუშავებელი, რომელიც მიიღებს კონტროლს, როდესაც შეიცვლება ReadyState თვისების მნიშვნელობა.

ქვემოთ მოცემულია, თუ როგორ უნდა ჩატვირთოთ XML დოკუმენტი ჩატვირთვის მეთოდის გამოყენებით:

იყენებს ... MSXML_TLB ... პროცედურა TForm1.Button1Click(Sender: TObject); var XMLDoc: IXMLDOMDdocument; დაწყება XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= False; XMLDoc.Load('C:\DATA\DATA.xml'); // // აქ არის კოდი, რომელიც მანიპულირებს // XML დოკუმენტს და მის ფილიალებს // XMLDoc:= Nil; დასასრული;

დოკუმენტის ჩატვირთვის შემდეგ, ჩვენ შეგვიძლია მივიღოთ მისი თვისებები. ამრიგად, NodeName თვისება შეიცავს მნიშვნელობას #document, NodeTypeString თვისება შეიცავს მნიშვნელობის დოკუმენტს, ხოლო URL თვისება შეიცავს მნიშვნელობას file:///C:/DATA/DATA.xml.

შეცდომის დამუშავება

განსაკუთრებით საინტერესოა ის თვისებები, რომლებიც დაკავშირებულია დოკუმენტის დამუშავებასთან მისი ჩატვირთვისას. ამრიგად, ParseError თვისება აბრუნებს XMLDOMParseError ობიექტს, რომელიც შეიცავს ინფორმაციას დოკუმენტის დამუშავების დროს წარმოქმნილი შეცდომის შესახებ.

შეცდომის დამმუშავებლის დასაწერად შეგიძლიათ დაამატოთ შემდეგი კოდი:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; თუ XMLError.ErrorCode<>0 შემდეგ // // აქ ჩვენ ვამუშავებთ შეცდომას // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Nil;

იმის სანახავად, თუ რა ინფორმაცია დაბრუნდება შეცდომის შემთხვევაში, შევცვალოთ დირექტორიაში ჩანაწერი:

იმპერიის ბურლესკი ბობ დილანი აშშ კოლუმბია 10.90 1985

დახურვის ელემენტის ამოღება მეორე სტრიქონში:</p><p> <CD> <TITLE>იმპერიის ბურლესკი <ARTIST>ბობ დილანი</ARTIST> <COUNTRY>აშშ</COUNTRY> <COMPANY>კოლუმბია</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>ახლა მოდით დავწეროთ კოდი, რომელიც აბრუნებს XMLDOMParseError ობიექტის თვისებების მნიშვნელობებს:</p><p>XMLError:= XMLDoc.ParseError; თუ XMLError.ErrorCode<>0 შემდეგ XMLError-ით, Memo1.Lines იწყება Add('File:' + URL); Add('Code:' + IntToStr(ErrorCode)); დამატება ("შეცდომა:" + მიზეზი); Add('ტექსტი:' + SrcText); Add('Line:' + IntToStr(Line)); Add('პოზიცია:' + IntToStr(LinePos)); ბოლოს Else Memo1.Lines.Add(XMLDoc.XML); Დასასრული;</p><p>და მოდით გავუშვათ ჩვენი აპლიკაცია. შედეგად, ჩვენ ვიღებთ შემდეგ ინფორმაციას შეცდომის შესახებ.</p> <p>როგორც ზემოთ მოყვანილი მაგალითიდან ხედავთ, XMLDOMParseError ობიექტის მიერ დაბრუნებული ინფორმაცია სავსებით საკმარისია შეცდომის ლოკალიზაციისთვის და მისი წარმოშობის მიზეზის გასაგებად.</p> <p>ახლა აღვადგინოთ დახურვის ელემენტი <TITLE>ჩვენს დოკუმენტში და გავაგრძელოთ XML DOM-ის განხილვა.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დოკუმენტის ხეზე წვდომა</h2> <p>დოკუმენტის ხეზე წვდომისთვის შეგიძლიათ მიიღოთ root ელემენტი და შემდეგ გაიმეოროთ მისი შვილობილი ტოტებით, ან იპოვოთ კონკრეტული ფილიალი. პირველ შემთხვევაში, ჩვენ ვიღებთ root ელემენტს DocumentElement თვისების მეშვეობით, რომელიც აბრუნებს XMLDOMNode ტიპის ობიექტს. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ DocumentElement თვისება თითოეული ბავშვის ელემენტის შინაარსის მისაღებად:</p><p>Var Node: IXMLDOMNode; ფესვი: IXMLDOMElement; I: მთელი რიცხვი; ... Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;</p><p>ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს.</p> <p>თუ ჩვენ გვაინტერესებს კონკრეტული ფილიალი ან ფილიალი პირველი შვილის ფილიალის ქვემოთ, შეგვიძლია გამოვიყენოთ NodeFromID მეთოდი ან XMLDOMDocument ობიექტის GetElementByTagName მეთოდი.</p> <p>NodeFromID მეთოდი მოითხოვს უნიკალურ იდენტიფიკატორს, რომელიც განსაზღვრულია XML სქემაში ან დოკუმენტის ტიპის განსაზღვრაში (DTD) და აბრუნებს ფილიალს ამ იდენტიფიკატორით.</p> <p>GetElementByTagName მეთოდი მოითხოვს სტრიქონის მითითებას კონკრეტული ელემენტით (ტეგი) და აბრუნებს ყველა ფილიალს ამ ელემენტით. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ ეს მეთოდი, რომ იპოვოთ ყველა შემსრულებელი ჩვენს CD-ROM დირექტორიაში:</p><p>კვანძები: IXMLDOMNodeList; კვანძი: IXMLDOMNode; ... კვანძები:= XMLDoc.GetElementsByTagName('ARTIST'); I:= 0-ისთვის Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;</p><p>ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს</p> <p>გაითვალისწინეთ, რომ XMLDOMNode ობიექტის SelectNodes მეთოდი უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. მაგრამ უფრო მეტი ამის შესახებ ქვემოთ.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დოკუმენტის ფილიალი - XMLDOMNode ობიექტი</h2> <p>XMLDOMNode ობიექტი წარმოადგენს დოკუმენტის ფილიალს. ჩვენ უკვე შევხვდით ამ ობიექტს, როდესაც მივიღეთ დოკუმენტის ძირითადი ელემენტი:</p><p>Root:= XMLDoc.DocumentElement;</p><p>XML დოკუმენტის ფილიალის შესახებ ინფორმაციის მისაღებად, შეგიძლიათ გამოიყენოთ XMLDOMNode ობიექტის თვისებები (ცხრილი 1).</p> <p>ფილიალში შენახულ მონაცემებზე წვდომისთვის, ჩვეულებრივ, იყენებთ NodeValue თვისებას (ხელმისაწვდომია ატრიბუტებისთვის, ტექსტის ტოტებისთვის, კომენტარებისთვის, დამუშავების ინსტრუქციებისთვის და CDATA სექციებისთვის), ტექსტის თვისებას, რომელიც აბრუნებს ფილიალის ტექსტურ შინაარსს, ან NodeTypedValue თვისებას. . თუმცა, ეს უკანასკნელი შეიძლება გამოყენებულ იქნას მხოლოდ აკრეფილი ელემენტების მქონე ტოტებისთვის.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>დოკუმენტის ხეზე ნავიგაცია</h3> <p>XMLDOMNode ობიექტი გთავაზობთ დოკუმენტის ხეზე ნავიგაციის მრავალ გზას. მაგალითად, მშობლის ფილიალში წვდომისთვის გამოიყენება ParentNode თვისება (XMLDOMNode ტიპი), შვილობილი ფილიალების წვდომა ხდება ChildNodes (XMLDOMNodeList ტიპი), FirstChild და LastChild (XMLDOMNode ტიპის) თვისებებით და ა.შ. OwnerDocument თვისება აბრუნებს XMLDOMDocument ტიპის ობიექტს, რომელიც განსაზღვრავს თავად XML დოკუმენტს. ზემოთ ჩამოთვლილი თვისებები საშუალებას გაძლევთ მარტივად გადახვიდეთ დოკუმენტის ხეზე.</p> <p>ახლა მოდით გადავხედოთ XML დოკუმენტის ყველა ფილიალს:</p><p>Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; თუ Node.HasChildNodes მაშინ GetChilds(Node,0); Დასასრული;</p><p>როგორც ზემოთ აღინიშნა, XMLDOMNode ობიექტის SelectNodes უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. გარდა ამისა, არსებობს SelectSingleNode მეთოდი, რომელიც აბრუნებს დოკუმენტის მხოლოდ პირველ ფილიალს. ორივე ეს მეთოდი საშუალებას გაძლევთ მიუთითოთ XSL შაბლონები ფილიალების მოსაძებნად.</p> <p>მოდით გავიაროთ SelectNodes მეთოდის გამოყენების პროცესი, რათა მოვიძიოთ ყველა ფილიალი, რომელსაც აქვს CD ფილიალი და PRICE ქვეგანყოფილება:</p><p>Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');</p><p>CD-ის ფილიალის PRICE-ის ყველა ქვეგანყოფილება განთავსდება Nodes-ის კოლექციაში. XSL შაბლონების განხილვას ცოტა მოგვიანებით დავუბრუნდებით.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>ბავშვთა ფილიალების მანიპულირება</h3> <p>ბავშვის ფილიალების მანიპულირებისთვის, ჩვენ შეგვიძლია გამოვიყენოთ XMLDOMNode ობიექტის მეთოდები (ცხრილი 2).</p> <p>იმისათვის, რომ მთლიანად წაშალოთ პირველი დისკის ჩანაწერი, თქვენ უნდა გაუშვათ შემდეგი კოდი:</p><p>Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= მცდარი; XMLDoc.Load('C:\DATA\DATA.xml'); // მიიღეთ ძირეული ელემენტი Root:= XMLDoc.DocumentElement; კვანძი:= ფესვი; // პირველი შვილის ტოტის ამოღება Node.RemoveChild(Node.FirstChild);</p><p>გაითვალისწინეთ, რომ ამ მაგალითში ჩვენ ვშლით პირველი შვილის ფილიალს. როგორ ამოიღოთ პირველი ბავშვის ფილიალის პირველი ელემენტი, ნაჩვენებია ქვემოთ:</p><p>Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= მცდარი; XMLDoc.Load('C:\DATA\DATA.xml'); // მიიღეთ ძირეული ელემენტი Root:= XMLDoc.DocumentElement; // და პირველი შვილის ფილიალი Node:= Root.FirstChild; // პირველი შვილის ტოტის ამოღება Node.RemoveChild(Node.FirstChild);</p><p>ზემოთ მოყვანილ მაგალითში ჩვენ წავშალეთ არა პირველი ფილიალი <CD>…</CD>, და ფილიალის პირველი ელემენტია <TITLE>….

ახლა დავამატოთ ახალი ფილიალი. ქვემოთ მოცემულია კოდი, რომელიც გვიჩვენებს, თუ როგორ უნდა დაამატოთ ახალი მუსიკალური CD-ROM ჩანაწერი:

Var NewNode: IXMLDOMNode; ბავშვი: IXMLDOMNode; ... // შექმენით ახალი ფილიალი - NewNode:= XMLDoc.CreateNode(1, 'CD', ''); // ელემენტის დამატება Child:= XMLDoc.CreateNode(1,'TITLE',''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= 'Pink Floyd'; // ელემენტის დამატება <ARTIST>Child:= XMLDoc.CreateNode(1, 'ARTIST', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= 'Division Bell'; // ელემენტის დამატება <COUNTRY>Child:= XMLDoc.CreateNode(1, 'COUNTRY', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= 'UK'; // ელემენტის დამატება <COMPANY>Child:= XMLDoc.CreateNode(1, 'COMPANY', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= ‘EMI Records Ltd.’; // ელემენტის დამატება <PRICE>Child:= XMLDoc.CreateNode(1, 'PRICE', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= '11.99"; // დაამატეთ ელემენტი <YEAR>Child:= XMLDoc.CreateNode(1, 'YEAR', ''); // ელემენტის დამატება NewNode.AppendChild(Child); // და დააყენეთ მისი მნიშვნელობა Child.Text:= '1994'; // და დაამატეთ ფილიალი Root.AppendChild(NewNode); ...</p><p>ზემოთ მოცემული კოდი გვიჩვენებს შემდეგი ნაბიჯების თანმიმდევრობას ახალი ფილიალის დასამატებლად:</p> <ul><li>ახალი ფილიალის შექმნა CreateNode მეთოდის გამოყენებით: <ul><li>ელემენტის შექმნა CreateNode მეთოდის გამოყენებით;</li> <li>ფილიალში ელემენტის დამატება AppendChild მეთოდის გამოყენებით;</li> <li>ელემენტის მნიშვნელობის დაყენება Text თვისების მეშვეობით;</li> <li>...გაიმეორეთ ყველა ელემენტისთვის.</li> </ul></li> <li>დოკუმენტში ახალი ფილიალის დამატება AppendChild მეთოდის გამოყენებით.</li> </ul><p>შეგახსენებთ, რომ AppendChild მეთოდი ამატებს ტოტს ხის ბოლოს. იმისათვის, რომ დაამატოთ ტოტი ხის კონკრეტულ ადგილას, უნდა გამოიყენოთ მეთოდი InsertBefore.</p> <h2>ფილიალის ნაკრები - XMLDOMNodeList ობიექტი</h2> <p>XMLNodeList ობიექტი შეიცავს ფილიალების სიას, რომლებიც შეიძლება აშენდეს SelectNodes ან GetElementsByTagName მეთოდების გამოყენებით, ან მიღებულ იქნას ChildNodes თვისებიდან.</p> <p>ჩვენ უკვე განვიხილეთ ამ ობიექტის გამოყენება მაგალითში, რომელიც მოცემულია სექციაში "დოკუმენტის ხეზე ნავიგაცია". წარმოგიდგენთ რამდენიმე თეორიულ შენიშვნას.</p> <p>სიაში ფილიალების რაოდენობა შეიძლება მივიღოთ Length ქონების ღირებულების სახით. ფილიალებს აქვთ ინდექსები 0-დან Length-1-მდე და თითოეული ცალკეული ფილიალი ხელმისაწვდომია Item array ელემენტის მეშვეობით შესაბამისი ინდექსით.</p> <p>ფილიალების სიაში ნავიგაცია ასევე შეიძლება განხორციელდეს NextNode მეთოდის გამოყენებით, რომელიც აბრუნებს სიაში მომდევნო ფილიალს, ან Nil-ს, თუ მიმდინარე ფილიალი ბოლოა. სიის დასაწყისში დასაბრუნებლად გამოიძახეთ გადატვირთვის მეთოდი.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დოკუმენტების შექმნა და შენახვა</h2> <p>აქამდე ჩვენ განვიხილეთ, თუ როგორ შეგიძლიათ დაამატოთ ფილიალები და ელემენტები არსებულ XML დოკუმენტებში. ახლა მოდით შევქმნათ XML დოკუმენტი პირდაპირ ეთერში. პირველ რიგში, შეგახსენებთ, რომ დოკუმენტის ჩატვირთვა შესაძლებელია არა მხოლოდ URL-დან, არამედ ჩვეულებრივი სტრიქონიდან. ქვემოთ მოცემულია, თუ როგორ უნდა შექმნათ root ელემენტი, რომელიც შემდეგ შეიძლება გამოყენებულ იქნას სხვა ელემენტების დინამიურად ასაგებად (რაზეც ჩვენ უკვე განვიხილეთ ბავშვთა ფილიალების მანიპულირება განყოფილებაში):</p><p>Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; S: WideString; ... ს: = ' <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>XML დოკუმენტის აგების შემდეგ, ჩვენ შევინახავთ მას ფაილში Save მეთოდის გამოყენებით. Მაგალითად:</p> <p>XMLDoc.Save('C:\DATA\NEWCD.XML');</p> <p>გარდა ფაილში შენახვისა, Save მეთოდი საშუალებას გაძლევთ შეინახოთ XML დოკუმენტი ახალ XMLDOMDocument ობიექტში. ამ შემთხვევაში დოკუმენტი მთლიანად დამუშავებულია და შედეგად, მოწმდება მისი სტრუქტურა და სინტაქსი. ქვემოთ მოცემულია, თუ როგორ შეინახოთ დოკუმენტი სხვა ობიექტში:</p><p>პროცედურა TForm1.Button2Click(Sender: TObject); var XMLDoc2: IXMLDOMDდოკუმენტი; დაწყება XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nil; დასასრული;</p><p>და ბოლოს, გაითვალისწინეთ, რომ Save მეთოდი ასევე გაძლევთ საშუალებას შეინახოთ XML დოკუმენტი სხვა COM ობიექტებში, რომლებიც მხარს უჭერენ IStream, IPersistStream ან IPersistStreamInit ინტერფეისებს.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL შაბლონების გამოყენება</h2> <p>XMLDOMNode ობიექტის SelectNodes მეთოდის განხილვისას აღვნიშნეთ, რომ ის უზრუნველყოფს დოკუმენტის ფილიალების წვდომის უფრო მოქნილ გზას. მოქნილობა მდგომარეობს იმაში, რომ ფილიალების შერჩევის კრიტერიუმად შეგიძლიათ მიუთითოთ XSL შაბლონი. ასეთი შაბლონები XML დოკუმენტებში ინფორმაციის ძიების მძლავრ მექანიზმს იძლევა. მაგალითად, ჩვენს კატალოგში არსებული ყველა მუსიკალური CD-ROM-ის სათაურის სიის მისაღებად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:</p><p>იმის გასარკვევად, თუ რომელი შემსრულებლის დისკები გამოუშვეს აშშ-ში, მოთხოვნა ყალიბდება შემდეგნაირად:</p><p>Nodes:= Root.SelectNodes('CD/ARTIST');</p><p>ქვემოთ მოცემულია, თუ როგორ უნდა იპოვოთ პირველი დისკი დირექტორიაში:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>და ბოლო:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>ბობ დილანის დისკების საპოვნელად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:</p><p>Nodes:= Root.SelectNodes('CD[$any$ ARTIST= "ბობ დილანი"]/TITLE');</p><p>და 1985 წლის შემდეგ გამოშვებული დისკების სიის მისაღებად, ჩვენ ვატარებთ შემდეგ შეკითხვას:</p><p>Nodes:= Root.SelectNodes('CD/TITLE');</p><p>XSL სინტაქსის უფრო დეტალური განხილვა მოითხოვს ცალკე პოსტს. მკითხველების დასაინტრიგებლად და შემდგომი კვლევის წახალისებისთვის, მე მოვიყვან მხოლოდ ერთ მცირე მაგალითს XSL-ის შესაძლო გამოყენების შესახებ. ვთქვათ, ჩვენ უნდა გადავიყვანოთ ჩვენი კატალოგი ჩვეულებრივ HTML ცხრილად. ტრადიციული მეთოდების გამოყენებით, ჩვენ უნდა გავიაროთ ხის ყველა ტოტი და შევქმნათ შესაბამისი ტეგები თითოეული მიღებული ელემენტისთვის <TD>…</TD>.</p> <p>XSL-ის გამოყენებით, ჩვენ უბრალოდ ვქმნით შაბლონს (ან სტილის ფურცელს), რომელშიც მივუთითებთ რა და როგორ უნდა გადაკეთდეს. შემდეგ ამ შაბლონს გადავაფარებთ ჩვენს დირექტორიაში - და დავასრულეთ: გვაქვს XSL შაბლონის ტექსტი, რომელიც კატალოგს ცხრილად გარდაქმნის (განცხადება 2).</p> <p>ჩვენს დირექტორიაში XSL შაბლონის გადაფარვის კოდი ასე გამოიყურება:</p><p>პროცედურა TForm1.Button2Click(Sender: TObject); var XSLDoc: IXMLDOMDდოკუმენტი; დაწყება XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Nil; დასასრული;</p><p>XSL-ის შესახებ ჩვენი განხილვის დასასრულს, უნდა ითქვას, რომ ამჟამად ეს ენა აქტიურად გამოიყენება სხვადასხვა XML დოკუმენტებს შორის ტრანსფორმაციისთვის, ასევე დოკუმენტის ფორმატირებისთვის.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>დასკვნა</h2> <p>გასაგები მიზეზების გამო, შეუძლებელია Microsoft XML DOM-ის ყველა ობიექტის მიმოხილვა და მათი გამოყენების მაგალითების ერთ სტატიაში მოყვანა. აქ მხოლოდ აპლიკაციებში XML DOM-ის გამოყენების ძირითად საკითხებს შევეხეთ. მაგიდაზე სურათი 3 გვიჩვენებს Microsoft XML DOM-ში განხორციელებულ ყველა ობიექტს.</p> <p>ComputerPress 12"2000წ</p> <p>Გამარჯობა ყველას! რამდენიმე წელი ვწერდი Matlab-ზე და მერე გამიჩნდა სურვილი დამეწერა პროგრამა Delphi-ში.</p><p>მე უნდა ვისწავლო xml დოკუმენტებთან მუშაობა. ვმუშაობ RAD Stiduo XE3-ში. არსებობს TXMLDocument კომპონენტი, რომელიც ალბათ ცნობილია დელფის ბევრი პროგრამისტისთვის. როგორც ჩანს, მას ბევრი რამის გაკეთება შეუძლია. მაგრამ პრობლემა ის არის, რომ არ არსებობს მკაფიო დოკუმენტაცია და აღწერა. დახმარება RAD Studio-ში ნაგავია, რადგან იქ ნორმალური ინფორმაცია არ არის; მხოლოდ მწირი ინფორმაცია ზოგიერთი მეთოდისა და პროცედურების შესახებ, რომლებიც მიმოფანტულია გვერდებზე (მაგალითების ან სათანადო აღწერილობის გარეშე). მთელი ინტერნეტი მოვიძიე. ფორუმებზე ვიპოვე მხოლოდ თემები კონკრეტული პრობლემების გადაწყვეტით, სადაც კიდევ ერთი საათის განმავლობაში უნდა გამოიცნოთ რას აკეთებს ესა თუ ის ხაზი xml ფაილზე წვდომისას. <br>მე მჭირდება ხელმძღვანელობა xml-თან მუშაობისას გამოყენებული ძირითადი ფუნქციების, პროცედურების და მეთოდების შესახებ. სახელმძღვანელო, სახელმძღვანელო, აღწერა. ან თუნდაც "xml დელფში დუმებისთვის". Მაგალითად:</p><p><i>xml ფაილის გასახსნელად გამოიყენეთ XMLDocument1.LoadFromFile("filemane.xml") მეთოდი, სადაც ფაილის სახელი არის ფაილის სახელი. <br>IXMLNode ტიპის nodelist ცვლადი გამოიყენება სიის შესანახად <a href="https://obanracer.ru/ka/dochernie-i-roditelskie-elementy-v-html-tehniki-raboty-s-dom-roditelskie.html">ბავშვის ელემენტები</a>. ამ სიის დასადგენად გამოიყენეთ Xmldocument1.DocumentElement მეთოდი (სადაც XMLDocument1 არის xml ფაილი, რომელიც განიხილება). <br>ბავშვის ელემენტის "element1" შინაარსის გამოსაკითხად გამოიყენება XMLDocument1.DocumentElement.ChildNodes["element1"].Text... მეთოდი. <br></i><br>და ამ სულისკვეთებით შემდგომში გამოყენებული ყველა მეთოდის, პროცედურისა და მონაცემთა ტიპების შესახებ. <br>სად ვიპოვო მსგავსი სახელმძღვანელოები/აღწერები? ვის შეუძლია დახმარება?</p><p>თუ თქვენ გჭირდებათ კონკრეტული დავალება, მე აღვწერ მას. <br>არსებობს xml დოკუმენტი, როგორიცაა:</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">რაღაც ტექსტი</data><br><data name="onerror" mode="noVoice">რაღაც შეცდომის ტექსტი</data><br><data name="onerror" mode="alarm">სხვა შეცდომის ტექსტი</data></p><p>პროგრამის კოდში გვაქვს:</p><p>ვარ <br>...<br>მშობელი, შვილი1: IXMLNode;</p><p>დაიწყება <br>XMLDocument1.LoadFromFile("f:\filename.x ml"); <br>XMLDocument1.Active:=true; <br>.<br>.<br>დასასრული</p><p>რა უნდა ისწავლოთ ამის გაკეთება: <br>(წინასწარ ბოდიშს ვიხდი, თუ არასწორად დავასახელებ xml დოკუმენტის კომპონენტებს) <br>1. მიიღეთ ძირეული ელემენტის სახელი (ჩვენს შემთხვევაში ltm), ასევე მისი ატრიბუტების სია (ვერსია, ტიპი) და მათი მნიშვნელობები ("1.0", "პარამეტრები"). <br>2. მიიღეთ ელემენტების რაოდენობა, რომლებიც ფესვის შვილებია. ამ შემთხვევაში, არსებობს 7 მათგანი: templateFiles, ზომები, ცხელი წერტილი, ცხელი წერტილი, მონაცემები, მონაცემები, მონაცემები. მიიღეთ ელემენტების სახელები (ტეგები) (templateFiles, ზომები და ა.შ.). მას შემდეგ რაც მივიღე ელემენტების რაოდენობა და ვისწავლე მათი სახელების ამოღება, მე გავუშვებ ციკლს 0-დან თვლა-1-მდე და გავაკეთებ იმას, რაც მჭირდება. <br>3. მიიღეთ საჭირო ელემენტის ატრიბუტების რაოდენობა და სია. მაგალითად, ცხელი წერტილის ელემენტისთვის. სწორი პასუხი იქნება 4 ატრიბუტი. პირველი ცხელი წერტილის ელემენტისთვის ეს იქნება სახელი, სტილი, სცენა, ათ. მეორესთვის - იგივე, მხოლოდ ath ატრიბუტის ნაცვლად - rz ატრიბუტი. <br>გთხოვთ გაითვალისწინოთ, რომ ფაილში არის 2 ცხელი წერტილის ელემენტი, განსხვავებული ატრიბუტებით. აი, როგორ ვიმუშაოთ მათთან (თუ არსებობს 1-ზე მეტი ამავე სახელწოდების ელემენტი)? <br>მე მინდა ეს: ვიღებ საბავშვო ელემენტების სიას rel. ძირეულში (იხ. პუნქტი 2), მათში ვატარებ for loop-ს და ვპოულობ ცხელ წერტილების ელემენტებს, რომელთა სახელის პარამეტრი უდრის საჭიროს (თქვით „hs015_2“ - აუცილებლად იქნება ერთი ასეთი ელემენტი). არსებობს რაიმე გზა ამ პრობლემის გადასაჭრელად მარყუჟის გარეშე? ანუ, მიიღეთ სცენის ატრიბუტის მნიშვნელობა hotspot ელემენტისთვის, რომლის სახელი = "hs015_2"? <br>4. გააკეთეთ ზემოაღნიშნული კვანძებისა და ელემენტების მიმართ, რომლებიც ბავშვების შვილები არიან. ჩემს მაგალითში, კვანძი (და-ს შვილი და მშობელი. <br>თუ სწორად გავიგე, თქვენ უნდა როგორმე გადაიტანოთ კვანძის შინაარსი <a href="https://obanracer.ru/ka/tipy-peremennyh-visual-basic-yazyk-programmirovaniya-visual-basic-tipy-dannyh.html">ტიპის ცვლადი</a> IXMLNode და გააკეთეთ იგივე, რაც ნაბიჯები 1-3. Ისე?</p><p>5. თქვენ უნდა ისწავლოთ ზემოაღნიშნული პარამეტრების შეცვლა (დააყენეთ საკუთარი).</p><p>როგორც ჩანს, ჯერჯერობით ეს ყველაფერია. ამ ეტაპზე სინტაქსური სტრუქტურები ჩემთვის ყველაზე მნიშვნელოვანია. <br>ვინც იცის ეს თემა, გთხოვთ დაწეროთ სხვა სინტაქსური კონსტრუქციები ზემოთ აღწერილი კითხვების გადასაჭრელად (როგორ მივიღოთ ატრიბუტები, მათი რაოდენობა, ელემენტების რაოდენობა, მათი სახელები და ა.შ.). ახლა მთავარია სინტაქსის დაუფლება და ჩემს ალგორითმს მოგვიანებით განვახორციელებ. ყველას დიდი მადლობა წინასწარ!</p><p>P.S. მე ნამდვილად არ მინდა დავწერო ჩემი საკუთარი XML პარსერი ნულიდან მხოლოდ იმიტომ, რომ არსებულებს არ აქვთ ნორმალური აღწერა.</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>წინა სტატია</span><a href="https://obanracer.ru/ka/sputnikovaya-semka-onlain-karty-gugl-onlain.html">სატელიტური სურათები ონლაინ</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>შემდეგი სტატია</span><a href="https://obanracer.ru/ka/ne-udalyaetsya-papka-pishet-chto-ispolzuetsya-posredstvom-failovyh-menedzherov.html">ფაილ მენეჯერების მეშვეობით</a></div> <!-- /next_post --> </div> </div> <div class="td-author-name vcard author" style="display: none"><span class="fn"><a href="https://obanracer.ru/ka/author/iulia">ჯულია</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="#">ᲓᲐᲙᲐᲕᲨᲘᲠᲔᲑᲣᲚᲘ ᲡᲢᲐᲢᲘᲔᲑᲘ</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/ka/udalit-papku-s-diska-d-primenenie-storonnei-programmy.html" rel="bookmark" title="მესამე მხარის პროგრამის გამოყენება"><img width="218" height="150" class="entry-thumb" src="/uploads/02f3e09eacaf80dacd4a5cfbe8311ae1.jpg" alt="მესამე მხარის პროგრამის გამოყენება" title="მესამე მხარის პროგრამის გამოყენება"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/monitors/" class="td-post-category">მონიტორები</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/udalit-papku-s-diska-d-primenenie-storonnei-programmy.html" rel="bookmark" title="მესამე მხარის პროგრამის გამოყენება">მესამე მხარის პროგრამის გამოყენება</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/ka/kak-udalyat-faily-iz-papki-windows-pochemu-ne-udalyaetsya-fail.html" rel="bookmark" title="როგორ წაშალოთ ფაილები Windows საქაღალდედან"><img width="218" height="150" class="entry-thumb" src="/uploads/fe212835c889458ae3401464cf75f580.jpg" alt="როგორ წაშალოთ ფაილები Windows საქაღალდედან" title="როგორ წაშალოთ ფაილები Windows საქაღალდედან"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/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/ka/kak-udalyat-faily-iz-papki-windows-pochemu-ne-udalyaetsya-fail.html" rel="bookmark" title="როგორ წაშალოთ ფაილები Windows საქაღალდედან">როგორ წაშალოთ ფაილები Windows საქაღალდედან</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/ka/kak-nastroit-sputnikovuyu-tarelku-po-kompasu-ustanovka-sputnikovoi-antenny.html" rel="bookmark" title="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა"><img width="218" height="150" class="entry-thumb" src="/uploads/46f920341c04043de77a5fcf9aae49e6.jpg" alt="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა" title="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/case/" class="td-post-category">საცხოვრებლები</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/kak-nastroit-sputnikovuyu-tarelku-po-kompasu-ustanovka-sputnikovoi-antenny.html" rel="bookmark" title="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა">სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა</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/ka/shchedry-board-powered-by-smf-avtomaticheskoe-opredelenie-dvizhka.html" rel="bookmark" title="ფორუმის ძრავის ავტომატური გამოვლენა"><img width="218" height="150" class="entry-thumb" src="/uploads/19604e9cb439b262dd878f7a3201644e.jpg" alt="ფორუმის ძრავის ავტომატური გამოვლენა" title="ფორუმის ძრავის ავტომატური გამოვლენა"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/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/ka/shchedry-board-powered-by-smf-avtomaticheskoe-opredelenie-dvizhka.html" rel="bookmark" title="ფორუმის ძრავის ავტომატური გამოვლენა">ფორუმის ძრავის ავტომატური გამოვლენა</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/ka/rezko-vyrubilsya-noutbuk-pochemu-vyklyuchaetsya-noutbuk-sam-po-sebe.html" rel="bookmark" title="რატომ ითიშება ჩემი ლეპტოპი თავისით?"><img width="218" height="150" class="entry-thumb" src="/uploads/db42102323bdb398946d6f1a04780e50.jpg" alt="რატომ ითიშება ჩემი ლეპტოპი თავისით?" title="რატომ ითიშება ჩემი ლეპტოპი თავისით?"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/multimedia/" class="td-post-category">მულტიმედია</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/rezko-vyrubilsya-noutbuk-pochemu-vyklyuchaetsya-noutbuk-sam-po-sebe.html" rel="bookmark" title="რატომ ითიშება ჩემი ლეპტოპი თავისით?">რატომ ითიშება ჩემი ლეპტოპი თავისით?</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/ka/pochemu-vnezapno-otklyuchaetsya-noutbuk-pochemu-postoyanno-vyklyuchaetsya.html" rel="bookmark" title="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები"><img width="218" height="150" class="entry-thumb" src="/uploads/c5bcd0880198f80da6c4cfe965970373.jpg" alt="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები" title="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/power-supply/" class="td-post-category">დენის წყაროები</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/pochemu-vnezapno-otklyuchaetsya-noutbuk-pochemu-postoyanno-vyklyuchaetsya.html" rel="bookmark" title="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები">რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები</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/ka/samostoyatelnaya-kalibrovka-akkumulyatora-noutbuka-kalibrovka-akkumulyatora-hp-kak.html" rel="bookmark" title="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა"><img width="218" height="150" class="entry-thumb" src="/uploads/8b0623f9db70dc6db0d9560a4db03939.jpg" alt="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა" title="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/the-winchesters/" class="td-post-category">ვინჩესტერები</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/samostoyatelnaya-kalibrovka-akkumulyatora-noutbuka-kalibrovka-akkumulyatora-hp-kak.html" rel="bookmark" title="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა">HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა</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/ka/kak-zaiti-v-bezopasnyi-rezhim-kak-zapustit-noutbuk-v.html" rel="bookmark" title="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე"><img width="218" height="150" class="entry-thumb" src="/uploads/b99182eff4954b93129d6bdc96b0c45e.jpg" alt="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე" title="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/security/" class="td-post-category">Უსაფრთხოება</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/kak-zaiti-v-bezopasnyi-rezhim-kak-zapustit-noutbuk-v.html" rel="bookmark" title="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე">როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე</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/ka/testirovanie-proizvoditelnosti-grand-theft-auto-v-grafika-rukovodstvo-po-nastroikam-testirov.html" rel="bookmark" title="შესრულების ტესტირება"><img width="218" height="150" class="entry-thumb" src="/uploads/378712886dd8b5162244b81421685662.jpg" alt="შესრულების ტესტირება" title="შესრულების ტესტირება"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/internet/" class="td-post-category">ინტერნეტი</a> </div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/testirovanie-proizvoditelnosti-grand-theft-auto-v-grafika-rukovodstvo-po-nastroikam-testirov.html" rel="bookmark" title="შესრულების ტესტირება">შესრულების ტესტირება</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">Ჩვენ გირჩევთ</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/ka/nakrutit-100-golosov-effektivnaya-nakrutka-golosov-vkontakte-rabotaet-bez.html" rel="bookmark" title="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე"><img width="324" height="235" class="entry-thumb" src="/uploads/32de753456a77f5300ac4a323b26c32b.jpg" alt="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე" title="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე"/ loading=lazy loading=lazy></a></div> <a href="https://obanracer.ru/ka/category/windows-7/" class="td-post-category">Windows 7</a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/nakrutit-100-golosov-effektivnaya-nakrutka-golosov-vkontakte-rabotaet-bez.html" rel="bookmark" title="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე">VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე</a></h3> <div class="td-module-meta-info"> </div> <div class="td-excerpt">თუ თქვენ ეძებთ გზას მიიღოთ VKontakte ბონუსები, რათა ითამაშოთ აპლიკაციები პრივილეგიებით, მაშინ უნდა გამოიყენოთ სპეციალური სერვისების სერვისები....</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/ka/nakrutka-golosov-vkontakte-100-rabotaet-vam-nuzhna-nakrutka.html" rel="bookmark" title="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?"><img width="100" height="70" class="entry-thumb" src="/uploads/d8edadc9aef5cda1d975354068cda5ce.jpg" alt="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?" title="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/nakrutka-golosov-vkontakte-100-rabotaet-vam-nuzhna-nakrutka.html" rel="bookmark" title="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?">გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ka/category/case/" class="td-post-category">საცხოვრებლები</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/ka/kak-pravilno-vybrat-domashnii-stacionarnyi-kompyuter-kak-pravilno.html" rel="bookmark" title="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის"><img width="100" height="70" class="entry-thumb" src="/uploads/1d5694ea005bf5c578361c4d92febd86.jpg" alt="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის" title="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/kak-pravilno-vybrat-domashnii-stacionarnyi-kompyuter-kak-pravilno.html" rel="bookmark" title="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის">როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ka/category/processors/" class="td-post-category">პროცესორები</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/ka/nakrutka-zapisi-vkontakte-nakrutit-laiki-vkontakte-nakrutit.html" rel="bookmark" title="მიიღეთ მოწონებები VKontakte-ზე"><img width="100" height="70" class="entry-thumb" src="/uploads/393008ee68891928a75eb6ba48ddcb09.jpg" alt="მიიღეთ მოწონებები VKontakte-ზე" title="მიიღეთ მოწონებები VKontakte-ზე"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/nakrutka-zapisi-vkontakte-nakrutit-laiki-vkontakte-nakrutit.html" rel="bookmark" title="მიიღეთ მოწონებები VKontakte-ზე">მიიღეთ მოწონებები VKontakte-ზე</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ka/category/internet/" class="td-post-category">ინტერნეტი</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/ka/ne-rabotaet-telegramm-na-telefone-kak-oboiti-blokirovku-telegram-poshagovaya.html" rel="bookmark" title="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის"><img width="100" height="70" class="entry-thumb" src="/uploads/fe9f8f12fd190a383c3cf38c404d3fb7.jpg" alt="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის" title="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/ne-rabotaet-telegramm-na-telefone-kak-oboiti-blokirovku-telegram-poshagovaya.html" rel="bookmark" title="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის">როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ka/category/motherboard/" class="td-post-category">დედაპლატები</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/ka/laik-na-pervuyu-zapis-vzaimno-kak-nakrutit-realnye-laiki-vk-besplatno.html" rel="bookmark" title="როგორ მივიღოთ რეალური VK მოწონებები უფასოდ (მოწონებები რეალური ადამიანებისგან)"><img width="100" height="70" class="entry-thumb" src="/uploads/6ebcbf9077417641e0d939f0b9c15c8e.jpg" alt="როგორ მივიღოთ რეალური VK მოწონებები უფასოდ (მოწონებები რეალური ადამიანებისგან)" title="როგორ მივიღოთ რეალური VK მოწონებები უფასოდ (მოწონებები რეალური ადამიანებისგან)"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/laik-na-pervuyu-zapis-vzaimno-kak-nakrutit-realnye-laiki-vk-besplatno.html" rel="bookmark" title="როგორ მივიღოთ რეალური VK მოწონებები უფასოდ (მოწონებები რეალური ადამიანებისგან)">როგორ მივიღოთ რეალური VK მოწონებები უფასოდ (მოწონებები რეალური ადამიანებისგან)</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ka/category/graphics-card/" class="td-post-category">ვიდეო ბარათები</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/ka/laiki-vkontakte-nakrutka-bez-zadanii-kak-nakrutit-laiki-na-avu-vkontakte.html" rel="bookmark" title="როგორ მივიღოთ მოწონებები VKontakte ava-ზე უფასოდ, ნებისმიერი გვერდისთვის"><img width="100" height="70" class="entry-thumb" src="/uploads/6eb7d2155b98f10bf24c2c85d32b72d1.jpg" alt="როგორ მივიღოთ მოწონებები VKontakte ava-ზე უფასოდ, ნებისმიერი გვერდისთვის" title="როგორ მივიღოთ მოწონებები VKontakte ava-ზე უფასოდ, ნებისმიერი გვერდისთვის"/ loading=lazy loading=lazy></a></div> <div class="item-details"> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/laiki-vkontakte-nakrutka-bez-zadanii-kak-nakrutit-laiki-na-avu-vkontakte.html" rel="bookmark" title="როგორ მივიღოთ მოწონებები VKontakte ava-ზე უფასოდ, ნებისმიერი გვერდისთვის">როგორ მივიღოთ მოწონებები VKontakte ava-ზე უფასოდ, ნებისმიერი გვერდისთვის</a></h3> <div class="td-module-meta-info"> <a href="https://obanracer.ru/ka/category/graphics-card/" class="td-post-category">ვიდეო ბარათები</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/ka/vodyanoi-znak-na-foto-v-blogah-za-i-protiv-kak-sdelat-kak-vstavit.html" rel="bookmark" title="ჭვირნიშანი ფოტოებზე ბლოგებში - დადებითი და უარყოფითი მხარეები?"><img width="218" height="150" class="entry-thumb" src="/uploads/36955e935aa7c7886641f59c20a38f76.jpg" alt="ჭვირნიშანი ფოტოებზე ბლოგებში - დადებითი და უარყოფითი მხარეები?" title="ჭვირნიშანი ფოტოებზე ბლოგებში - დადებითი და უარყოფითი მხარეები?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/vodyanoi-znak-na-foto-v-blogah-za-i-protiv-kak-sdelat-kak-vstavit.html" rel="bookmark" title="ჭვირნიშანი ფოტოებზე ბლოგებში - დადებითი და უარყოფითი მხარეები?">ჭვირნიშანი ფოტოებზე ბლოგებში - დადებითი და უარყოფითი მხარეები?</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/ka/preobrazovanie-video-programma-xilisoft-video-converter-any-video-converter.html" rel="bookmark" title="Xilisoft ვიდეო გადამყვანის პროგრამა"><img width="218" height="150" class="entry-thumb" src="/uploads/3f7c0e2309636ebc0680f085a355e515.jpg" alt="Xilisoft ვიდეო გადამყვანის პროგრამა" title="Xilisoft ვიდეო გადამყვანის პროგრამა"/ 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/ka/preobrazovanie-video-programma-xilisoft-video-converter-any-video-converter.html" rel="bookmark" title="Xilisoft ვიდეო გადამყვანის პროგრამა">Xilisoft ვიდეო გადამყვანის პროგრამა</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/ka/sputnikovaya-semka-onlain-karty-gugl-onlain.html" rel="bookmark" title="სატელიტური სურათები ონლაინ"><img width="218" height="150" class="entry-thumb" src="/uploads/8925d793c3f3d6911542237715286d27.jpg" alt="სატელიტური სურათები ონლაინ" title="სატელიტური სურათები ონლაინ"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/sputnikovaya-semka-onlain-karty-gugl-onlain.html" rel="bookmark" title="სატელიტური სურათები ონლაინ">სატელიტური სურათები ონლაინ</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/ka/ne-udalyaetsya-papka-pishet-chto-ispolzuetsya-posredstvom-failovyh-menedzherov.html" rel="bookmark" title="ფაილ მენეჯერების მეშვეობით"><img width="218" height="150" class="entry-thumb" src="/uploads/d3d56f68ba598d2c6fe8a7535e4b0a70.jpg" alt="ფაილ მენეჯერების მეშვეობით" title="ფაილ მენეჯერების მეშვეობით"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/ne-udalyaetsya-papka-pishet-chto-ispolzuetsya-posredstvom-failovyh-menedzherov.html" rel="bookmark" title="ფაილ მენეჯერების მეშვეობით">ფაილ მენეჯერების მეშვეობით</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/ka/udalit-papku-s-diska-d-primenenie-storonnei-programmy.html" rel="bookmark" title="მესამე მხარის პროგრამის გამოყენება"><img width="218" height="150" class="entry-thumb" src="/uploads/02f3e09eacaf80dacd4a5cfbe8311ae1.jpg" alt="მესამე მხარის პროგრამის გამოყენება" title="მესამე მხარის პროგრამის გამოყენება"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/udalit-papku-s-diska-d-primenenie-storonnei-programmy.html" rel="bookmark" title="მესამე მხარის პროგრამის გამოყენება">მესამე მხარის პროგრამის გამოყენება</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/ka/kak-udalyat-faily-iz-papki-windows-pochemu-ne-udalyaetsya-fail.html" rel="bookmark" title="როგორ წაშალოთ ფაილები Windows საქაღალდედან"><img width="218" height="150" class="entry-thumb" src="/uploads/fe212835c889458ae3401464cf75f580.jpg" alt="როგორ წაშალოთ ფაილები Windows საქაღალდედან" title="როგორ წაშალოთ ფაილები Windows საქაღალდედან"/ 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/ka/kak-udalyat-faily-iz-papki-windows-pochemu-ne-udalyaetsya-fail.html" rel="bookmark" title="როგორ წაშალოთ ფაილები Windows საქაღალდედან">როგორ წაშალოთ ფაილები Windows საქაღალდედან</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/ka/kak-nastroit-sputnikovuyu-tarelku-po-kompasu-ustanovka-sputnikovoi-antenny.html" rel="bookmark" title="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა"><img width="218" height="150" class="entry-thumb" src="/uploads/46f920341c04043de77a5fcf9aae49e6.jpg" alt="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა" title="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/kak-nastroit-sputnikovuyu-tarelku-po-kompasu-ustanovka-sputnikovoi-antenny.html" rel="bookmark" title="სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა">სატელიტური ანტენის დაყენება საკუთარი ხელით: ინსტალაციის ადგილის არჩევა</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/ka/shchedry-board-powered-by-smf-avtomaticheskoe-opredelenie-dvizhka.html" rel="bookmark" title="ფორუმის ძრავის ავტომატური გამოვლენა"><img width="218" height="150" class="entry-thumb" src="/uploads/19604e9cb439b262dd878f7a3201644e.jpg" alt="ფორუმის ძრავის ავტომატური გამოვლენა" title="ფორუმის ძრავის ავტომატური გამოვლენა"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/shchedry-board-powered-by-smf-avtomaticheskoe-opredelenie-dvizhka.html" rel="bookmark" title="ფორუმის ძრავის ავტომატური გამოვლენა">ფორუმის ძრავის ავტომატური გამოვლენა</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/ka/rezko-vyrubilsya-noutbuk-pochemu-vyklyuchaetsya-noutbuk-sam-po-sebe.html" rel="bookmark" title="რატომ ითიშება ჩემი ლეპტოპი თავისით?"><img width="218" height="150" class="entry-thumb" src="/uploads/db42102323bdb398946d6f1a04780e50.jpg" alt="რატომ ითიშება ჩემი ლეპტოპი თავისით?" title="რატომ ითიშება ჩემი ლეპტოპი თავისით?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/rezko-vyrubilsya-noutbuk-pochemu-vyklyuchaetsya-noutbuk-sam-po-sebe.html" rel="bookmark" title="რატომ ითიშება ჩემი ლეპტოპი თავისით?">რატომ ითიშება ჩემი ლეპტოპი თავისით?</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/ka/pochemu-vnezapno-otklyuchaetsya-noutbuk-pochemu-postoyanno-vyklyuchaetsya.html" rel="bookmark" title="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები"><img width="218" height="150" class="entry-thumb" src="/uploads/c5bcd0880198f80da6c4cfe965970373.jpg" alt="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები" title="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/pochemu-vnezapno-otklyuchaetsya-noutbuk-pochemu-postoyanno-vyklyuchaetsya.html" rel="bookmark" title="რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები">რატომ ითიშება ლეპტოპი მუდმივად, მიზეზები და გადაწყვეტილებები</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/ka/samostoyatelnaya-kalibrovka-akkumulyatora-noutbuka-kalibrovka-akkumulyatora-hp-kak.html" rel="bookmark" title="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა"><img width="218" height="150" class="entry-thumb" src="/uploads/8b0623f9db70dc6db0d9560a4db03939.jpg" alt="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა" title="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა"/ 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/ka/samostoyatelnaya-kalibrovka-akkumulyatora-noutbuka-kalibrovka-akkumulyatora-hp-kak.html" rel="bookmark" title="HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა">HP ბატარეის კალიბრაცია როგორ დავაკალიბროთ dell ლეპტოპის ბატარეა</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/ka/kak-zaiti-v-bezopasnyi-rezhim-kak-zapustit-noutbuk-v.html" rel="bookmark" title="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე"><img width="218" height="150" class="entry-thumb" src="/uploads/b99182eff4954b93129d6bdc96b0c45e.jpg" alt="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე" title="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე"/ 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/ka/kak-zaiti-v-bezopasnyi-rezhim-kak-zapustit-noutbuk-v.html" rel="bookmark" title="როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე">როგორ დავიწყოთ ლეპტოპი უსაფრთხო რეჟიმში: რჩევები და ხრიკები როგორ ჩართოთ უსაფრთხო რეჟიმი acer aspire-ზე</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/ka/testirovanie-proizvoditelnosti-grand-theft-auto-v-grafika-rukovodstvo-po-nastroikam-testirov.html" rel="bookmark" title="შესრულების ტესტირება"><img width="218" height="150" class="entry-thumb" src="/uploads/378712886dd8b5162244b81421685662.jpg" alt="შესრულების ტესტირება" title="შესრულების ტესტირება"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/testirovanie-proizvoditelnosti-grand-theft-auto-v-grafika-rukovodstvo-po-nastroikam-testirov.html" rel="bookmark" title="შესრულების ტესტირება">შესრულების ტესტირება</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/ka/nakrutit-100-golosov-effektivnaya-nakrutka-golosov-vkontakte-rabotaet-bez.html" rel="bookmark" title="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე"><img width="218" height="150" class="entry-thumb" src="/uploads/5232e935978f39d2923c5146dca0d303.jpg" alt="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე" title="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/nakrutit-100-golosov-effektivnaya-nakrutka-golosov-vkontakte-rabotaet-bez.html" rel="bookmark" title="VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე">VKontakte-ზე ხმების ეფექტური მოტყუება მუშაობს პროგრამების გარეშე</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/ka/nakrutka-golosov-vkontakte-100-rabotaet-vam-nuzhna-nakrutka.html" rel="bookmark" title="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?"><img width="218" height="150" class="entry-thumb" src="/uploads/d10b80f6306fa06cf487bc4e1da44691.jpg" alt="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?" title="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/nakrutka-golosov-vkontakte-100-rabotaet-vam-nuzhna-nakrutka.html" rel="bookmark" title="გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?">გჭირდებათ VKontakte გამოკითხვების უფასოდ გაძლიერება?</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ka/kak-pravilno-vybrat-domashnii-stacionarnyi-kompyuter-kak-pravilno.html" rel="bookmark" title="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის"><img width="218" height="150" class="entry-thumb" src="/uploads/e287fd84d2be18d6a56ef02702504282.jpg" alt="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის" title="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/kak-pravilno-vybrat-domashnii-stacionarnyi-kompyuter-kak-pravilno.html" rel="bookmark" title="როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის">როგორ ავირჩიოთ სწორი სახლის დესკტოპ კომპიუტერი ვიდეო ბარათი თამაშებისთვის</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/ka/nakrutka-zapisi-vkontakte-nakrutit-laiki-vkontakte-nakrutit.html" rel="bookmark" title="მიიღეთ მოწონებები VKontakte-ზე"><img width="218" height="150" class="entry-thumb" src="/uploads/f67ce1ad065a8ae084d4ab2f0ce2d7f9.jpg" alt="მიიღეთ მოწონებები VKontakte-ზე" title="მიიღეთ მოწონებები VKontakte-ზე"/ loading=lazy loading=lazy></a></div> <a href="" class="td-post-category"></a> </div> <h3 class="entry-title td-module-title"><a href="https://obanracer.ru/ka/nakrutka-zapisi-vkontakte-nakrutit-laiki-vkontakte-nakrutit.html" rel="bookmark" title="მიიღეთ მოწონებები VKontakte-ზე">მიიღეთ მოწონებები VKontakte-ზე</a></h3> </div> </div> <div class="td-block-span12"> <div class="td_module_mx4 td_module_wrap td-animation-stack td-meta-info-hide"> <div class="td-module-image"> <div class="td-module-thumb"><a href="https://obanracer.ru/ka/ne-rabotaet-telegramm-na-telefone-kak-oboiti-blokirovku-telegram-poshagovaya.html" rel="bookmark" title="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის"><img width="218" height="150" class="entry-thumb" src="/uploads/af53ecffeb6d0aabafc05364517c1070.jpg" alt="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის" title="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის"/ 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/ka/ne-rabotaet-telegramm-na-telefone-kak-oboiti-blokirovku-telegram-poshagovaya.html" rel="bookmark" title="როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის">როგორ ავუაროთ Telegram-ის დაბლოკვას: ნაბიჯ-ნაბიჯ ინსტრუქციები კომპიუტერისა და სმარტფონისთვის</a></h3> </div> </div> </div></div></div> <div class="clearfix"></div><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside><aside class="td_block_template_1 widget widget_text"> <div class="textwidget"> </div> </aside> </div> </div> </div> </div> <div class="td-sub-footer-container td-container-wrap "> <div class="td-container"> <div class="td-pb-row"> <div class="td-pb-span td-sub-footer-menu"> </div> <div class="td-pb-span td-sub-footer-copy">Copyright 2023 - კომპიუტერების და ლეპტოპების შეკეთება. ვიდეო ბარათები, მყარი დისკები, ინტერნეტი, მონიტორები.</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>