Delphi-ի շատ ծրագրավորողների համար կարգավորումների պահպանումը կապված է օգտագործման հետ INIֆայլեր ձեր ծրագրերում: Այս մեթոդի օգտագործումը քիչ թե շատ լուրջ նախագծերում պետք է խուսափել, քանի որ այն սահմանափակում է ճկունությունը, ինչը խոչընդոտում է ծրագրի հետագա ընդլայնմանը։ Հարկ է նշել, որ այս մոտեցումը բավականին տարածված է՝ շնորհիվ իր հեշտ օգտագործման և զարգացման միջավայրում ներկառուցված գործիքների առկայության:
Այնուամենայնիվ, ծրագրի պարամետրերը պահելու իդեալական տարբերակը կառուցվածքային է XMLֆայլեր։ Նրանց առավելությունն այն է, որ պարամետրերի քանակը կարող է չֆիքսվել: Սա ավելի լավ հասկանալու համար եկեք դիտարկենք կոնկրետ օրինակ:
USearch ծրագրում, երբ սեղմում եք մուտքի վրա, հայտնվում է համատեքստային մենյու, որտեղ ցուցադրվում է տարրերի ցանկը: Այս տարրերը հրամաններ են, որոնք իրենց հերթին բեռնվում են պարամետրերի ֆայլից: Եթե կարգավորումները պահվել են INIֆայլը, ծրագիրը կարող է պահպանել և բեռնել որոշակի թվով հրահանգներ, օրինակ՝ 10 կամ 50: Հենց որ ավելի մեծ արժեք պահանջվի, կոդը պետք է վերաշարադրվի և համապատասխանաբար վերակազմավորվի:
Մոտեցման ընդունումը օգտագործելով XMLֆայլեր, մենք կկարողանանք դինամիկ կերպով բեռնել բաժնի բոլոր պարամետրերը: Այս ամենի համար կոնֆիգուրացիայի ֆայլը կդառնա ավելի էլեգանտ՝ առանց պարամետրերի ավելորդ համարակալման: Այնուամենայնիվ, ստանդարտ միջոցներհետ աշխատելու համար XMLԴելֆիում ունեն բազմաթիվ թերություններ, ուստի խորհուրդ եմ տալիս օգտագործել ստանդարտ գրադարան MSXML. Այն սովորաբար ներառված է լռելյայն օպերացիոն համակարգեր Windows ընտանիք.
Միացնել MSXML, մենք պետք է ստեղծենք ինտերֆեյսի ֆայլ՝ բոլոր գործառույթների ցանկով՝ ներմուծելով այն COM սերվերից։ Ինչպես ներմուծել ինտերֆեյս, բավականին մանրամասն հոդվածներ են գրվել, բայց առաջարկում եմ ներբեռնել ֆայլը MSXML2_TLB.PASարդեն պատրաստ է օգտագործման: Ֆայլը ներբեռնելուց հետո դրեք այն ձեր նախագծի կողքին կամ գցեք այն Delphi միջավայրի lib թղթապանակում: Այսպիսով, բոլոր ստեղծված ծրագրերը կկարողանան օգտվել մոդուլից MSXML, դուք պարզապես պետք է ավելացնեք MSXML2_TLB տողը օգտագործման համար:
Պարզության համար դիտարկեք այս գրադարանի օգտագործման հետևյալ օրինակը.
LoadProcedureData; var XMLDoc՝ DODocument; Արմատը՝ IXMLDOMElement; սկսել XMLDoc:= CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Արմատ:= XMLDoc.DocumentElement; ShowMessage(Root.SelectSingleNode(«չափ/լայնություն»).Text); Արմատ:= զրոյական; XMLDoc:= զրոյական; վերջ;
Նախ, ստեղծվում է DODocument դասի օրինակ, այնուհետև settings.xml ֆայլի բովանդակությունը բեռնվում է հիշողության մեջ: Քանի որ ստանդարտի համաձայն ցանկացած XMLֆայլը պետք է պարունակի արմատային պիտակ (in այս դեպքը կազմաձևում), ապա մենք պետք է ստանանք այն՝ օգտագործելով ֆունկցիան Փաստաթղթի տարր. Այնուհետև ցուցադրվում է պիտակների միջև եղած բովանդակությունը
Այստեղ օգտագործվում է SelectSingleNode մեթոդը, որը որպես պարամետր վերցնում է տողը
Չնայած այն հանգամանքին, որ Դելֆիում XML-ի հետ աշխատելու թեման լայնորեն քննարկվել է ինտերնետում, այս թեմայի վերաբերյալ հարցեր հաճախ են ծագում բոլոր տեսակի ֆորումներում:
Ես արդեն տեղադրել եմ սա նույնպես, բայց ես կցանկանայի վերադառնալ XML ֆայլի արագ վերլուծության և տվյալների արդյունահանման իրական դեպքին, որը ես արեցի այսօր աշխատանքի ընթացքում: Ինձանից պահանջվեց ոչ ավելի, քան 5 րոպե՝ անհրաժեշտ տվյալները ստանալու համար։
Նախապատմություն. Այսօր անհրաժեշտ էր մշակել տվյալներ տեղադրված ծրագրերօգտատերերի համակարգիչների վրա (այո, այո, մենք հայտնաբերում ենք ծովահեններին :)): Տեխնիկական բաժինն ինձ տրամադրեց նման տեղեկատվություն, որը պատռված էր անկասկած օգտատերերից WMI-ի միջոցով ցանցի միջոցով: Ծրագիրը, որը նրանք օգտագործում էին, ստեղծում է հաշվետվություններ XML ձևաչափ. Համապատասխանաբար, նրանք ինձ բերեցին բավականին բարդ կառուցվածքով XML ֆայլերի մի լեռ, որտեղից ես պետք է հանեի միայն տեղադրված ծրագրային արտադրանքի անունը։ Բուժում . Մի քանի ֆայլ ձեռքով վերանայելուց հետո հասկացա, որ երկար ժամանակ չի պահանջվի ծերանալու համար, և որոշեցի մի փոքր փոխարկիչ գրել։ Գործարկելով Delphi-ն՝ ես ընտրեցի XML DataBinding օբյեկտը պահոցում և կերակրեցի նրան ֆայլերից մեկը: Ես լռելյայն թողեցի բոլոր կարգավորումներն ու պարամետրերը, և արդյունքում մոդուլ ձևավորեցի մեծ քանակությամբդասեր և միջերեսներ այս XML ֆայլի տարրերին մուտք գործելու համար: Ես երկար ժամանակ չէի սկսել զբաղվել դասարանի կառուցվածքով, անմիջապես անցա փոխարկիչ գրելուն։ Վահանակի նոր հավելվածում ես բավականին պարզ կոդ գրեցի.
XML2TXT ծրագիր;
օգտագործում է
ձևեր,
Դասեր, SysUtils,
SoftwareXML «SoftwareXML.pas»-ում;
ընթացակարգ CovertXML2Text;
var
softbase՝ IXMLSTDSoftwareType;
i: ամբողջ թիվ;
sr: TSearchRec;
CurDir:string;
ExportFile՝ TStringList;
սկսել
CurDir:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
եթե FindFirst(CurDir+"*.xml", faAnyFile, sr) = 0, ապա
կրկնել
ExportFile:= TStringList.Create;
softbase:= LoadSTDSoftware(Pchar(CurDir+sr.Name));
i:= 0-ի համար softbase.InstalledSoftware.source.software.Count - 1 անել
ExportFile.Add(softbase.InstalledSoftware.source.software[i].DisplayName);
ExportFile.Sort;
ExportFile.SaveToFile(CurDir + softbase.InstalledSoftware.Source.servername+".txt");
ExportFile.Free;
մինչև FindNext(sr) 0;
վերջ;
սկսել
Application.Initialize;
CovertXML2Text;
վերջ.
Արդյունքում ես ցանցի յուրաքանչյուր համակարգչի համար ստացա մեկ դասագիրք՝ տեղադրված ծրագրային ապահովման ցանկով։
Ես զգում եմ, որ այս օրենսգիրքը բացատրություններ կպահանջի։ Օրինակ, ինչու՞ ես օգտագործեցի Forms մոդուլը վահանակի հավելվածում և կանչեցի Application.Initialize; ընթացակարգը:
Իրականում ամեն ինչ պարզ է. սա փոքր հաքեր է, որը թույլ է տալիս օգտագործել XML Data Binding-ը կոնսոլային հավելվածում: Քանի որ այն համառորեն հրաժարվում էր դասի սկզբնավորել XML-ով աշխատելու համար: Ես դեռ չեմ պարզել իրական պատճառները. այսօր ժամանակը կարևոր էր, և ես 5 րոպեից 4-ը ծախսեցի այս սխալի դեմ պայքարելու համար: :) Կարծում եմ՝ հետո զբաղվեմ այս խնդրի հետ ու գրեմ, թե որն է իրական պատճառը։
Տարօրինակ softbase դասը ստեղծվել է XML ֆայլի հիման վրա. դա արմատային տարրի անունն էր, իսկ softbase.InstalledSoftware.source.software[i].DisplayName՝ պարզապես նավարկելով տեղադրված տարրերի միջով դեպի ցանկալիը և ստանալով դրա արժեքը:
Ահա թե ինչ տեսք ունի ամենաշատերից մեկը. արագ ուղիներաշխատել XML-ի հետ Դելֆիում:
XML-ն ավելի ու ավելի է օգտագործվում տեղեկատվության պահպանման և հավելվածների և վեբ կայքերի միջև փոխանակելու համար: Շատ հավելվածներում այս լեզուն օգտագործվում է որպես տվյալների պահպանման հիմնական լեզու, մյուսներում՝ XML տվյալների արտահանման և ներմուծման համար: Սրանից հետևում է, որ ժամանակն է, որ մշակողները մտածեն, թե XML տվյալները ինչպես կարող են օգտագործվել իրենց սեփական հավելվածներում։
Այս հոդվածում մենք կանդրադառնանք XML փաստաթղթի օբյեկտի մոդելին (DOM) և Microsoft-ի կողմից դրա ներդրմանը, Microsoft XML DOM-ին:
XML DOM-ը օբյեկտի մոդել է, որը մշակողին տրամադրում է XML ֆայլեր բեռնելու և շահարկելու համար նախատեսված օբյեկտներ: Օբյեկտի մոդելը բաղկացած է հետևյալ հիմնական օբյեկտներից. Այս օբյեկտներից յուրաքանչյուրը (բացառությամբ XMLDOMParseError-ի) պարունակում է հատկություններ և մեթոդներ, որոնք թույլ են տալիս տեղեկատվություն ստանալ օբյեկտի մասին, շահարկել օբյեկտի արժեքներն ու կառուցվածքը և նավարկել XML փաստաթղթի կառուցվածքը:
Դիտարկենք XML DOM-ի հիմնական օբյեկտները և բերենք Borland Delphi-ում դրանց օգտագործման որոշ օրինակներ:
Օգտագործելով XML DOM-ը Borland Delphi-ում
Microsoft XML DOM-ը Delphi հավելվածներում օգտագործելու համար ձեր նախագծում պետք է ներառեք համապատասխան տեսակի գրադարան: Դա անելու համար մենք կատարում ենք 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 API-ները թույլ են տալիս հավելվածներին անցնել փաստաթղթերի ծառի վրայով և շահարկել դրա ճյուղերը: Յուրաքանչյուր ճյուղ կարող է ունենալ որոշակի տեսակ (DOMNodeType), ըստ որի սահմանվում են ծնող և երեխա ճյուղերը։ XML փաստաթղթերի մեծ մասում դուք կգտնեք տարրի, հատկանիշի և տեքստի ճյուղեր: Հատկանիշները ճյուղերի հատուկ տեսակ են և մանկական ճյուղեր չեն: Հատկանիշները կառավարվում են: հատուկ մեթոդներ, տրամադրված XML DOM օբյեկտների կողմից:
Ի լրումն Համաշխարհային ցանցի կոնսորցիումի (W3C) առաջարկվող միջերեսների ներդրմանը, Microsoft XML DOM-ը պարունակում է մեթոդներ, որոնք աջակցում են XSL, XSL նախշեր, անունների տարածքներ և տվյալների տեսակներ: Օրինակ, SelectNodes մեթոդը թույլ է տալիս օգտագործել XSL Pattern Syntax՝ ճյուղեր գտնելու կոնկրետ համատեքստում, իսկ TransformNode մեթոդն աջակցում է XSL-ի օգտագործումը՝ փոխակերպումներ կատարելու համար:
Test XML փաստաթուղթ
Որպես XML փաստաթղթի օրինակ՝ վերցնենք երաժշտական CD-ROM գրացուցակը, որն ունի հետևյալ կառուցվածքը.
Այժմ մենք պատրաստ ենք սկսել դիտարկել XML DOM օբյեկտի մոդելը, որը մենք կսկսենք XMLDOMDdocument օբյեկտից:
XML փաստաթուղթ - XMLDOMDփաստաթղթի օբյեկտ
XML փաստաթղթի հետ աշխատանքը սկսվում է այն բեռնելուց: Դա անելու համար մենք օգտագործում ենք Load մեթոդը, որն ունի միայն մեկ պարամետր, որը սահմանում է բեռնվող փաստաթղթի URL-ը։ Տեղական սկավառակից ֆայլեր բեռնելիս նշվում է միայն ֆայլի ամբողջական անունը (այս դեպքում կարող է բաց թողնել file:/// արձանագրությունը): Եթե XML փաստաթուղթը պահվում է որպես տող, դուք պետք է օգտագործեք LoadXML մեթոդը փաստաթուղթը բեռնելու համար:
Փաստաթղթի բեռնման եղանակը վերահսկելու համար (սինխրոն կամ ասինխրոն), օգտագործեք Async հատկությունը: Լռելյայնորեն, այս հատկությունը սահմանված է True՝ ցույց տալու համար, որ փաստաթուղթը բեռնվում է ասինխրոն, և հսկողությունը վերադարձվում է հավելվածին՝ նախքան փաստաթղթի լրիվ բեռնումը: Հակառակ դեպքում, փաստաթուղթը բեռնվում է համաժամանակյա, այնուհետև դուք պետք է ստուգեք ReadyState հատկության արժեքը՝ տեսնելու համար՝ փաստաթուղթը բեռնվել է, թե ոչ: Դուք կարող եք նաև ստեղծել իրադարձությունների մշակիչ OnReadyStateChange իրադարձության համար, որը կստանա վերահսկողություն, երբ փոխվի ReadyState հատկության արժեքը:
Հետևյալը ցույց է տալիս, թե ինչպես կարելի է բեռնել XML փաստաթուղթ՝ օգտագործելով Load մեթոդը.
Օգտագործում է ... MSXML_TLB ... ընթացակարգը TForm1.Button1Click(Sender: TObject); var XMLDoc՝ IXMLDOMDփաստաթղթ; սկսել XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Սխալ; XMLDoc.Load ('C:\DATA\DATA.xml'); // // Ահա կոդը, որը շահարկում է // XML փաստաթուղթը և նրա ճյուղերը // XMLDoc:= Nil; վերջ;
Փաստաթուղթը բեռնվելուց հետո մենք կարող ենք մուտք գործել դրա հատկությունները: Օրինակ՝ NodeName հատկությունը կպարունակի #document արժեքը, NodeTypeString հատկությունը արժեքային փաստաթուղթը, իսկ URL հատկությունը՝ արժեքային ֆայլը:///C:/DATA/DATA.xml:
Սխալների մշակում
Առանձնահատուկ հետաքրքրություն են ներկայացնում այն հատկությունները, որոնք կապված են փաստաթղթի մշակման հետ, երբ այն բեռնվում է: Օրինակ, ParseError հատկությունը վերադարձնում է XMLDOMParseError օբյեկտ, որը պարունակում է տեղեկատվություն փաստաթղթի մշակման ժամանակ տեղի ունեցած սխալի մասին:
Սխալների մշակիչ գրելու համար կարող եք ավելացնել հետևյալ կոդը.
Var XMLE սխալ՝ IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Եթե XMLError.ErrorCode<>0 Այնուհետև // // Այստեղ մենք լուծում ենք սխալը // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Զուր;
Պարզելու համար, թե ինչ տեղեկատվություն է վերադարձվում սխալի դեպքում, փոխեք հետևյալ գրացուցակի մուտքը.
հեռացնել փակման տարրը
Այժմ եկեք գրենք կոդը, որը վերադարձնում է XMLDOMParseError օբյեկտի սեփականության արժեքները.
XMLError:= XMLDoc.ParseError; Եթե XMLError.ErrorCode<>0 Այնուհետև XMLError-ով Memo1.Lines-ը սկսում է Ավելացնել ('File:' + URL); Ավելացնել ('Code:' + IntToStr (ErrorCode)); Ավելացնել ('Սխալ:' + Պատճառ); Ավելացնել ('Text:' + SrcText); Ավելացնել ('Գիծ: ' + IntToStr(Գիծ)); Add('Position:' + IntToStr(LinePos)); վերջ Else Memo1.Lines.Add(XMLDoc.XML); վերջ;
և գործարկել մեր հավելվածը: Արդյունքում մենք ստանում ենք հետևյալ սխալի մասին տեղեկատվությունը.
Ինչպես տեսնում եք վերը նշված օրինակից, XMLDOMParseError օբյեկտի կողմից վերադարձված տեղեկատվությունը բավական է սխալը գտնելու և դրա առաջացման պատճառը հասկանալու համար:
Հիմա եկեք վերականգնենք փակման տարրը
Փաստաթղթերի ծառի մուտք
Փաստաթղթերի ծառին մուտք գործելու համար կարող եք կա՛մ ստանալ արմատային տարրը, այնուհետև կրկնել նրա մանկական ճյուղերը, կա՛մ գտնել որոշակի ճյուղ: Առաջին դեպքում մենք ստանում ենք արմատային տարրը DocumentElement հատկության միջոցով, որը վերադարձնում է XMLDOMNode տիպի օբյեկտ։ Հետևյալը ցույց է տալիս, թե ինչպես օգտագործել DocumentElement հատկությունը՝ յուրաքանչյուր երեխայի տարրի բովանդակությունը ստանալու համար.
VarNode՝ IXMLDOMNode; Արմատը՝ IXMLDOMElement; I: Ամբողջական թիվ; ... Արմատ:= XMLDoc.DocumentElement; For I:= 0 դեպի Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); վերջ;
Մեր XML փաստաթղթի համար մենք կստանանք հետևյալ տեքստը.
Եթե մեզ հետաքրքրում է կոնկրետ ճյուղ, կամ առաջին զավակի ճյուղից ցածր գտնվող ճյուղը, մենք կարող ենք օգտագործել կամ NodeFromID մեթոդը կամ XMLDOMDocument օբյեկտի GetElementByTagName մեթոդը:
NodeFromID մեթոդը պահանջում է եզակի նույնացուցիչ, որը նշված է XML Schema-ում կամ Document Type Definition-ում (DTD) և վերադարձնում է ճյուղն այդ նույնացուցիչով:
GetElementByTagName մեթոդը պահանջում է որոշակի տարրով տող (պիտակ) և վերադարձնում է այս տարրով բոլոր ճյուղերը: Հետևյալը ցույց է տալիս, թե ինչպես օգտագործել այս մեթոդը մեր CD-ROM գրացուցակի բոլոր նկարիչներին գտնելու համար.
Հանգույցներ՝ IXMLDOMNodeList; Հանգույց՝ IXMLDOMNode; ... Հանգույցներ:= XMLDoc.GetElementsByTagName('ARTIST'); For I:= 0 to Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); վերջ;
Մեր XML փաստաթղթի համար մենք կստանանք հետևյալ տեքստը
Նկատի ունեցեք, որ XMLDOMNode օբյեկտի SelectNodes մեթոդն ապահովում է փաստաթղթերի ճյուղեր մուտք գործելու ավելի ճկուն միջոց: Բայց դրա մասին ավելին ստորև:
Փաստաթղթի ճյուղ - XMLDOMNode օբյեկտ
XMLDOMNode օբյեկտը ներկայացնում է փաստաթղթի ճյուղ: Մենք արդեն հանդիպել ենք այս օբյեկտին, երբ ստացանք փաստաթղթի արմատային տարրը.
Արմատ:= XMLDoc.DocumentElement;
XML փաստաթղթի ճյուղի մասին տեղեկատվություն ստանալու համար կարող եք օգտագործել XMLDOMNode օբյեկտի հատկությունները (Աղյուսակ 1):
Մասնաճյուղում պահվող տվյալներ մուտք գործելու համար սովորաբար օգտագործվում է NodeValue հատկությունը (հասանելի է ատրիբուտների, տեքստային ճյուղերի, մեկնաբանությունների, մշակման հրահանգների և CDATA բաժինների համար), Text հատկությունը, որը վերադարձնում է մասնաճյուղի տեքստային բովանդակությունը, կամ NodeTypedValue հատկությունը։ . Վերջինս, սակայն, կարող է օգտագործվել միայն մուտքագրված տարրերով ճյուղերի համար։
Նավարկում փաստաթղթի ծառի վրա
XMLDOMNode օբյեկտը տրամադրում է փաստաթղթերի ծառի վրա նավարկելու բազմաթիվ եղանակներ: Օրինակ, ծնող մասնաճյուղը հասանելի է ParentNode հատկության միջոցով (XMLDOMNode տեսակ), մանկական ճյուղերը մուտք են գործում ChildNodes (XMLDOMNodeList տիպ), FirstChild և LastChild (XMLDOMNode տեսակի) հատկություններով և այլն: OwnerDocument հատկությունը վերադարձնում է XMLDOMDocument տիպի օբյեկտ, որը նույնականացնում է հենց XML փաստաթուղթը: Վերը թվարկված հատկությունները հեշտացնում են փաստաթղթերի ծառի նավարկությունը:
Այժմ եկեք կրկնենք XML փաստաթղթի բոլոր ճյուղերը.
Արմատ:= XMLDoc.DocumentElement; For I:= 0 դեպի Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Եթե Node.HasChildNodes Ապա GetChilds(Node,0); վերջ;
Ինչպես նշվեց վերևում, XMLDOMNode օբյեկտի SelectNodes-ն ապահովում է փաստաթղթերի ճյուղեր մուտք գործելու ավելի ճկուն միջոց: Բացի այդ, կա SelectSingleNode մեթոդ, որը վերադարձնում է փաստաթղթի միայն առաջին ճյուղը: Այս երկու մեթոդները թույլ են տալիս ճյուղեր գտնելու XSL ձևանմուշներ նշել:
Դիտարկենք SelectNodes մեթոդի կիրառման գործընթացը բոլոր ճյուղերը, որոնք ունեն CD մասնաճյուղ և PRICE ենթաճյուղ:
Արմատ:= XMLDoc.DocumentElement; Հանգույցներ:= 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 մեթոդի միջոցով;
- Տեքստ հատկության միջոցով տարրի արժեքը սահմանելը;
- ... կրկնել բոլոր տարրերի համար:
- Փաստաթղթում նոր մասնաճյուղ ավելացնելը AppendChild մեթոդով:
Հիշեցնենք, որ AppendChild մեթոդը ծառի վերջում ճյուղ է ավելացնում: Ծառի որոշակի վայրում ճյուղ ավելացնելու համար դուք պետք է օգտագործեք InsertBefore մեթոդը:
Մասնաճյուղերի հավաքածու - XMLDOMNodeList օբյեկտ
XMLNodeList օբյեկտը պարունակում է ճյուղերի ցանկ, որը կարող է կառուցվել SelectNodes կամ GetElementsByTagName մեթոդների միջոցով կամ վերցվել ChildNodes հատկությունից:
Մենք արդեն տեսել ենք այս օբյեկտի օգտագործումը «Փաստաթղթերի ծառի նավարկություն» բաժնում տրված օրինակում: Ներկայացնում ենք մի քանի տեսական դիտողություններ.
Ցանկի մասնաճյուղերի թիվը կարելի է ստանալ որպես Length հատկության արժեք: Մասնաճյուղերն ունեն ինդեքսներ 0-ից մինչև Length-1, և յուրաքանչյուր առանձին ճյուղ հասանելի է Item array տարրի միջոցով՝ համապատասխան ինդեքսով:
Շարժվելով ճյուղերի ցանկով կարող է իրականացվել նաև NextNode մեթոդը, որը վերադարձնում է ցուցակի հաջորդ ճյուղը, կամ Nil, եթե ընթացիկ ճյուղը վերջինն է: Ցանկի սկզբին վերադառնալու համար զանգահարեք «Վերականգնել» մեթոդը:
Ստեղծեք և պահպանեք փաստաթղթեր
Այսպիսով, մենք տեսանք, թե ինչպես կարող եք ճյուղեր և տարրեր ավելացնել առկա XML փաստաթղթերին: Այժմ եկեք ստեղծենք XML փաստաթուղթ անմիջապես: Նախ հիշեք, որ փաստաթուղթը կարելի է բեռնել ոչ միայն URL-ից, այլև սովորական տողից։ Հետևյալը ցույց է տալիս, թե ինչպես ստեղծել արմատային տարր, որն այնուհետև կարող է օգտագործվել մնացած տարրերը դինամիկ կերպով կառուցելու համար (որը մենք արդեն անդրադարձել ենք Մանիպուլյացիայի մանկական ճյուղերում).
Var XMLDoc՝ IXMLDOMDփաստաթղթ; Արմատը՝ IXMLDOMNode; Հանգույց՝ IXMLDOMNode; S: WideString; ...S:='
XML փաստաթուղթը կառուցելուց հետո մենք այն պահում ենք ֆայլում՝ օգտագործելով Save մեթոդը: Օրինակ:
XMLDoc.Save ('C:\DATA\NEWCD.XML');
Բացի ֆայլում պահելուց, Save մեթոդը թույլ է տալիս պահպանել XML փաստաթուղթը նոր XMLDOMDdocument օբյեկտում: Այս դեպքում փաստաթուղթն ամբողջությամբ մշակվում է, և արդյունքում ստուգվում է դրա կառուցվածքն ու շարահյուսությունը։ Հետևյալը ցույց է տալիս, թե ինչպես պահել փաստաթուղթը մեկ այլ օբյեկտում.
Ընթացակարգ TForm1.Button2Click(Ուղարկող՝ TObject); var XMLDoc2: IXMLDOMDփաստաթղթ; սկսել XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Զուր; վերջ;
Վերջապես, Save մեթոդը նաև թույլ է տալիս պահպանել XML փաստաթուղթը այլ COM օբյեկտներում, որոնք աջակցում են IStream, IPersistStream կամ IPersistStreamInit միջերեսները:
Օգտագործելով XSL կաղապարներ
XMLDOMNode օբյեկտի SelectNodes մեթոդը քննարկելիս մենք նշեցինք, որ այն ապահովում է փաստաթղթերի ճյուղեր մուտք գործելու ավելի ճկուն միջոց: Ճկունությունն այն է, որ դուք կարող եք նշել XSL կաղապարը որպես ճյուղեր ընտրելու չափանիշ: Նման ձևանմուշները հզոր մեխանիզմ են ապահովում XML փաստաթղթերում տեղեկատվություն գտնելու համար: Օրինակ, մեր կատալոգի բոլոր երաժշտական CD-ROM վերնագրերի ցանկը ստանալու համար մենք կարող ենք կատարել հետևյալ հարցումը.
Պարզելու համար, թե որ արտիստների ձայնասկավառակներն են թողարկվել ԱՄՆ-ում, հարցումը ձևավորվում է հետևյալ կերպ.
Հանգույցներ:= Root.SelectNodes('CD/ARTIST');
Հետևյալը ցույց է տալիս, թե ինչպես գտնել առաջին սկավառակը գրացուցակում.
Հանգույցներ:= Root.SelectNodes('CD/TITLE');
Եվ վերջին.
Հանգույցներ:= Root.SelectNodes('CD/TITLE');
Բոբ Դիլանի սկավառակները գտնելու համար կարող եք կատարել հետևյալ հարցումը.
Հանգույցներ:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');
և 1985 թվականից հետո թողարկված սկավառակների ցանկը ստանալու համար մենք կատարում ենք հետևյալ հարցումը.
Հանգույցներ:= Root.SelectNodes('CD/TITLE');
XSL շարահյուսության ավելի մանրամասն քննարկումը պահանջում է առանձին գրառում: Ընթերցողներին հետաքրքրելու և հետագա հետազոտությունները խրախուսելու համար ես միայն մեկ փոքր օրինակ կտամ XSL-ի հնարավոր օգտագործման մասին: Ենթադրենք, որ մենք պետք է մեր գրացուցակը վերածենք սովորական HTML աղյուսակի: Օգտագործելով ավանդական մեթոդները, մենք պետք է անցնենք ծառի բոլոր ճյուղերը և ձևավորենք համապատասխան պիտակներ ստացված յուրաքանչյուր տարրի համար:
Օգտագործելով XSL, մենք պարզապես ստեղծում ենք ձևանմուշ (կամ ոճի թերթիկ), որտեղ մենք նշում ենք, թե ինչ և ինչպես փոխակերպել: Այնուհետև մենք պարտադրում ենք այս ձևանմուշը մեր կատալոգում, և դուք պատրաստ եք. մենք ունենք XSL ձևանմուշի տեքստը, որը կատալոգը վերածում է աղյուսակի (Ցուցակ 2):
Մեր գրացուցակում XSL ձևանմուշը ծածկելու ծածկագիրը հետևյալն է.
Ընթացակարգ TForm1.Button2Click(Ուղարկող՝ TObject); var XSLDoc՝ IXMLDOMdocument; սկսել XSLDoc:= CoDOMDocument.Create; XSLDoc.Load ('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Զուր; վերջ;
Ավարտելով XSL-ի մեր քննարկումը, պետք է ասել, որ ներկայումս այս լեզուն ակտիվորեն օգտագործվում է տարբեր XML փաստաթղթերի միջև փոխակերպման, ինչպես նաև փաստաթղթերի ձևաչափման համար։
Եզրակացություն
Հասկանալի պատճառներով անհնար է մեկ հոդվածում լուսաբանել Microsoft XML DOM-ի բոլոր օբյեկտները և տալ դրանց օգտագործման օրինակներ։ Այստեղ մենք միայն անդրադարձել ենք հավելվածներում XML DOM-ի օգտագործման հիմնական խնդիրներին։ Աղյուսակում. Նկար 3-ում ներկայացված են Microsoft XML DOM-ում ներդրված բոլոր օբյեկտները:
ComputerPress 12"2000 թ
XML-ն ավելի ու ավելի է օգտագործվում տեղեկատվության պահպանման և հավելվածների և վեբ կայքերի միջև փոխանակելու համար: Շատ հավելվածներում այս լեզուն օգտագործվում է որպես տվյալների պահպանման հիմնական լեզու, մյուսներում՝ XML տվյալների արտահանման և ներմուծման համար: Սրանից հետևում է, որ ժամանակն է, որ մշակողները մտածեն, թե XML տվյալները ինչպես կարող են օգտագործվել իրենց սեփական հավելվածներում։
Այս հոդվածում մենք կանդրադառնանք XML փաստաթղթի օբյեկտի մոդելին (DOM) և Microsoft-ի կողմից դրա ներդրմանը, Microsoft XML DOM-ին:
XML DOM-ը օբյեկտի մոդել է, որը մշակողին տրամադրում է XML ֆայլեր բեռնելու և շահարկելու համար նախատեսված օբյեկտներ: Օբյեկտի մոդելը բաղկացած է հետևյալ հիմնական օբյեկտներից. Այս օբյեկտներից յուրաքանչյուրը (բացառությամբ XMLDOMParseError-ի) պարունակում է հատկություններ և մեթոդներ, որոնք թույլ են տալիս տեղեկատվություն ստանալ օբյեկտի մասին, շահարկել օբյեկտի արժեքներն ու կառուցվածքը և նավարկել XML փաստաթղթի կառուցվածքը:
Դիտարկենք XML DOM-ի հիմնական օբյեկտները և բերենք Borland Delphi-ում դրանց օգտագործման որոշ օրինակներ:
Օգտագործելով XML DOM-ը Borland Delphi-ում
Microsoft XML DOM-ը Delphi հավելվածներում օգտագործելու համար ձեր նախագծում պետք է ներառեք համապատասխան տեսակի գրադարան: Դա անելու համար մենք կատարում ենք 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 API-ները թույլ են տալիս հավելվածներին անցնել փաստաթղթերի ծառի վրայով և շահարկել դրա ճյուղերը: Յուրաքանչյուր ճյուղ կարող է ունենալ որոշակի տեսակ (DOMNodeType), ըստ որի սահմանվում են ծնող և երեխա ճյուղերը։ XML փաստաթղթերի մեծ մասում դուք կգտնեք տարրի, հատկանիշի և տեքստի ճյուղեր: Հատկանիշները ճյուղերի հատուկ տեսակ են և մանկական ճյուղեր չեն: Հատկանիշները շահարկվում են XML DOM օբյեկտների կողմից տրամադրված հատուկ մեթոդների միջոցով:
Ի լրումն Համաշխարհային ցանցի կոնսորցիումի (W3C) առաջարկվող միջերեսների ներդրմանը, Microsoft XML DOM-ը պարունակում է մեթոդներ, որոնք աջակցում են XSL, XSL նախշեր, անունների տարածքներ և տվյալների տեսակներ: Օրինակ, SelectNodes մեթոդը թույլ է տալիս օգտագործել XSL Pattern Syntax՝ ճյուղեր գտնելու կոնկրետ համատեքստում, իսկ TransformNode մեթոդն աջակցում է XSL-ի օգտագործումը՝ փոխակերպումներ կատարելու համար:
Test XML փաստաթուղթ
Որպես XML փաստաթղթի օրինակ՝ վերցնենք երաժշտական CD-ROM գրացուցակը, որն ունի հետևյալ կառուցվածքը.
Այժմ մենք պատրաստ ենք սկսել դիտարկել XML DOM օբյեկտի մոդելը, որը մենք կսկսենք XMLDOMDdocument օբյեկտից:
XML փաստաթուղթ - XMLDOMDփաստաթղթի օբյեկտ
XML փաստաթղթի հետ աշխատանքը սկսվում է այն բեռնելուց: Դա անելու համար մենք օգտագործում ենք Load մեթոդը, որն ունի միայն մեկ պարամետր, որը սահմանում է բեռնվող փաստաթղթի URL-ը։ Տեղական սկավառակից ֆայլեր բեռնելիս նշվում է միայն ֆայլի ամբողջական անունը (այս դեպքում կարող է բաց թողնել file:/// արձանագրությունը): Եթե XML փաստաթուղթը պահվում է որպես տող, դուք պետք է օգտագործեք LoadXML մեթոդը փաստաթուղթը բեռնելու համար:
Փաստաթղթի բեռնման եղանակը վերահսկելու համար (սինխրոն կամ ասինխրոն), օգտագործեք Async հատկությունը: Լռելյայնորեն, այս հատկությունը սահմանված է True՝ ցույց տալու համար, որ փաստաթուղթը բեռնվում է ասինխրոն, և հսկողությունը վերադարձվում է հավելվածին՝ նախքան փաստաթղթի լրիվ բեռնումը: Հակառակ դեպքում, փաստաթուղթը բեռնվում է համաժամանակյա, այնուհետև դուք պետք է ստուգեք ReadyState հատկության արժեքը՝ տեսնելու համար՝ փաստաթուղթը բեռնվել է, թե ոչ: Դուք կարող եք նաև ստեղծել իրադարձությունների մշակիչ OnReadyStateChange իրադարձության համար, որը կստանա վերահսկողություն, երբ փոխվի ReadyState հատկության արժեքը:
Հետևյալը ցույց է տալիս, թե ինչպես կարելի է բեռնել XML փաստաթուղթ՝ օգտագործելով Load մեթոդը.
Օգտագործում է ... MSXML_TLB ... ընթացակարգը TForm1.Button1Click(Sender: TObject); var XMLDoc՝ IXMLDOMDփաստաթղթ; սկսել XMLDoc:= CoDOMDocument.Create; XMLDoc.Async:= Սխալ; XMLDoc.Load ('C:\DATA\DATA.xml'); // // Ահա կոդը, որը շահարկում է // XML փաստաթուղթը և նրա ճյուղերը // XMLDoc:= Nil; վերջ;
Փաստաթուղթը բեռնվելուց հետո մենք կարող ենք մուտք գործել դրա հատկությունները: Օրինակ՝ NodeName հատկությունը կպարունակի #document արժեքը, NodeTypeString հատկությունը արժեքային փաստաթուղթը, իսկ URL հատկությունը՝ արժեքային ֆայլը:///C:/DATA/DATA.xml:
Սխալների մշակում
Առանձնահատուկ հետաքրքրություն են ներկայացնում այն հատկությունները, որոնք կապված են փաստաթղթի մշակման հետ, երբ այն բեռնվում է: Օրինակ, ParseError հատկությունը վերադարձնում է XMLDOMParseError օբյեկտ, որը պարունակում է տեղեկատվություն փաստաթղթի մշակման ժամանակ տեղի ունեցած սխալի մասին:
Սխալների մշակիչ գրելու համար կարող եք ավելացնել հետևյալ կոդը.
Var XMLE սխալ՝ IXMLDOMParseError; ... XMLDoc.Load('C:\DATA\DATA.xml'); XMLError:= XMLDoc.ParseError; Եթե XMLError.ErrorCode<>0 Այնուհետև // // Այստեղ մենք լուծում ենք սխալը // Else Memo1.Lines.Add(XMLDoc.XML); ... XMLDoc:= Զուր;
Պարզելու համար, թե ինչ տեղեկատվություն է վերադարձվում սխալի դեպքում, փոխեք հետևյալ գրացուցակի մուտքը.
հեռացնել փակման տարրը
Այժմ եկեք գրենք կոդը, որը վերադարձնում է XMLDOMParseError օբյեկտի սեփականության արժեքները.
XMLError:= XMLDoc.ParseError; Եթե XMLError.ErrorCode<>0 Այնուհետև XMLError-ով Memo1.Lines-ը սկսում է Ավելացնել ('File:' + URL); Ավելացնել ('Code:' + IntToStr (ErrorCode)); Ավելացնել ('Սխալ:' + Պատճառ); Ավելացնել ('Text:' + SrcText); Ավելացնել ('Գիծ: ' + IntToStr(Գիծ)); Add('Position:' + IntToStr(LinePos)); վերջ Else Memo1.Lines.Add(XMLDoc.XML); վերջ;
և գործարկել մեր հավելվածը: Արդյունքում մենք ստանում ենք հետևյալ սխալի մասին տեղեկատվությունը.
Ինչպես տեսնում եք վերը նշված օրինակից, XMLDOMParseError օբյեկտի կողմից վերադարձված տեղեկատվությունը բավական է սխալը գտնելու և դրա առաջացման պատճառը հասկանալու համար:
Հիմա եկեք վերականգնենք փակման տարրը
Փաստաթղթերի ծառի մուտք
Փաստաթղթերի ծառին մուտք գործելու համար կարող եք կա՛մ ստանալ արմատային տարրը, այնուհետև կրկնել նրա մանկական ճյուղերը, կա՛մ գտնել որոշակի ճյուղ: Առաջին դեպքում մենք ստանում ենք արմատային տարրը DocumentElement հատկության միջոցով, որը վերադարձնում է XMLDOMNode տիպի օբյեկտ։ Հետևյալը ցույց է տալիս, թե ինչպես օգտագործել DocumentElement հատկությունը՝ յուրաքանչյուր երեխայի տարրի բովանդակությունը ստանալու համար.
VarNode՝ IXMLDOMNode; Արմատը՝ IXMLDOMElement; I: Ամբողջական թիվ; ... Արմատ:= XMLDoc.DocumentElement; For I:= 0 դեպի Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Memo1.Lines.Add(Node.Text); վերջ;
Մեր XML փաստաթղթի համար մենք կստանանք հետևյալ տեքստը.
Եթե մեզ հետաքրքրում է կոնկրետ ճյուղ, կամ առաջին զավակի ճյուղից ցածր գտնվող ճյուղը, մենք կարող ենք օգտագործել կամ NodeFromID մեթոդը կամ XMLDOMDocument օբյեկտի GetElementByTagName մեթոդը:
NodeFromID մեթոդը պահանջում է եզակի նույնացուցիչ, որը նշված է XML Schema-ում կամ Document Type Definition-ում (DTD) և վերադարձնում է ճյուղն այդ նույնացուցիչով:
GetElementByTagName մեթոդը պահանջում է որոշակի տարրով տող (պիտակ) և վերադարձնում է այս տարրով բոլոր ճյուղերը: Հետևյալը ցույց է տալիս, թե ինչպես օգտագործել այս մեթոդը մեր CD-ROM գրացուցակի բոլոր նկարիչներին գտնելու համար.
Հանգույցներ՝ IXMLDOMNodeList; Հանգույց՝ IXMLDOMNode; ... Հանգույցներ:= XMLDoc.GetElementsByTagName('ARTIST'); For I:= 0 to Nodes.Length-1 do Begin Node:= Nodes.Item[I]; Memo1.Lines.Add(Node.Text); վերջ;
Մեր XML փաստաթղթի համար մենք կստանանք հետևյալ տեքստը
Նկատի ունեցեք, որ XMLDOMNode օբյեկտի SelectNodes մեթոդն ապահովում է փաստաթղթերի ճյուղեր մուտք գործելու ավելի ճկուն միջոց: Բայց դրա մասին ավելին ստորև:
Փաստաթղթի ճյուղ - XMLDOMNode օբյեկտ
XMLDOMNode օբյեկտը ներկայացնում է փաստաթղթի ճյուղ: Մենք արդեն հանդիպել ենք այս օբյեկտին, երբ ստացանք փաստաթղթի արմատային տարրը.
Արմատ:= XMLDoc.DocumentElement;
XML փաստաթղթի ճյուղի մասին տեղեկատվություն ստանալու համար կարող եք օգտագործել XMLDOMNode օբյեկտի հատկությունները (Աղյուսակ 1):
Մասնաճյուղում պահվող տվյալներ մուտք գործելու համար սովորաբար օգտագործվում է NodeValue հատկությունը (հասանելի է ատրիբուտների, տեքստային ճյուղերի, մեկնաբանությունների, մշակման հրահանգների և CDATA բաժինների համար), Text հատկությունը, որը վերադարձնում է մասնաճյուղի տեքստային բովանդակությունը, կամ NodeTypedValue հատկությունը։ . Վերջինս, սակայն, կարող է օգտագործվել միայն մուտքագրված տարրերով ճյուղերի համար։
Նավարկում փաստաթղթի ծառի վրա
XMLDOMNode օբյեկտը տրամադրում է փաստաթղթերի ծառի վրա նավարկելու բազմաթիվ եղանակներ: Օրինակ, ծնող մասնաճյուղը հասանելի է ParentNode հատկության միջոցով (XMLDOMNode տեսակ), մանկական ճյուղերը մուտք են գործում ChildNodes (XMLDOMNodeList տիպ), FirstChild և LastChild (XMLDOMNode տեսակի) հատկություններով և այլն: OwnerDocument հատկությունը վերադարձնում է XMLDOMDocument տիպի օբյեկտ, որը նույնականացնում է հենց XML փաստաթուղթը: Վերը թվարկված հատկությունները հեշտացնում են փաստաթղթերի ծառի նավարկությունը:
Այժմ եկեք կրկնենք XML փաստաթղթի բոլոր ճյուղերը.
Արմատ:= XMLDoc.DocumentElement; For I:= 0 դեպի Root.ChildNodes.Length-1 do Begin Node:= Root.ChildNodes.Item[I]; Եթե Node.HasChildNodes Ապա GetChilds(Node,0); վերջ;
Ինչպես նշվեց վերևում, XMLDOMNode օբյեկտի SelectNodes-ն ապահովում է փաստաթղթերի ճյուղեր մուտք գործելու ավելի ճկուն միջոց: Բացի այդ, կա SelectSingleNode մեթոդ, որը վերադարձնում է փաստաթղթի միայն առաջին ճյուղը: Այս երկու մեթոդները թույլ են տալիս ճյուղեր գտնելու XSL ձևանմուշներ նշել:
Դիտարկենք SelectNodes մեթոդի կիրառման գործընթացը բոլոր ճյուղերը, որոնք ունեն CD մասնաճյուղ և PRICE ենթաճյուղ:
Արմատ:= XMLDoc.DocumentElement; Հանգույցներ:= 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 մեթոդի միջոցով;
- Տեքստ հատկության միջոցով տարրի արժեքը սահմանելը;
- ... կրկնել բոլոր տարրերի համար:
- Փաստաթղթում նոր մասնաճյուղ ավելացնելը AppendChild մեթոդով:
Հիշեցնենք, որ AppendChild մեթոդը ծառի վերջում ճյուղ է ավելացնում: Ծառի որոշակի վայրում ճյուղ ավելացնելու համար դուք պետք է օգտագործեք InsertBefore մեթոդը:
Մասնաճյուղերի հավաքածու - XMLDOMNodeList օբյեկտ
XMLNodeList օբյեկտը պարունակում է ճյուղերի ցանկ, որը կարող է կառուցվել SelectNodes կամ GetElementsByTagName մեթոդների միջոցով կամ վերցվել ChildNodes հատկությունից:
Մենք արդեն տեսել ենք այս օբյեկտի օգտագործումը «Փաստաթղթերի ծառի նավարկություն» բաժնում տրված օրինակում: Ներկայացնում ենք մի քանի տեսական դիտողություններ.
Ցանկի մասնաճյուղերի թիվը կարելի է ստանալ որպես Length հատկության արժեք: Մասնաճյուղերն ունեն ինդեքսներ 0-ից մինչև Length-1, և յուրաքանչյուր առանձին ճյուղ հասանելի է Item array տարրի միջոցով՝ համապատասխան ինդեքսով:
Շարժվելով ճյուղերի ցանկով կարող է իրականացվել նաև NextNode մեթոդը, որը վերադարձնում է ցուցակի հաջորդ ճյուղը, կամ Nil, եթե ընթացիկ ճյուղը վերջինն է: Ցանկի սկզբին վերադառնալու համար զանգահարեք «Վերականգնել» մեթոդը:
Ստեղծեք և պահպանեք փաստաթղթեր
Այսպիսով, մենք տեսանք, թե ինչպես կարող եք ճյուղեր և տարրեր ավելացնել առկա XML փաստաթղթերին: Այժմ եկեք ստեղծենք XML փաստաթուղթ անմիջապես: Նախ հիշեք, որ փաստաթուղթը կարելի է բեռնել ոչ միայն URL-ից, այլև սովորական տողից։ Հետևյալը ցույց է տալիս, թե ինչպես ստեղծել արմատային տարր, որն այնուհետև կարող է օգտագործվել մնացած տարրերը դինամիկ կերպով կառուցելու համար (որը մենք արդեն անդրադարձել ենք Մանիպուլյացիայի մանկական ճյուղերում).
Var XMLDoc՝ IXMLDOMDփաստաթղթ; Արմատը՝ IXMLDOMNode; Հանգույց՝ IXMLDOMNode; S: WideString; ...S:='
XML փաստաթուղթը կառուցելուց հետո մենք այն պահում ենք ֆայլում՝ օգտագործելով Save մեթոդը: Օրինակ:
XMLDoc.Save ('C:\DATA\NEWCD.XML');
Բացի ֆայլում պահելուց, Save մեթոդը թույլ է տալիս պահպանել XML փաստաթուղթը նոր XMLDOMDdocument օբյեկտում: Այս դեպքում փաստաթուղթն ամբողջությամբ մշակվում է, և արդյունքում ստուգվում է դրա կառուցվածքն ու շարահյուսությունը։ Հետևյալը ցույց է տալիս, թե ինչպես պահել փաստաթուղթը մեկ այլ օբյեկտում.
Ընթացակարգ TForm1.Button2Click(Ուղարկող՝ TObject); var XMLDoc2: IXMLDOMDփաստաթղթ; սկսել XMLDoc2:= CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add(XMLDoc2.XML); ... XMLDoc2:= Զուր; վերջ;
Վերջապես, Save մեթոդը նաև թույլ է տալիս պահպանել XML փաստաթուղթը այլ COM օբյեկտներում, որոնք աջակցում են IStream, IPersistStream կամ IPersistStreamInit միջերեսները:
Օգտագործելով XSL կաղապարներ
XMLDOMNode օբյեկտի SelectNodes մեթոդը քննարկելիս մենք նշեցինք, որ այն ապահովում է փաստաթղթերի ճյուղեր մուտք գործելու ավելի ճկուն միջոց: Ճկունությունն այն է, որ դուք կարող եք նշել XSL կաղապարը որպես ճյուղեր ընտրելու չափանիշ: Նման ձևանմուշները հզոր մեխանիզմ են ապահովում XML փաստաթղթերում տեղեկատվություն գտնելու համար: Օրինակ, մեր կատալոգի բոլոր երաժշտական CD-ROM վերնագրերի ցանկը ստանալու համար մենք կարող ենք կատարել հետևյալ հարցումը.
Պարզելու համար, թե որ արտիստների ձայնասկավառակներն են թողարկվել ԱՄՆ-ում, հարցումը ձևավորվում է հետևյալ կերպ.
Հանգույցներ:= Root.SelectNodes('CD/ARTIST');
Հետևյալը ցույց է տալիս, թե ինչպես գտնել առաջին սկավառակը գրացուցակում.
Հանգույցներ:= Root.SelectNodes('CD/TITLE');
Եվ վերջին.
Հանգույցներ:= Root.SelectNodes('CD/TITLE');
Բոբ Դիլանի սկավառակները գտնելու համար կարող եք կատարել հետևյալ հարցումը.
Հանգույցներ:= Root.SelectNodes('CD[$any$ ARTIST="Bob Dylan"]/TITLE');
և 1985 թվականից հետո թողարկված սկավառակների ցանկը ստանալու համար մենք կատարում ենք հետևյալ հարցումը.
Հանգույցներ:= Root.SelectNodes('CD/TITLE');
XSL շարահյուսության ավելի մանրամասն քննարկումը պահանջում է առանձին գրառում: Ընթերցողներին հետաքրքրելու և հետագա հետազոտությունները խրախուսելու համար ես միայն մեկ փոքր օրինակ կտամ XSL-ի հնարավոր օգտագործման մասին: Ենթադրենք, որ մենք պետք է մեր գրացուցակը վերածենք սովորական HTML աղյուսակի: Օգտագործելով ավանդական մեթոդները, մենք պետք է անցնենք ծառի բոլոր ճյուղերը և ձևավորենք համապատասխան պիտակներ ստացված յուրաքանչյուր տարրի համար:
Օգտագործելով XSL, մենք պարզապես ստեղծում ենք ձևանմուշ (կամ ոճի թերթիկ), որտեղ մենք նշում ենք, թե ինչ և ինչպես փոխակերպել: Այնուհետև մենք պարտադրում ենք այս ձևանմուշը մեր կատալոգում, և դուք պատրաստ եք. մենք ունենք XSL ձևանմուշի տեքստը, որը կատալոգը վերածում է աղյուսակի (Ցուցակ 2):
Մեր գրացուցակում XSL ձևանմուշը ծածկելու ծածկագիրը հետևյալն է.
Ընթացակարգ TForm1.Button2Click(Ուղարկող՝ TObject); var XSLDoc՝ IXMLDOMdocument; սկսել XSLDoc:= CoDOMDocument.Create; XSLDoc.Load ('C:\DATA\DATA.xsl'); Memo2.Text:= XMLDoc.TransformNode(XSLDoc); XSLDoc:= Զուր; վերջ;
Ավարտելով XSL-ի մեր քննարկումը, պետք է ասել, որ ներկայումս այս լեզուն ակտիվորեն օգտագործվում է տարբեր XML փաստաթղթերի միջև փոխակերպման, ինչպես նաև փաստաթղթերի ձևաչափման համար։
Եզրակացություն
Հասկանալի պատճառներով անհնար է մեկ հոդվածում լուսաբանել Microsoft XML DOM-ի բոլոր օբյեկտները և տալ դրանց օգտագործման օրինակներ։ Այստեղ մենք միայն անդրադարձել ենք հավելվածներում XML DOM-ի օգտագործման հիմնական խնդիրներին։ Աղյուսակում. Նկար 3-ում ներկայացված են Microsoft XML DOM-ում ներդրված բոլոր օբյեկտները:
ComputerPress 12"2000 թ
Ես ողջունում եմ բոլորին! Մի քանի տարի գրել էի Matlab-ում, իսկ հետո անհամբեր էի Դելֆիում ծրագիր գրելու համար:
Ես պետք է սովորեմ, թե ինչպես աշխատել xml փաստաթղթերի հետ: Ես աշխատում եմ RAD Stiduo XE3-ում: Կա TXMLDocument բաղադրիչ, որը հավանաբար հայտնի է Delphi-ի շատ ծրագրավորողներին: Թվում է, թե նա շատ բան կարող է անել: Բայց խնդիրն այն է, որ դրա համար հստակ փաստաթղթավորում ու նկարագրություն չկա։ RAD Studio-ում օգնությունը աղբ է, քանի որ այնտեղ նորմալ տեղեկատվություն չկա; միայն չնչին օգնություն, որը սփռված է էջերում որոշ մեթոդների և ընթացակարգերի վերաբերյալ (առանց օրինակների և սովորական նկարագրության): Փորփրեց ամբողջ ինտերնետը: Ես ֆորումներում գտել եմ միայն կոնկրետ առաջադրանքներով թեմաներ, որտեղ պետք է մի ժամ էլ գուշակել, թե ինչ է անում այս կամ այն տողը, կապված xml ֆայլ մուտք գործելու հետ։
Ինձ նաև պետք է ուղեցույց xml-ի հետ աշխատելիս օգտագործվող հիմնական գործառույթների, ընթացակարգերի և մեթոդների վերաբերյալ: Դասագիրք, ձեռնարկ, նկարագրություն. Կամ գոնե «xml-ը Դելֆիում կեղծիքների համար»: Օրինակ:
Xml ֆայլ բացելու համար օգտագործեք XMLDocument1.LoadFromFile("filemane.xml") մեթոդը, որտեղ ֆայլի անունը ֆայլի անունն է:
IXMLNode տիպի nodelist փոփոխականն օգտագործվում է երեխայի տարրերի ցանկը պահելու համար: Այս ցանկը որոշելու համար օգտագործեք Xmldocument1.DocumentElement մեթոդը (որտեղ XMLDocument1-ը ուսումնասիրվող xml ֆայլն է):
«element1» մանկական տարրի բովանդակությունը հարցնելու համար օգտագործեք XMLDocument1.DocumentElement.ChildNodes[ «element1»].Text... մեթոդը:
և այս ոգով հետագա բոլոր կիրառական մեթոդների, ընթացակարգերի, տվյալների տեսակների մասին:
Որտեղ կարող եմ գտնել նման ձեռնարկներ/նկարագրություններ: Ո՞վ կարող է օգնել:
Եթե ձեզ կոնկրետ առաջադրանք է պետք, ես այն նկարագրելու եմ:
Ես ունեմ այսպիսի xml փաստաթուղթ.
որոշ տեքստ
որոշ սխալ տեքստ
Այլ սխալի տեքստ
Ծրագրի կոդում մենք ունենք.
var
...
ծնող, երեխա1՝ IXMLNode;
սկսել
XMLDocument1.LoadFromFile ("f:\filename.xml");
XMLDocument1.Active:=true;
.
.
վերջ
Այն, ինչ դուք պետք է սովորեք անել.
(Նախապես ներողություն եմ խնդրում, եթե սխալ եմ անվանել xml փաստաթղթի բաղադրիչները)
1. Ստացեք արմատային տարրի անունը (մեր դեպքում՝ ltm), ինչպես նաև դրա ատրիբուտների ցանկը (տարբերակ, տեսակ) և դրանց արժեքները («1.0», «պարամետրեր»):
2. Ստացեք այն տարրերի թիվը, որոնք արմատի երեխաներ են: Այս դեպքում դրանք 7-ն են՝ templateFiles, dimensions, hotspot, hotspot, data, data, data: Ստացեք տարրերի (պիտակների) անվանումները (templateFiles, չափերը և այլն): Էլեմենտների քանակը ստանալուց և դրանց անունները հանելուց սովորելուց հետո ես 0-ից պտտվելու եմ մինչև 1-ը և կանեմ այն, ինչ ինձ անհրաժեշտ է:
3. Ստացեք անհրաժեշտ տարրի ատրիբուտների թիվը և ցանկը: Օրինակ, թեժ կետի տարրի համար: Ճիշտ պատասխանը կլինի 4 հատկանիշ: Առաջին թեժ կետի տարրի համար դրանք կլինեն անունը, ոճը, տեսարանը, ath. Երկրորդի համար՝ նույնը, միայն ath հատկանիշի փոխարեն՝ rz հատկանիշը։
Նկատի ունեցեք, որ ֆայլում կա 2 hotspot տարր՝ տարբեր ատրիբուտներով: Ահա թե ինչպես աշխատել նրանց հետ (եթե կան 1-ից ավելի նույնանուն տարրեր):
Ես այդպես եմ ուզում. ես ստանում եմ մանկական տարրերի ցանկը rel-ում: դեպի արմատ մեկը (տե՛ս կետ 2), ես նրանց միջով մի օղակ եմ անցկացնում for-ով և գտնում եմ այն թեժ կետի տարրերը, որոնց անվան պարամետրը հավասար է պահանջվողին (ասենք «hs015_2» - անպայման կլինի այդպիսի մեկ տարր): Կա՞ որևէ միջոց այս հարցը լուծելու առանց օղակի: Այսինքն, ստանալ scena հատկանիշի արժեքը hotspot տարրի համար, որն ունի name = "hs015_2"?
4. Կատարեք վերը նշված հանգույցների և տարրերի նկատմամբ, որոնք երեխաների երեխաներ են: Իմ օրինակում հանգույց (և-ի երեխա և ծնող:
Եթե ես ճիշտ եմ հասկանում, պետք է ինչ-որ կերպ փոխանցել հանգույցի բովանդակությունը տեսակի փոփոխական IXMLNode և արեք նույնը, ինչ 1-3 պարբերություններում: Այսպիսով.
5. Դուք պետք է սովորեք, թե ինչպես փոխել վերը նշված պարամետրերը (սահմանել ձեր սեփականը):
Թվում է, թե առայժմ այսքանն է: Այս փուլում ինձ համար ամենակարեւորը շարահյուսական կոնստրուկցիաներն են։
Ում է պատկանում այս թեման, խնդրում եմ գրել այլ շարահյուսական կոնստրուկցիաներ վերը նշված հարցերը լուծելու համար (ինչպես ստանալ ատրիբուտներ, դրանց թիվը, տարրերի քանակը, դրանց անունները և այլն): Հիմա գլխավորը շարահյուսությանը տիրապետելն է, իսկ իմ ալգորիթմը հետագայում կիրագործեմ։ Կանխավ շատ շնորհակալություն բոլորին:
P.S. Ես իսկապես չէի ցանկանա զրոյից գրել իմ սեփական XML վերլուծիչը միայն այն պատճառով, որ գոյություն ունեցողների համար նորմալ նկարագրություն չկա: