დელფის ბევრი პროგრამისტი აკავშირებს პარამეტრების შენახვას გამოყენებასთან 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 ამ შემთხვევაში კონფიგურაცია), მაშინ ჩვენ უნდა მივიღოთ იგი ფუნქციის გამოყენებით დოკუმენტის ელემენტი. შემდეგ ტეგებს შორის შიგთავსი გამოდის
აქ გამოიყენება 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-ების დირექტორია, რომელსაც აქვს შემდეგი სტრუქტურა:
ახლა ჩვენ მზად ვართ დავიწყოთ 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;
იმის სანახავად, თუ რა ინფორმაცია დაბრუნდება შეცდომის შემთხვევაში, შევცვალოთ დირექტორიაში ჩანაწერი:
დახურვის ელემენტის ამოღება
ახლა მოდით დავწეროთ კოდი, რომელიც აბრუნებს XMLDOMParseError ობიექტის თვისებების მნიშვნელობებს:
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); Დასასრული;
და მოდით გავუშვათ ჩვენი აპლიკაცია. შედეგად, ჩვენ ვიღებთ შემდეგ ინფორმაციას შეცდომის შესახებ.
როგორც ზემოთ მოყვანილი მაგალითიდან ხედავთ, XMLDOMParseError ობიექტის მიერ დაბრუნებული ინფორმაცია სავსებით საკმარისია შეცდომის ლოკალიზაციისთვის და მისი წარმოშობის მიზეზის გასაგებად.
ახლა აღვადგინოთ დახურვის ელემენტი
დოკუმენტის ხეზე წვდომა
დოკუმენტის ხეზე წვდომისთვის შეგიძლიათ მიიღოთ root ელემენტი და შემდეგ გაიმეოროთ მისი შვილობილი ტოტებით, ან იპოვოთ კონკრეტული ფილიალი. პირველ შემთხვევაში, ჩვენ ვიღებთ root ელემენტს DocumentElement თვისების მეშვეობით, რომელიც აბრუნებს XMLDOMNode ტიპის ობიექტს. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ DocumentElement თვისება თითოეული ბავშვის ელემენტის შინაარსის მისაღებად:
Var Node: IXMLDOMNode; ფესვი: IXMLDOMElement; I: მთელი რიცხვი; ... Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;
ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს.
თუ ჩვენ გვაინტერესებს კონკრეტული ფილიალი ან ფილიალი პირველი შვილის ფილიალის ქვემოთ, შეგვიძლია გამოვიყენოთ NodeFromID მეთოდი ან XMLDOMDocument ობიექტის GetElementByTagName მეთოდი.
NodeFromID მეთოდი მოითხოვს უნიკალურ იდენტიფიკატორს, რომელიც განსაზღვრულია XML სქემაში ან დოკუმენტის ტიპის განსაზღვრაში (DTD) და აბრუნებს ფილიალს ამ იდენტიფიკატორით.
GetElementByTagName მეთოდი მოითხოვს სტრიქონის მითითებას კონკრეტული ელემენტით (ტეგი) და აბრუნებს ყველა ფილიალს ამ ელემენტით. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ ეს მეთოდი, რომ იპოვოთ ყველა შემსრულებელი ჩვენს CD-ROM დირექტორიაში:
კვანძები: IXMLDOMNodeList; კვანძი: IXMLDOMNode; ... კვანძები:= XMLDoc.GetElementsByTagName('ARTIST'); I:= 0-ისთვის Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;
ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს
გაითვალისწინეთ, რომ XMLDOMNode ობიექტის SelectNodes მეთოდი უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. მაგრამ უფრო მეტი ამის შესახებ ქვემოთ.
დოკუმენტის ფილიალი - XMLDOMNode ობიექტი
XMLDOMNode ობიექტი წარმოადგენს დოკუმენტის ფილიალს. ჩვენ უკვე შევხვდით ამ ობიექტს, როდესაც მივიღეთ დოკუმენტის ძირითადი ელემენტი:
Root:= XMLDoc.DocumentElement;
XML დოკუმენტის ფილიალის შესახებ ინფორმაციის მისაღებად, შეგიძლიათ გამოიყენოთ XMLDOMNode ობიექტის თვისებები (ცხრილი 1).
ფილიალში შენახულ მონაცემებზე წვდომისთვის, ჩვეულებრივ, იყენებთ NodeValue თვისებას (ხელმისაწვდომია ატრიბუტებისთვის, ტექსტის ტოტებისთვის, კომენტარებისთვის, დამუშავების ინსტრუქციებისთვის და CDATA სექციებისთვის), ტექსტის თვისებას, რომელიც აბრუნებს ფილიალის ტექსტურ შინაარსს, ან NodeTypedValue თვისებას. . თუმცა, ეს უკანასკნელი შეიძლება გამოყენებულ იქნას მხოლოდ აკრეფილი ელემენტების მქონე ტოტებისთვის.
დოკუმენტის ხეზე ნავიგაცია
XMLDOMNode ობიექტი გთავაზობთ დოკუმენტის ხეზე ნავიგაციის მრავალ გზას. მაგალითად, მშობლის ფილიალში წვდომისთვის გამოიყენება ParentNode თვისება (XMLDOMNode ტიპი), შვილობილი ფილიალების წვდომა ხდება ChildNodes (XMLDOMNodeList ტიპი), FirstChild და LastChild (XMLDOMNode ტიპის) თვისებებით და ა.შ. OwnerDocument თვისება აბრუნებს XMLDOMDocument ტიპის ობიექტს, რომელიც განსაზღვრავს თავად XML დოკუმენტს. ზემოთ ჩამოთვლილი თვისებები საშუალებას გაძლევთ მარტივად გადახვიდეთ დოკუმენტის ხეზე.
ახლა მოდით გადავხედოთ XML დოკუმენტის ყველა ფილიალს:
Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; თუ Node.HasChildNodes მაშინ GetChilds(Node,0); Დასასრული;
როგორც ზემოთ აღინიშნა, XMLDOMNode ობიექტის SelectNodes უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. გარდა ამისა, არსებობს SelectSingleNode მეთოდი, რომელიც აბრუნებს დოკუმენტის მხოლოდ პირველ ფილიალს. ორივე ეს მეთოდი საშუალებას გაძლევთ მიუთითოთ XSL შაბლონები ფილიალების მოსაძებნად.
მოდით გავიაროთ SelectNodes მეთოდის გამოყენების პროცესი, რათა მოვიძიოთ ყველა ფილიალი, რომელსაც აქვს CD ფილიალი და PRICE ქვეგანყოფილება:
Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');
CD-ის ფილიალის PRICE-ის ყველა ქვეგანყოფილება განთავსდება Nodes-ის კოლექციაში. XSL შაბლონების განხილვას ცოტა მოგვიანებით დავუბრუნდებით.
ბავშვთა ფილიალების მანიპულირება
ბავშვის ფილიალების მანიპულირებისთვის, ჩვენ შეგვიძლია გამოვიყენოთ XMLDOMNode ობიექტის მეთოდები (ცხრილი 2).
იმისათვის, რომ მთლიანად წაშალოთ პირველი დისკის ჩანაწერი, თქვენ უნდა გაუშვათ შემდეგი კოდი:
Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= მცდარი; XMLDoc.Load('C:\DATA\DATA.xml'); // მიიღეთ ძირეული ელემენტი Root:= XMLDoc.DocumentElement; კვანძი:= ფესვი; // პირველი შვილის ტოტის ამოღება Node.RemoveChild(Node.FirstChild);
გაითვალისწინეთ, რომ ამ მაგალითში ჩვენ ვშლით პირველი შვილის ფილიალს. როგორ ამოიღოთ პირველი ბავშვის ფილიალის პირველი ელემენტი, ნაჩვენებია ქვემოთ:
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);
ზემოთ მოყვანილ მაგალითში ჩვენ წავშალეთ არა პირველი ფილიალი
ახლა დავამატოთ ახალი ფილიალი. ქვემოთ მოცემულია კოდი, რომელიც გვიჩვენებს, თუ როგორ უნდა დაამატოთ ახალი მუსიკალური CD-ROM ჩანაწერი:
Var NewNode: IXMLDOMNode; ბავშვი: IXMLDOMNode; ... // შექმენით ახალი ფილიალი -
ზემოთ მოცემული კოდი გვიჩვენებს შემდეგი ნაბიჯების თანმიმდევრობას ახალი ფილიალის დასამატებლად:
- ახალი ფილიალის შექმნა CreateNode მეთოდის გამოყენებით:
- ელემენტის შექმნა CreateNode მეთოდის გამოყენებით;
- ფილიალში ელემენტის დამატება AppendChild მეთოდის გამოყენებით;
- ელემენტის მნიშვნელობის დაყენება Text თვისების მეშვეობით;
- ...გაიმეორეთ ყველა ელემენტისთვის.
- დოკუმენტში ახალი ფილიალის დამატება AppendChild მეთოდის გამოყენებით.
შეგახსენებთ, რომ AppendChild მეთოდი ამატებს ტოტს ხის ბოლოს. იმისათვის, რომ დაამატოთ ტოტი ხის კონკრეტულ ადგილას, უნდა გამოიყენოთ მეთოდი InsertBefore.
ფილიალის ნაკრები - XMLDOMNodeList ობიექტი
XMLNodeList ობიექტი შეიცავს ფილიალების სიას, რომლებიც შეიძლება აშენდეს SelectNodes ან GetElementsByTagName მეთოდების გამოყენებით, ან მიღებულ იქნას ChildNodes თვისებიდან.
ჩვენ უკვე განვიხილეთ ამ ობიექტის გამოყენება მაგალითში, რომელიც მოცემულია სექციაში "დოკუმენტის ხეზე ნავიგაცია". წარმოგიდგენთ რამდენიმე თეორიულ შენიშვნას.
სიაში ფილიალების რაოდენობა შეიძლება მივიღოთ Length ქონების ღირებულების სახით. ფილიალებს აქვთ ინდექსები 0-დან Length-1-მდე და თითოეული ცალკეული ფილიალი ხელმისაწვდომია Item array ელემენტის მეშვეობით შესაბამისი ინდექსით.
ფილიალების სიაში ნავიგაცია ასევე შეიძლება განხორციელდეს NextNode მეთოდის გამოყენებით, რომელიც აბრუნებს სიაში მომდევნო ფილიალს, ან Nil-ს, თუ მიმდინარე ფილიალი ბოლოა. სიის დასაწყისში დასაბრუნებლად გამოიძახეთ გადატვირთვის მეთოდი.
დოკუმენტების შექმნა და შენახვა
აქამდე ჩვენ განვიხილეთ, თუ როგორ შეგიძლიათ დაამატოთ ფილიალები და ელემენტები არსებულ XML დოკუმენტებში. ახლა მოდით შევქმნათ XML დოკუმენტი პირდაპირ ეთერში. პირველ რიგში, შეგახსენებთ, რომ დოკუმენტის ჩატვირთვა შესაძლებელია არა მხოლოდ URL-დან, არამედ ჩვეულებრივი სტრიქონიდან. ქვემოთ მოცემულია, თუ როგორ უნდა შექმნათ root ელემენტი, რომელიც შემდეგ შეიძლება გამოყენებულ იქნას სხვა ელემენტების დინამიურად ასაგებად (რაზეც ჩვენ უკვე განვიხილეთ ბავშვთა ფილიალების მანიპულირება განყოფილებაში):
Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; S: WideString; ... ს: = '
XML დოკუმენტის აგების შემდეგ, ჩვენ შევინახავთ მას ფაილში Save მეთოდის გამოყენებით. Მაგალითად:
XMLDoc.Save('C:\DATA\NEWCD.XML');
გარდა ფაილში შენახვისა, Save მეთოდი საშუალებას გაძლევთ შეინახოთ XML დოკუმენტი ახალ XMLDOMDocument ობიექტში. ამ შემთხვევაში დოკუმენტი მთლიანად დამუშავებულია და შედეგად, მოწმდება მისი სტრუქტურა და სინტაქსი. ქვემოთ მოცემულია, თუ როგორ შეინახოთ დოკუმენტი სხვა ობიექტში:
პროცედურა TForm1.Button2Click(Sender: TObject); var XMLDoc2: IXMLDOMDდოკუმენტი; დაწყება XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nil; დასასრული;
და ბოლოს, გაითვალისწინეთ, რომ Save მეთოდი ასევე გაძლევთ საშუალებას შეინახოთ XML დოკუმენტი სხვა COM ობიექტებში, რომლებიც მხარს უჭერენ IStream, IPersistStream ან IPersistStreamInit ინტერფეისებს.
XSL შაბლონების გამოყენება
XMLDOMNode ობიექტის SelectNodes მეთოდის განხილვისას აღვნიშნეთ, რომ ის უზრუნველყოფს დოკუმენტის ფილიალების წვდომის უფრო მოქნილ გზას. მოქნილობა მდგომარეობს იმაში, რომ ფილიალების შერჩევის კრიტერიუმად შეგიძლიათ მიუთითოთ XSL შაბლონი. ასეთი შაბლონები XML დოკუმენტებში ინფორმაციის ძიების მძლავრ მექანიზმს იძლევა. მაგალითად, ჩვენს კატალოგში არსებული ყველა მუსიკალური CD-ROM-ის სათაურის სიის მისაღებად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:
იმის გასარკვევად, თუ რომელი შემსრულებლის დისკები გამოუშვეს აშშ-ში, მოთხოვნა ყალიბდება შემდეგნაირად:
Nodes:= Root.SelectNodes('CD/ARTIST');
ქვემოთ მოცემულია, თუ როგორ უნდა იპოვოთ პირველი დისკი დირექტორიაში:
Nodes:= Root.SelectNodes('CD/TITLE');
და ბოლო:
Nodes:= Root.SelectNodes('CD/TITLE');
ბობ დილანის დისკების საპოვნელად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:
Nodes:= Root.SelectNodes('CD[$any$ ARTIST= "ბობ დილანი"]/TITLE');
და 1985 წლის შემდეგ გამოშვებული დისკების სიის მისაღებად, ჩვენ ვატარებთ შემდეგ შეკითხვას:
Nodes:= Root.SelectNodes('CD/TITLE');
XSL სინტაქსის უფრო დეტალური განხილვა მოითხოვს ცალკე პოსტს. მკითხველების დასაინტრიგებლად და შემდგომი კვლევის წახალისებისთვის, მე მოვიყვან მხოლოდ ერთ მცირე მაგალითს XSL-ის შესაძლო გამოყენების შესახებ. ვთქვათ, ჩვენ უნდა გადავიყვანოთ ჩვენი კატალოგი ჩვეულებრივ HTML ცხრილად. ტრადიციული მეთოდების გამოყენებით, ჩვენ უნდა გავიაროთ ხის ყველა ტოტი და შევქმნათ შესაბამისი ტეგები თითოეული მიღებული ელემენტისთვის
XSL-ის გამოყენებით, ჩვენ უბრალოდ ვქმნით შაბლონს (ან სტილის ფურცელს), რომელშიც მივუთითებთ რა და როგორ უნდა გადაკეთდეს. შემდეგ ამ შაბლონს გადავაფარებთ ჩვენს დირექტორიაში - და დავასრულეთ: გვაქვს XSL შაბლონის ტექსტი, რომელიც კატალოგს ცხრილად გარდაქმნის (განცხადება 2).
ჩვენს დირექტორიაში XSL შაბლონის გადაფარვის კოდი ასე გამოიყურება:
პროცედურა TForm1.Button2Click(Sender: TObject); var XSLDoc: IXMLDOMDდოკუმენტი; დაწყება XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Nil; დასასრული;
XSL-ის შესახებ ჩვენი განხილვის დასასრულს, უნდა ითქვას, რომ ამჟამად ეს ენა აქტიურად გამოიყენება სხვადასხვა XML დოკუმენტებს შორის ტრანსფორმაციისთვის, ასევე დოკუმენტის ფორმატირებისთვის.
დასკვნა
გასაგები მიზეზების გამო, შეუძლებელია Microsoft XML DOM-ის ყველა ობიექტის მიმოხილვა და მათი გამოყენების მაგალითების ერთ სტატიაში მოყვანა. აქ მხოლოდ აპლიკაციებში XML DOM-ის გამოყენების ძირითად საკითხებს შევეხეთ. მაგიდაზე სურათი 3 გვიჩვენებს Microsoft XML DOM-ში განხორციელებულ ყველა ობიექტს.
ComputerPress 12"2000წ
XML სულ უფრო ხშირად გამოიყენება ინფორმაციის შესანახად და აპლიკაციებსა და ვებსაიტებს შორის მისი გაცვლისთვის. ბევრი აპლიკაცია იყენებს ამ ენას, როგორც საბაზისო ენას მონაცემთა შესანახად, ზოგი კი იყენებს მას XML მონაცემების ექსპორტისა და იმპორტისთვის. ეს ნიშნავს, რომ დროა დეველოპერებმა იფიქრონ იმაზე, თუ როგორ შეუძლიათ გამოიყენონ XML მონაცემები საკუთარ აპლიკაციებში.
ამ სტატიაში განვიხილავთ XML Document Object Model-ს (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-ების დირექტორია, რომელსაც აქვს შემდეგი სტრუქტურა:
ახლა ჩვენ მზად ვართ დავიწყოთ 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;
იმის სანახავად, თუ რა ინფორმაცია დაბრუნდება შეცდომის შემთხვევაში, შევცვალოთ დირექტორიაში ჩანაწერი:
დახურვის ელემენტის ამოღება
ახლა მოდით დავწეროთ კოდი, რომელიც აბრუნებს XMLDOMParseError ობიექტის თვისებების მნიშვნელობებს:
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); Დასასრული;
და მოდით გავუშვათ ჩვენი აპლიკაცია. შედეგად, ჩვენ ვიღებთ შემდეგ ინფორმაციას შეცდომის შესახებ.
როგორც ზემოთ მოყვანილი მაგალითიდან ხედავთ, XMLDOMParseError ობიექტის მიერ დაბრუნებული ინფორმაცია სავსებით საკმარისია შეცდომის ლოკალიზაციისთვის და მისი წარმოშობის მიზეზის გასაგებად.
ახლა აღვადგინოთ დახურვის ელემენტი
დოკუმენტის ხეზე წვდომა
დოკუმენტის ხეზე წვდომისთვის შეგიძლიათ მიიღოთ root ელემენტი და შემდეგ გაიმეოროთ მისი შვილობილი ტოტებით, ან იპოვოთ კონკრეტული ფილიალი. პირველ შემთხვევაში, ჩვენ ვიღებთ root ელემენტს DocumentElement თვისების მეშვეობით, რომელიც აბრუნებს XMLDOMNode ტიპის ობიექტს. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ DocumentElement თვისება თითოეული ბავშვის ელემენტის შინაარსის მისაღებად:
Var Node: IXMLDOMNode; ფესვი: IXMLDOMElement; I: მთელი რიცხვი; ... Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;
ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს.
თუ ჩვენ გვაინტერესებს კონკრეტული ფილიალი ან ფილიალი პირველი შვილის ფილიალის ქვემოთ, შეგვიძლია გამოვიყენოთ NodeFromID მეთოდი ან XMLDOMDocument ობიექტის GetElementByTagName მეთოდი.
NodeFromID მეთოდი მოითხოვს უნიკალურ იდენტიფიკატორს, რომელიც განსაზღვრულია XML სქემაში ან დოკუმენტის ტიპის განსაზღვრაში (DTD) და აბრუნებს ფილიალს ამ იდენტიფიკატორით.
GetElementByTagName მეთოდი მოითხოვს სტრიქონის მითითებას კონკრეტული ელემენტით (ტეგი) და აბრუნებს ყველა ფილიალს ამ ელემენტით. ქვემოთ მოცემულია, თუ როგორ გამოვიყენოთ ეს მეთოდი, რომ იპოვოთ ყველა შემსრულებელი ჩვენს CD-ROM დირექტორიაში:
კვანძები: IXMLDOMNodeList; კვანძი: IXMLDOMNode; ... კვანძები:= XMLDoc.GetElementsByTagName('ARTIST'); I:= 0-ისთვის Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); Დასასრული;
ჩვენი XML დოკუმენტისთვის მივიღებთ შემდეგ ტექსტს
გაითვალისწინეთ, რომ XMLDOMNode ობიექტის SelectNodes მეთოდი უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. მაგრამ უფრო მეტი ამის შესახებ ქვემოთ.
დოკუმენტის ფილიალი - XMLDOMNode ობიექტი
XMLDOMNode ობიექტი წარმოადგენს დოკუმენტის ფილიალს. ჩვენ უკვე შევხვდით ამ ობიექტს, როდესაც მივიღეთ დოკუმენტის ძირითადი ელემენტი:
Root:= XMLDoc.DocumentElement;
XML დოკუმენტის ფილიალის შესახებ ინფორმაციის მისაღებად, შეგიძლიათ გამოიყენოთ XMLDOMNode ობიექტის თვისებები (ცხრილი 1).
ფილიალში შენახულ მონაცემებზე წვდომისთვის, ჩვეულებრივ, იყენებთ NodeValue თვისებას (ხელმისაწვდომია ატრიბუტებისთვის, ტექსტის ტოტებისთვის, კომენტარებისთვის, დამუშავების ინსტრუქციებისთვის და CDATA სექციებისთვის), ტექსტის თვისებას, რომელიც აბრუნებს ფილიალის ტექსტურ შინაარსს, ან NodeTypedValue თვისებას. . თუმცა, ეს უკანასკნელი შეიძლება გამოყენებულ იქნას მხოლოდ აკრეფილი ელემენტების მქონე ტოტებისთვის.
დოკუმენტის ხეზე ნავიგაცია
XMLDOMNode ობიექტი გთავაზობთ დოკუმენტის ხეზე ნავიგაციის მრავალ გზას. მაგალითად, მშობლის ფილიალში წვდომისთვის გამოიყენება ParentNode თვისება (XMLDOMNode ტიპი), შვილობილი ფილიალების წვდომა ხდება ChildNodes (XMLDOMNodeList ტიპი), FirstChild და LastChild (XMLDOMNode ტიპის) თვისებებით და ა.შ. OwnerDocument თვისება აბრუნებს XMLDOMDocument ტიპის ობიექტს, რომელიც განსაზღვრავს თავად XML დოკუმენტს. ზემოთ ჩამოთვლილი თვისებები საშუალებას გაძლევთ მარტივად გადახვიდეთ დოკუმენტის ხეზე.
ახლა მოდით გადავხედოთ XML დოკუმენტის ყველა ფილიალს:
Root:= XMLDoc.DocumentElement; I:= 0-სთვის Root.ChildNodes.Length-1-ისთვის დაიწყეთ Node:= Root.ChildNodes.Item[I]; თუ Node.HasChildNodes მაშინ GetChilds(Node,0); Დასასრული;
როგორც ზემოთ აღინიშნა, XMLDOMNode ობიექტის SelectNodes უზრუნველყოფს დოკუმენტის ფილიალებს წვდომის უფრო მოქნილ გზას. გარდა ამისა, არსებობს SelectSingleNode მეთოდი, რომელიც აბრუნებს დოკუმენტის მხოლოდ პირველ ფილიალს. ორივე ეს მეთოდი საშუალებას გაძლევთ მიუთითოთ XSL შაბლონები ფილიალების მოსაძებნად.
მოდით გავიაროთ SelectNodes მეთოდის გამოყენების პროცესი, რათა მოვიძიოთ ყველა ფილიალი, რომელსაც აქვს CD ფილიალი და PRICE ქვეგანყოფილება:
Root:= XMLDoc.DocumentElement; Nodes:= Root.SelectNodes('CD/PRICE');
CD-ის ფილიალის PRICE-ის ყველა ქვეგანყოფილება განთავსდება Nodes-ის კოლექციაში. XSL შაბლონების განხილვას ცოტა მოგვიანებით დავუბრუნდებით.
ბავშვთა ფილიალების მანიპულირება
ბავშვის ფილიალების მანიპულირებისთვის, ჩვენ შეგვიძლია გამოვიყენოთ XMLDOMNode ობიექტის მეთოდები (ცხრილი 2).
იმისათვის, რომ მთლიანად წაშალოთ პირველი დისკის ჩანაწერი, თქვენ უნდა გაუშვათ შემდეგი კოდი:
Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= მცდარი; XMLDoc.Load('C:\DATA\DATA.xml'); // მიიღეთ ძირეული ელემენტი Root:= XMLDoc.DocumentElement; კვანძი:= ფესვი; // პირველი შვილის ტოტის ამოღება Node.RemoveChild(Node.FirstChild);
გაითვალისწინეთ, რომ ამ მაგალითში ჩვენ ვშლით პირველი შვილის ფილიალს. როგორ ამოიღოთ პირველი ბავშვის ფილიალის პირველი ელემენტი, ნაჩვენებია ქვემოთ:
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);
ზემოთ მოყვანილ მაგალითში ჩვენ წავშალეთ არა პირველი ფილიალი
ახლა დავამატოთ ახალი ფილიალი. ქვემოთ მოცემულია კოდი, რომელიც გვიჩვენებს, თუ როგორ უნდა დაამატოთ ახალი მუსიკალური CD-ROM ჩანაწერი:
Var NewNode: IXMLDOMNode; ბავშვი: IXMLDOMNode; ... // შექმენით ახალი ფილიალი -
ზემოთ მოცემული კოდი გვიჩვენებს შემდეგი ნაბიჯების თანმიმდევრობას ახალი ფილიალის დასამატებლად:
- ახალი ფილიალის შექმნა CreateNode მეთოდის გამოყენებით:
- ელემენტის შექმნა CreateNode მეთოდის გამოყენებით;
- ფილიალში ელემენტის დამატება AppendChild მეთოდის გამოყენებით;
- ელემენტის მნიშვნელობის დაყენება Text თვისების მეშვეობით;
- ...გაიმეორეთ ყველა ელემენტისთვის.
- დოკუმენტში ახალი ფილიალის დამატება AppendChild მეთოდის გამოყენებით.
შეგახსენებთ, რომ AppendChild მეთოდი ამატებს ტოტს ხის ბოლოს. იმისათვის, რომ დაამატოთ ტოტი ხის კონკრეტულ ადგილას, უნდა გამოიყენოთ მეთოდი InsertBefore.
ფილიალის ნაკრები - XMLDOMNodeList ობიექტი
XMLNodeList ობიექტი შეიცავს ფილიალების სიას, რომლებიც შეიძლება აშენდეს SelectNodes ან GetElementsByTagName მეთოდების გამოყენებით, ან მიღებულ იქნას ChildNodes თვისებიდან.
ჩვენ უკვე განვიხილეთ ამ ობიექტის გამოყენება მაგალითში, რომელიც მოცემულია სექციაში "დოკუმენტის ხეზე ნავიგაცია". წარმოგიდგენთ რამდენიმე თეორიულ შენიშვნას.
სიაში ფილიალების რაოდენობა შეიძლება მივიღოთ Length ქონების ღირებულების სახით. ფილიალებს აქვთ ინდექსები 0-დან Length-1-მდე და თითოეული ცალკეული ფილიალი ხელმისაწვდომია Item array ელემენტის მეშვეობით შესაბამისი ინდექსით.
ფილიალების სიაში ნავიგაცია ასევე შეიძლება განხორციელდეს NextNode მეთოდის გამოყენებით, რომელიც აბრუნებს სიაში მომდევნო ფილიალს, ან Nil-ს, თუ მიმდინარე ფილიალი ბოლოა. სიის დასაწყისში დასაბრუნებლად გამოიძახეთ გადატვირთვის მეთოდი.
დოკუმენტების შექმნა და შენახვა
აქამდე ჩვენ განვიხილეთ, თუ როგორ შეგიძლიათ დაამატოთ ფილიალები და ელემენტები არსებულ XML დოკუმენტებში. ახლა მოდით შევქმნათ XML დოკუმენტი პირდაპირ ეთერში. პირველ რიგში, შეგახსენებთ, რომ დოკუმენტის ჩატვირთვა შესაძლებელია არა მხოლოდ URL-დან, არამედ ჩვეულებრივი სტრიქონიდან. ქვემოთ მოცემულია, თუ როგორ უნდა შექმნათ root ელემენტი, რომელიც შემდეგ შეიძლება გამოყენებულ იქნას სხვა ელემენტების დინამიურად ასაგებად (რაზეც ჩვენ უკვე განვიხილეთ ბავშვთა ფილიალების მანიპულირება განყოფილებაში):
Var XMLDoc: IXMLDOMDდოკუმენტი; ფესვი: IXMLDOMNode; კვანძი: IXMLDOMNode; S: WideString; ... ს: = '
XML დოკუმენტის აგების შემდეგ, ჩვენ შევინახავთ მას ფაილში Save მეთოდის გამოყენებით. Მაგალითად:
XMLDoc.Save('C:\DATA\NEWCD.XML');
გარდა ფაილში შენახვისა, Save მეთოდი საშუალებას გაძლევთ შეინახოთ XML დოკუმენტი ახალ XMLDOMDocument ობიექტში. ამ შემთხვევაში დოკუმენტი მთლიანად დამუშავებულია და შედეგად, მოწმდება მისი სტრუქტურა და სინტაქსი. ქვემოთ მოცემულია, თუ როგორ შეინახოთ დოკუმენტი სხვა ობიექტში:
პროცედურა TForm1.Button2Click(Sender: TObject); var XMLDoc2: IXMLDOMDდოკუმენტი; დაწყება XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save(XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Nil; დასასრული;
და ბოლოს, გაითვალისწინეთ, რომ Save მეთოდი ასევე გაძლევთ საშუალებას შეინახოთ XML დოკუმენტი სხვა COM ობიექტებში, რომლებიც მხარს უჭერენ IStream, IPersistStream ან IPersistStreamInit ინტერფეისებს.
XSL შაბლონების გამოყენება
XMLDOMNode ობიექტის SelectNodes მეთოდის განხილვისას აღვნიშნეთ, რომ ის უზრუნველყოფს დოკუმენტის ფილიალების წვდომის უფრო მოქნილ გზას. მოქნილობა მდგომარეობს იმაში, რომ ფილიალების შერჩევის კრიტერიუმად შეგიძლიათ მიუთითოთ XSL შაბლონი. ასეთი შაბლონები XML დოკუმენტებში ინფორმაციის ძიების მძლავრ მექანიზმს იძლევა. მაგალითად, ჩვენს კატალოგში არსებული ყველა მუსიკალური CD-ROM-ის სათაურის სიის მისაღებად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:
იმის გასარკვევად, თუ რომელი შემსრულებლის დისკები გამოუშვეს აშშ-ში, მოთხოვნა ყალიბდება შემდეგნაირად:
Nodes:= Root.SelectNodes('CD/ARTIST');
ქვემოთ მოცემულია, თუ როგორ უნდა იპოვოთ პირველი დისკი დირექტორიაში:
Nodes:= Root.SelectNodes('CD/TITLE');
და ბოლო:
Nodes:= Root.SelectNodes('CD/TITLE');
ბობ დილანის დისკების საპოვნელად, შეგიძლიათ განახორციელოთ შემდეგი მოთხოვნა:
Nodes:= Root.SelectNodes('CD[$any$ ARTIST= "ბობ დილანი"]/TITLE');
და 1985 წლის შემდეგ გამოშვებული დისკების სიის მისაღებად, ჩვენ ვატარებთ შემდეგ შეკითხვას:
Nodes:= Root.SelectNodes('CD/TITLE');
XSL სინტაქსის უფრო დეტალური განხილვა მოითხოვს ცალკე პოსტს. მკითხველების დასაინტრიგებლად და შემდგომი კვლევის წახალისებისთვის, მე მოვიყვან მხოლოდ ერთ მცირე მაგალითს XSL-ის შესაძლო გამოყენების შესახებ. ვთქვათ, ჩვენ უნდა გადავიყვანოთ ჩვენი კატალოგი ჩვეულებრივ HTML ცხრილად. ტრადიციული მეთოდების გამოყენებით, ჩვენ უნდა გავიაროთ ხის ყველა ტოტი და შევქმნათ შესაბამისი ტეგები თითოეული მიღებული ელემენტისთვის
XSL-ის გამოყენებით, ჩვენ უბრალოდ ვქმნით შაბლონს (ან სტილის ფურცელს), რომელშიც მივუთითებთ რა და როგორ უნდა გადაკეთდეს. შემდეგ ამ შაბლონს გადავაფარებთ ჩვენს დირექტორიაში - და დავასრულეთ: გვაქვს XSL შაბლონის ტექსტი, რომელიც კატალოგს ცხრილად გარდაქმნის (განცხადება 2).
ჩვენს დირექტორიაში XSL შაბლონის გადაფარვის კოდი ასე გამოიყურება:
პროცედურა TForm1.Button2Click(Sender: TObject); var XSLDoc: IXMLDOMDდოკუმენტი; დაწყება XSLDoc:= CoDOMDocument.Create; XSLDoc.Load('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Nil; დასასრული;
XSL-ის შესახებ ჩვენი განხილვის დასასრულს, უნდა ითქვას, რომ ამჟამად ეს ენა აქტიურად გამოიყენება სხვადასხვა XML დოკუმენტებს შორის ტრანსფორმაციისთვის, ასევე დოკუმენტის ფორმატირებისთვის.
დასკვნა
გასაგები მიზეზების გამო, შეუძლებელია Microsoft XML DOM-ის ყველა ობიექტის მიმოხილვა და მათი გამოყენების მაგალითების ერთ სტატიაში მოყვანა. აქ მხოლოდ აპლიკაციებში XML DOM-ის გამოყენების ძირითად საკითხებს შევეხეთ. მაგიდაზე სურათი 3 გვიჩვენებს Microsoft XML DOM-ში განხორციელებულ ყველა ობიექტს.
ComputerPress 12"2000წ
Გამარჯობა ყველას! რამდენიმე წელი ვწერდი Matlab-ზე და მერე გამიჩნდა სურვილი დამეწერა პროგრამა Delphi-ში.
მე უნდა ვისწავლო xml დოკუმენტებთან მუშაობა. ვმუშაობ RAD Stiduo XE3-ში. არსებობს TXMLDocument კომპონენტი, რომელიც ალბათ ცნობილია დელფის ბევრი პროგრამისტისთვის. როგორც ჩანს, მას ბევრი რამის გაკეთება შეუძლია. მაგრამ პრობლემა ის არის, რომ არ არსებობს მკაფიო დოკუმენტაცია და აღწერა. დახმარება RAD Studio-ში ნაგავია, რადგან იქ ნორმალური ინფორმაცია არ არის; მხოლოდ მწირი ინფორმაცია ზოგიერთი მეთოდისა და პროცედურების შესახებ, რომლებიც მიმოფანტულია გვერდებზე (მაგალითების ან სათანადო აღწერილობის გარეშე). მთელი ინტერნეტი მოვიძიე. ფორუმებზე ვიპოვე მხოლოდ თემები კონკრეტული პრობლემების გადაწყვეტით, სადაც კიდევ ერთი საათის განმავლობაში უნდა გამოიცნოთ რას აკეთებს ესა თუ ის ხაზი xml ფაილზე წვდომისას.
მე მჭირდება ხელმძღვანელობა xml-თან მუშაობისას გამოყენებული ძირითადი ფუნქციების, პროცედურების და მეთოდების შესახებ. სახელმძღვანელო, სახელმძღვანელო, აღწერა. ან თუნდაც "xml დელფში დუმებისთვის". Მაგალითად:
xml ფაილის გასახსნელად გამოიყენეთ XMLDocument1.LoadFromFile("filemane.xml") მეთოდი, სადაც ფაილის სახელი არის ფაილის სახელი.
IXMLNode ტიპის nodelist ცვლადი გამოიყენება სიის შესანახად ბავშვის ელემენტები. ამ სიის დასადგენად გამოიყენეთ Xmldocument1.DocumentElement მეთოდი (სადაც XMLDocument1 არის xml ფაილი, რომელიც განიხილება).
ბავშვის ელემენტის "element1" შინაარსის გამოსაკითხად გამოიყენება XMLDocument1.DocumentElement.ChildNodes["element1"].Text... მეთოდი.
და ამ სულისკვეთებით შემდგომში გამოყენებული ყველა მეთოდის, პროცედურისა და მონაცემთა ტიპების შესახებ.
სად ვიპოვო მსგავსი სახელმძღვანელოები/აღწერები? ვის შეუძლია დახმარება?
თუ თქვენ გჭირდებათ კონკრეტული დავალება, მე აღვწერ მას.
არსებობს xml დოკუმენტი, როგორიცაა:
რაღაც ტექსტი
რაღაც შეცდომის ტექსტი
სხვა შეცდომის ტექსტი
პროგრამის კოდში გვაქვს:
ვარ
...
მშობელი, შვილი1: IXMLNode;
დაიწყება
XMLDocument1.LoadFromFile("f:\filename.x ml");
XMLDocument1.Active:=true;
.
.
დასასრული
რა უნდა ისწავლოთ ამის გაკეთება:
(წინასწარ ბოდიშს ვიხდი, თუ არასწორად დავასახელებ xml დოკუმენტის კომპონენტებს)
1. მიიღეთ ძირეული ელემენტის სახელი (ჩვენს შემთხვევაში ltm), ასევე მისი ატრიბუტების სია (ვერსია, ტიპი) და მათი მნიშვნელობები ("1.0", "პარამეტრები").
2. მიიღეთ ელემენტების რაოდენობა, რომლებიც ფესვის შვილებია. ამ შემთხვევაში, არსებობს 7 მათგანი: templateFiles, ზომები, ცხელი წერტილი, ცხელი წერტილი, მონაცემები, მონაცემები, მონაცემები. მიიღეთ ელემენტების სახელები (ტეგები) (templateFiles, ზომები და ა.შ.). მას შემდეგ რაც მივიღე ელემენტების რაოდენობა და ვისწავლე მათი სახელების ამოღება, მე გავუშვებ ციკლს 0-დან თვლა-1-მდე და გავაკეთებ იმას, რაც მჭირდება.
3. მიიღეთ საჭირო ელემენტის ატრიბუტების რაოდენობა და სია. მაგალითად, ცხელი წერტილის ელემენტისთვის. სწორი პასუხი იქნება 4 ატრიბუტი. პირველი ცხელი წერტილის ელემენტისთვის ეს იქნება სახელი, სტილი, სცენა, ათ. მეორესთვის - იგივე, მხოლოდ ath ატრიბუტის ნაცვლად - rz ატრიბუტი.
გთხოვთ გაითვალისწინოთ, რომ ფაილში არის 2 ცხელი წერტილის ელემენტი, განსხვავებული ატრიბუტებით. აი, როგორ ვიმუშაოთ მათთან (თუ არსებობს 1-ზე მეტი ამავე სახელწოდების ელემენტი)?
მე მინდა ეს: ვიღებ საბავშვო ელემენტების სიას rel. ძირეულში (იხ. პუნქტი 2), მათში ვატარებ for loop-ს და ვპოულობ ცხელ წერტილების ელემენტებს, რომელთა სახელის პარამეტრი უდრის საჭიროს (თქვით „hs015_2“ - აუცილებლად იქნება ერთი ასეთი ელემენტი). არსებობს რაიმე გზა ამ პრობლემის გადასაჭრელად მარყუჟის გარეშე? ანუ, მიიღეთ სცენის ატრიბუტის მნიშვნელობა hotspot ელემენტისთვის, რომლის სახელი = "hs015_2"?
4. გააკეთეთ ზემოაღნიშნული კვანძებისა და ელემენტების მიმართ, რომლებიც ბავშვების შვილები არიან. ჩემს მაგალითში, კვანძი (და-ს შვილი და მშობელი.
თუ სწორად გავიგე, თქვენ უნდა როგორმე გადაიტანოთ კვანძის შინაარსი ტიპის ცვლადი IXMLNode და გააკეთეთ იგივე, რაც ნაბიჯები 1-3. Ისე?
5. თქვენ უნდა ისწავლოთ ზემოაღნიშნული პარამეტრების შეცვლა (დააყენეთ საკუთარი).
როგორც ჩანს, ჯერჯერობით ეს ყველაფერია. ამ ეტაპზე სინტაქსური სტრუქტურები ჩემთვის ყველაზე მნიშვნელოვანია.
ვინც იცის ეს თემა, გთხოვთ დაწეროთ სხვა სინტაქსური კონსტრუქციები ზემოთ აღწერილი კითხვების გადასაჭრელად (როგორ მივიღოთ ატრიბუტები, მათი რაოდენობა, ელემენტების რაოდენობა, მათი სახელები და ა.შ.). ახლა მთავარია სინტაქსის დაუფლება და ჩემს ალგორითმს მოგვიანებით განვახორციელებ. ყველას დიდი მადლობა წინასწარ!
P.S. მე ნამდვილად არ მინდა დავწერო ჩემი საკუთარი XML პარსერი ნულიდან მხოლოდ იმიტომ, რომ არსებულებს არ აქვთ ნორმალური აღწერა.